1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) Samsung Electronics Co., Ltd. 3 * Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 4 * All rights reserved. 5 */ 6 7 #include "bdev_xnvme.h" 8 #include "spdk/rpc.h" 9 #include "spdk/util.h" 10 #include "spdk/string.h" 11 #include "spdk/log.h" 12 13 /* Structure to hold the parameters for this RPC method. */ 14 struct rpc_create_xnvme { 15 char *name; 16 char *filename; 17 char *io_mechanism; 18 bool conserve_cpu; 19 }; 20 21 /* Free the allocated memory resource after the RPC handling. */ 22 static void 23 free_rpc_create_xnvme(struct rpc_create_xnvme *r) 24 { 25 free(r->name); 26 free(r->filename); 27 free(r->io_mechanism); 28 } 29 30 /* Structure to decode the input parameters for this RPC method. */ 31 static const struct spdk_json_object_decoder rpc_create_xnvme_decoders[] = { 32 {"name", offsetof(struct rpc_create_xnvme, name), spdk_json_decode_string}, 33 {"filename", offsetof(struct rpc_create_xnvme, filename), spdk_json_decode_string}, 34 {"io_mechanism", offsetof(struct rpc_create_xnvme, io_mechanism), spdk_json_decode_string}, 35 {"conserve_cpu", offsetof(struct rpc_create_xnvme, conserve_cpu), spdk_json_decode_bool, true}, 36 }; 37 38 /* Decode the parameters for this RPC method and properly create the xnvme 39 * device. Error status returned in the failed cases. 40 */ 41 static void 42 rpc_bdev_xnvme_create(struct spdk_jsonrpc_request *request, 43 const struct spdk_json_val *params) 44 { 45 struct rpc_create_xnvme req = {}; 46 struct spdk_json_write_ctx *w; 47 struct spdk_bdev *bdev; 48 49 if (spdk_json_decode_object(params, rpc_create_xnvme_decoders, 50 SPDK_COUNTOF(rpc_create_xnvme_decoders), 51 &req)) { 52 SPDK_ERRLOG("spdk_json_decode_object failed\n"); 53 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 54 "spdk_json_decode_object failed"); 55 goto cleanup; 56 } 57 58 bdev = create_xnvme_bdev(req.name, req.filename, req.io_mechanism, req.conserve_cpu); 59 if (!bdev) { 60 SPDK_ERRLOG("Unable to create xNVMe bdev from file %s\n", req.filename); 61 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 62 "Unable to create xNVMe bdev."); 63 goto cleanup; 64 } 65 66 w = spdk_jsonrpc_begin_result(request); 67 spdk_json_write_string(w, req.name); 68 spdk_jsonrpc_end_result(request, w); 69 70 cleanup: 71 free_rpc_create_xnvme(&req); 72 } 73 SPDK_RPC_REGISTER("bdev_xnvme_create", rpc_bdev_xnvme_create, SPDK_RPC_RUNTIME) 74 75 struct rpc_delete_xnvme { 76 char *name; 77 }; 78 79 static void 80 free_rpc_delete_xnvme(struct rpc_delete_xnvme *req) 81 { 82 free(req->name); 83 } 84 85 static const struct spdk_json_object_decoder rpc_delete_xnvme_decoders[] = { 86 {"name", offsetof(struct rpc_delete_xnvme, name), spdk_json_decode_string}, 87 }; 88 89 static void 90 _rpc_bdev_xnvme_delete_cb(void *cb_arg, int bdeverrno) 91 { 92 struct spdk_jsonrpc_request *request = cb_arg; 93 94 if (bdeverrno == 0) { 95 spdk_jsonrpc_send_bool_response(request, true); 96 } else { 97 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 98 } 99 } 100 101 static void 102 rpc_bdev_xnvme_delete(struct spdk_jsonrpc_request *request, 103 const struct spdk_json_val *params) 104 { 105 struct rpc_delete_xnvme req = {NULL}; 106 107 if (spdk_json_decode_object(params, rpc_delete_xnvme_decoders, 108 SPDK_COUNTOF(rpc_delete_xnvme_decoders), 109 &req)) { 110 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 111 "spdk_json_decode_object failed"); 112 goto cleanup; 113 } 114 115 delete_xnvme_bdev(req.name, _rpc_bdev_xnvme_delete_cb, request); 116 117 cleanup: 118 free_rpc_delete_xnvme(&req); 119 } 120 SPDK_RPC_REGISTER("bdev_xnvme_delete", rpc_bdev_xnvme_delete, SPDK_RPC_RUNTIME) 121