1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2019 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "bdev_uring.h" 7 #include "spdk/rpc.h" 8 #include "spdk/util.h" 9 #include "spdk/string.h" 10 #include "spdk/log.h" 11 12 /* Structure to hold the parameters for this RPC method. */ 13 struct rpc_create_uring { 14 char *name; 15 char *filename; 16 uint32_t block_size; 17 struct spdk_uuid uuid; 18 }; 19 20 /* Free the allocated memory resource after the RPC handling. */ 21 static void 22 free_rpc_create_uring(struct rpc_create_uring *r) 23 { 24 free(r->name); 25 free(r->filename); 26 } 27 28 /* Structure to decode the input parameters for this RPC method. */ 29 static const struct spdk_json_object_decoder rpc_create_uring_decoders[] = { 30 {"name", offsetof(struct rpc_create_uring, name), spdk_json_decode_string}, 31 {"filename", offsetof(struct rpc_create_uring, filename), spdk_json_decode_string}, 32 {"block_size", offsetof(struct rpc_create_uring, block_size), spdk_json_decode_uint32, true}, 33 {"uuid", offsetof(struct rpc_create_uring, uuid), spdk_json_decode_uuid, true}, 34 }; 35 36 /* Decode the parameters for this RPC method and properly create the uring 37 * device. Error status returned in the failed cases. 38 */ 39 static void 40 rpc_bdev_uring_create(struct spdk_jsonrpc_request *request, 41 const struct spdk_json_val *params) 42 { 43 struct rpc_create_uring req = {}; 44 struct spdk_json_write_ctx *w; 45 struct spdk_bdev *bdev; 46 struct bdev_uring_opts opts = {}; 47 48 if (spdk_json_decode_object(params, rpc_create_uring_decoders, 49 SPDK_COUNTOF(rpc_create_uring_decoders), 50 &req)) { 51 SPDK_ERRLOG("spdk_json_decode_object failed\n"); 52 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 53 "spdk_json_decode_object failed"); 54 goto cleanup; 55 } 56 57 opts.block_size = req.block_size; 58 opts.filename = req.filename; 59 opts.name = req.name; 60 opts.uuid = req.uuid; 61 62 bdev = create_uring_bdev(&opts); 63 if (!bdev) { 64 SPDK_ERRLOG("Unable to create URING bdev from file %s\n", req.filename); 65 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 66 "Unable to create URING bdev."); 67 goto cleanup; 68 } 69 70 w = spdk_jsonrpc_begin_result(request); 71 spdk_json_write_string(w, req.name); 72 spdk_jsonrpc_end_result(request, w); 73 74 cleanup: 75 free_rpc_create_uring(&req); 76 } 77 SPDK_RPC_REGISTER("bdev_uring_create", rpc_bdev_uring_create, SPDK_RPC_RUNTIME) 78 79 struct rpc_rescan_uring { 80 char *name; 81 }; 82 83 static const struct spdk_json_object_decoder rpc_rescan_uring_decoders[] = { 84 {"name", offsetof(struct rpc_rescan_uring, name), spdk_json_decode_string}, 85 }; 86 87 static void 88 rpc_bdev_uring_rescan(struct spdk_jsonrpc_request *request, 89 const struct spdk_json_val *params) 90 { 91 struct rpc_rescan_uring req = {NULL}; 92 int bdeverrno; 93 94 if (spdk_json_decode_object(params, rpc_rescan_uring_decoders, 95 SPDK_COUNTOF(rpc_rescan_uring_decoders), 96 &req)) { 97 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 98 "spdk_json_decode_object failed"); 99 goto cleanup; 100 } 101 102 bdeverrno = bdev_uring_rescan(req.name); 103 if (bdeverrno) { 104 spdk_jsonrpc_send_error_response(request, bdeverrno, 105 spdk_strerror(-bdeverrno)); 106 goto cleanup; 107 } 108 109 spdk_jsonrpc_send_bool_response(request, true); 110 cleanup: 111 free(req.name); 112 } 113 SPDK_RPC_REGISTER("bdev_uring_rescan", rpc_bdev_uring_rescan, SPDK_RPC_RUNTIME) 114 115 struct rpc_delete_uring { 116 char *name; 117 }; 118 119 static void 120 free_rpc_delete_uring(struct rpc_delete_uring *req) 121 { 122 free(req->name); 123 } 124 125 static const struct spdk_json_object_decoder rpc_delete_uring_decoders[] = { 126 {"name", offsetof(struct rpc_delete_uring, name), spdk_json_decode_string}, 127 }; 128 129 static void 130 _rpc_bdev_uring_delete_cb(void *cb_arg, int bdeverrno) 131 { 132 struct spdk_jsonrpc_request *request = cb_arg; 133 134 if (bdeverrno == 0) { 135 spdk_jsonrpc_send_bool_response(request, true); 136 } else { 137 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 138 } 139 140 } 141 142 static void 143 rpc_bdev_uring_delete(struct spdk_jsonrpc_request *request, 144 const struct spdk_json_val *params) 145 { 146 struct rpc_delete_uring req = {NULL}; 147 148 if (spdk_json_decode_object(params, rpc_delete_uring_decoders, 149 SPDK_COUNTOF(rpc_delete_uring_decoders), 150 &req)) { 151 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 152 "spdk_json_decode_object failed"); 153 goto cleanup; 154 } 155 156 delete_uring_bdev(req.name, _rpc_bdev_uring_delete_cb, request); 157 158 cleanup: 159 free_rpc_delete_uring(&req); 160 } 161 SPDK_RPC_REGISTER("bdev_uring_delete", rpc_bdev_uring_delete, SPDK_RPC_RUNTIME) 162