1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2016 Intel Corporation. 307fe6a43SSeth Howell * All rights reserved. 407fe6a43SSeth Howell */ 507fe6a43SSeth Howell 607fe6a43SSeth Howell #include "bdev_aio.h" 707fe6a43SSeth Howell #include "spdk/rpc.h" 807fe6a43SSeth Howell #include "spdk/util.h" 907fe6a43SSeth Howell #include "spdk/string.h" 104e8e97c8STomasz Zawadzki #include "spdk/log.h" 1107fe6a43SSeth Howell 1207fe6a43SSeth Howell struct rpc_construct_aio { 1307fe6a43SSeth Howell char *name; 1407fe6a43SSeth Howell char *filename; 1507fe6a43SSeth Howell uint32_t block_size; 164c6a2e3dSYuhua bool readonly; 17648a5414Szhenwei pi bool fallocate; 18*e5693d68SMateusz Kozlowski struct spdk_uuid uuid; 1907fe6a43SSeth Howell }; 2007fe6a43SSeth Howell 2142c82595STomasz Zawadzki struct rpc_construct_aio_ctx { 2242c82595STomasz Zawadzki struct rpc_construct_aio req; 2342c82595STomasz Zawadzki struct spdk_jsonrpc_request *request; 2442c82595STomasz Zawadzki }; 2542c82595STomasz Zawadzki 2607fe6a43SSeth Howell static void 2742c82595STomasz Zawadzki free_rpc_construct_aio(struct rpc_construct_aio_ctx *ctx) 2807fe6a43SSeth Howell { 2942c82595STomasz Zawadzki free(ctx->req.name); 3042c82595STomasz Zawadzki free(ctx->req.filename); 3142c82595STomasz Zawadzki free(ctx); 3207fe6a43SSeth Howell } 3307fe6a43SSeth Howell 3407fe6a43SSeth Howell static const struct spdk_json_object_decoder rpc_construct_aio_decoders[] = { 3507fe6a43SSeth Howell {"name", offsetof(struct rpc_construct_aio, name), spdk_json_decode_string}, 3607fe6a43SSeth Howell {"filename", offsetof(struct rpc_construct_aio, filename), spdk_json_decode_string}, 3707fe6a43SSeth Howell {"block_size", offsetof(struct rpc_construct_aio, block_size), spdk_json_decode_uint32, true}, 384c6a2e3dSYuhua {"readonly", offsetof(struct rpc_construct_aio, readonly), spdk_json_decode_bool, true}, 39648a5414Szhenwei pi {"fallocate", offsetof(struct rpc_construct_aio, fallocate), spdk_json_decode_bool, true}, 40*e5693d68SMateusz Kozlowski {"uuid", offsetof(struct rpc_construct_aio, uuid), spdk_json_decode_uuid, true}, 4107fe6a43SSeth Howell }; 4207fe6a43SSeth Howell 4307fe6a43SSeth Howell static void 4442c82595STomasz Zawadzki rpc_bdev_aio_create_cb(void *cb_arg) 4542c82595STomasz Zawadzki { 4642c82595STomasz Zawadzki struct rpc_construct_aio_ctx *ctx = cb_arg; 4742c82595STomasz Zawadzki struct spdk_jsonrpc_request *request = ctx->request; 4842c82595STomasz Zawadzki struct spdk_json_write_ctx *w; 4942c82595STomasz Zawadzki 5042c82595STomasz Zawadzki w = spdk_jsonrpc_begin_result(request); 5142c82595STomasz Zawadzki spdk_json_write_string(w, ctx->req.name); 5242c82595STomasz Zawadzki spdk_jsonrpc_end_result(request, w); 5342c82595STomasz Zawadzki free_rpc_construct_aio(ctx); 5442c82595STomasz Zawadzki } 5542c82595STomasz Zawadzki 5642c82595STomasz Zawadzki static void 570668d53bSSeth Howell rpc_bdev_aio_create(struct spdk_jsonrpc_request *request, 5807fe6a43SSeth Howell const struct spdk_json_val *params) 5907fe6a43SSeth Howell { 6042c82595STomasz Zawadzki struct rpc_construct_aio_ctx *ctx; 6142c82595STomasz Zawadzki int rc; 6242c82595STomasz Zawadzki 6342c82595STomasz Zawadzki ctx = calloc(1, sizeof(*ctx)); 6442c82595STomasz Zawadzki if (!ctx) { 6542c82595STomasz Zawadzki spdk_jsonrpc_send_error_response(request, -ENOMEM, spdk_strerror(ENOMEM)); 6642c82595STomasz Zawadzki return; 6742c82595STomasz Zawadzki } 6807fe6a43SSeth Howell 6907fe6a43SSeth Howell if (spdk_json_decode_object(params, rpc_construct_aio_decoders, 7007fe6a43SSeth Howell SPDK_COUNTOF(rpc_construct_aio_decoders), 7142c82595STomasz Zawadzki &ctx->req)) { 7207fe6a43SSeth Howell SPDK_ERRLOG("spdk_json_decode_object failed\n"); 7307fe6a43SSeth Howell spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 7407fe6a43SSeth Howell "spdk_json_decode_object failed"); 7542c82595STomasz Zawadzki free_rpc_construct_aio(ctx); 7642c82595STomasz Zawadzki return; 7707fe6a43SSeth Howell } 7807fe6a43SSeth Howell 7942c82595STomasz Zawadzki ctx->request = request; 80648a5414Szhenwei pi rc = create_aio_bdev(ctx->req.name, ctx->req.filename, ctx->req.block_size, 81*e5693d68SMateusz Kozlowski ctx->req.readonly, ctx->req.fallocate, &ctx->req.uuid); 8207fe6a43SSeth Howell if (rc) { 8307fe6a43SSeth Howell spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 8442c82595STomasz Zawadzki free_rpc_construct_aio(ctx); 8542c82595STomasz Zawadzki return; 8607fe6a43SSeth Howell } 8707fe6a43SSeth Howell 8842c82595STomasz Zawadzki spdk_bdev_wait_for_examine(rpc_bdev_aio_create_cb, ctx); 8907fe6a43SSeth Howell } 900668d53bSSeth Howell SPDK_RPC_REGISTER("bdev_aio_create", rpc_bdev_aio_create, SPDK_RPC_RUNTIME) 9107fe6a43SSeth Howell 92b635d19aSshuochen0311 struct rpc_rescan_aio { 93b635d19aSshuochen0311 char *name; 94b635d19aSshuochen0311 }; 95b635d19aSshuochen0311 96b635d19aSshuochen0311 static const struct spdk_json_object_decoder rpc_rescan_aio_decoders[] = { 97b635d19aSshuochen0311 {"name", offsetof(struct rpc_rescan_aio, name), spdk_json_decode_string}, 98b635d19aSshuochen0311 }; 99b635d19aSshuochen0311 100b635d19aSshuochen0311 static void 101b635d19aSshuochen0311 rpc_bdev_aio_rescan(struct spdk_jsonrpc_request *request, 102b635d19aSshuochen0311 const struct spdk_json_val *params) 103b635d19aSshuochen0311 { 104b635d19aSshuochen0311 struct rpc_rescan_aio req = {NULL}; 105b635d19aSshuochen0311 int bdeverrno; 106b635d19aSshuochen0311 107b635d19aSshuochen0311 if (spdk_json_decode_object(params, rpc_rescan_aio_decoders, 108b635d19aSshuochen0311 SPDK_COUNTOF(rpc_rescan_aio_decoders), 109b635d19aSshuochen0311 &req)) { 110b635d19aSshuochen0311 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 111b635d19aSshuochen0311 "spdk_json_decode_object failed"); 112b635d19aSshuochen0311 goto cleanup; 113b635d19aSshuochen0311 } 114b635d19aSshuochen0311 115d77d3179SShuhei Matsumoto bdeverrno = bdev_aio_rescan(req.name); 11624605155SChuanwei Ji if (bdeverrno) { 11724605155SChuanwei Ji spdk_jsonrpc_send_error_response(request, bdeverrno, 11824605155SChuanwei Ji spdk_strerror(-bdeverrno)); 11924605155SChuanwei Ji goto cleanup; 12024605155SChuanwei Ji } 121b635d19aSshuochen0311 12224605155SChuanwei Ji spdk_jsonrpc_send_bool_response(request, true); 123b635d19aSshuochen0311 cleanup: 124b635d19aSshuochen0311 free(req.name); 125b635d19aSshuochen0311 } 126b635d19aSshuochen0311 SPDK_RPC_REGISTER("bdev_aio_rescan", rpc_bdev_aio_rescan, SPDK_RPC_RUNTIME) 127b635d19aSshuochen0311 12807fe6a43SSeth Howell struct rpc_delete_aio { 12907fe6a43SSeth Howell char *name; 13007fe6a43SSeth Howell }; 13107fe6a43SSeth Howell 13207fe6a43SSeth Howell static void 13307fe6a43SSeth Howell free_rpc_delete_aio(struct rpc_delete_aio *r) 13407fe6a43SSeth Howell { 13507fe6a43SSeth Howell free(r->name); 13607fe6a43SSeth Howell } 13707fe6a43SSeth Howell 13807fe6a43SSeth Howell static const struct spdk_json_object_decoder rpc_delete_aio_decoders[] = { 13907fe6a43SSeth Howell {"name", offsetof(struct rpc_delete_aio, name), spdk_json_decode_string}, 14007fe6a43SSeth Howell }; 14107fe6a43SSeth Howell 14207fe6a43SSeth Howell static void 1430668d53bSSeth Howell _rpc_bdev_aio_delete_cb(void *cb_arg, int bdeverrno) 14407fe6a43SSeth Howell { 14507fe6a43SSeth Howell struct spdk_jsonrpc_request *request = cb_arg; 14607fe6a43SSeth Howell 147d3e394aeSShuhei Matsumoto if (bdeverrno == 0) { 148d3e394aeSShuhei Matsumoto spdk_jsonrpc_send_bool_response(request, true); 149d3e394aeSShuhei Matsumoto } else { 150d3e394aeSShuhei Matsumoto spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 151d3e394aeSShuhei Matsumoto } 15207fe6a43SSeth Howell } 15307fe6a43SSeth Howell 15407fe6a43SSeth Howell static void 1550668d53bSSeth Howell rpc_bdev_aio_delete(struct spdk_jsonrpc_request *request, 15607fe6a43SSeth Howell const struct spdk_json_val *params) 15707fe6a43SSeth Howell { 15807fe6a43SSeth Howell struct rpc_delete_aio req = {NULL}; 15907fe6a43SSeth Howell 16007fe6a43SSeth Howell if (spdk_json_decode_object(params, rpc_delete_aio_decoders, 16107fe6a43SSeth Howell SPDK_COUNTOF(rpc_delete_aio_decoders), 16207fe6a43SSeth Howell &req)) { 16307fe6a43SSeth Howell spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 16407fe6a43SSeth Howell "spdk_json_decode_object failed"); 16507fe6a43SSeth Howell goto cleanup; 16607fe6a43SSeth Howell } 16707fe6a43SSeth Howell 1684573e4ccSShuhei Matsumoto bdev_aio_delete(req.name, _rpc_bdev_aio_delete_cb, request); 16907fe6a43SSeth Howell 17007fe6a43SSeth Howell cleanup: 17107fe6a43SSeth Howell free_rpc_delete_aio(&req); 17207fe6a43SSeth Howell } 1730668d53bSSeth Howell SPDK_RPC_REGISTER("bdev_aio_delete", rpc_bdev_aio_delete, SPDK_RPC_RUNTIME) 174