1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 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 }; 18 19 /* Free the allocated memory resource after the RPC handling. */ 20 static void 21 free_rpc_create_uring(struct rpc_create_uring *r) 22 { 23 free(r->name); 24 free(r->filename); 25 } 26 27 /* Structure to decode the input parameters for this RPC method. */ 28 static const struct spdk_json_object_decoder rpc_create_uring_decoders[] = { 29 {"name", offsetof(struct rpc_create_uring, name), spdk_json_decode_string}, 30 {"filename", offsetof(struct rpc_create_uring, filename), spdk_json_decode_string}, 31 {"block_size", offsetof(struct rpc_create_uring, block_size), spdk_json_decode_uint32, true}, 32 }; 33 34 /* Decode the parameters for this RPC method and properly create the uring 35 * device. Error status returned in the failed cases. 36 */ 37 static void 38 rpc_bdev_uring_create(struct spdk_jsonrpc_request *request, 39 const struct spdk_json_val *params) 40 { 41 struct rpc_create_uring req = {}; 42 struct spdk_json_write_ctx *w; 43 struct spdk_bdev *bdev; 44 45 if (spdk_json_decode_object(params, rpc_create_uring_decoders, 46 SPDK_COUNTOF(rpc_create_uring_decoders), 47 &req)) { 48 SPDK_ERRLOG("spdk_json_decode_object failed\n"); 49 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 50 "spdk_json_decode_object failed"); 51 goto cleanup; 52 } 53 54 bdev = create_uring_bdev(req.name, req.filename, req.block_size); 55 if (!bdev) { 56 SPDK_ERRLOG("Unable to create URING bdev from file %s\n", req.filename); 57 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 58 "Unable to create URING bdev."); 59 goto cleanup; 60 } 61 62 w = spdk_jsonrpc_begin_result(request); 63 spdk_json_write_string(w, req.name); 64 spdk_jsonrpc_end_result(request, w); 65 66 cleanup: 67 free_rpc_create_uring(&req); 68 } 69 SPDK_RPC_REGISTER("bdev_uring_create", rpc_bdev_uring_create, SPDK_RPC_RUNTIME) 70 71 struct rpc_delete_uring { 72 char *name; 73 }; 74 75 static void 76 free_rpc_delete_uring(struct rpc_delete_uring *req) 77 { 78 free(req->name); 79 } 80 81 static const struct spdk_json_object_decoder rpc_delete_uring_decoders[] = { 82 {"name", offsetof(struct rpc_delete_uring, name), spdk_json_decode_string}, 83 }; 84 85 static void 86 _rpc_bdev_uring_delete_cb(void *cb_arg, int bdeverrno) 87 { 88 struct spdk_jsonrpc_request *request = cb_arg; 89 90 if (bdeverrno == 0) { 91 spdk_jsonrpc_send_bool_response(request, true); 92 } else { 93 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 94 } 95 96 } 97 98 static void 99 rpc_bdev_uring_delete(struct spdk_jsonrpc_request *request, 100 const struct spdk_json_val *params) 101 { 102 struct rpc_delete_uring req = {NULL}; 103 104 if (spdk_json_decode_object(params, rpc_delete_uring_decoders, 105 SPDK_COUNTOF(rpc_delete_uring_decoders), 106 &req)) { 107 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 108 "spdk_json_decode_object failed"); 109 goto cleanup; 110 } 111 112 delete_uring_bdev(req.name, _rpc_bdev_uring_delete_cb, request); 113 114 cleanup: 115 free_rpc_delete_uring(&req); 116 } 117 SPDK_RPC_REGISTER("bdev_uring_delete", rpc_bdev_uring_delete, SPDK_RPC_RUNTIME) 118