1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) croit GmbH. 3 * Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 4 * All rights reserved. 5 */ 6 7 #include "bdev_daos.h" 8 #include "spdk/rpc.h" 9 #include "spdk/util.h" 10 #include "spdk/uuid.h" 11 #include "spdk/string.h" 12 #include "spdk/log.h" 13 14 struct rpc_construct_daos { 15 char *name; 16 struct spdk_uuid uuid; 17 char *pool; 18 char *cont; 19 char *oclass; 20 uint64_t num_blocks; 21 uint32_t block_size; 22 }; 23 24 static void 25 free_rpc_construct_daos(struct rpc_construct_daos *r) 26 { 27 free(r->name); 28 free(r->pool); 29 free(r->cont); 30 free(r->oclass); 31 } 32 33 static const struct spdk_json_object_decoder rpc_construct_daos_decoders[] = { 34 {"name", offsetof(struct rpc_construct_daos, name), spdk_json_decode_string}, 35 {"uuid", offsetof(struct rpc_construct_daos, uuid), spdk_json_decode_uuid, true}, 36 {"pool", offsetof(struct rpc_construct_daos, pool), spdk_json_decode_string}, 37 {"cont", offsetof(struct rpc_construct_daos, cont), spdk_json_decode_string}, 38 {"oclass", offsetof(struct rpc_construct_daos, oclass), spdk_json_decode_string, true}, 39 {"num_blocks", offsetof(struct rpc_construct_daos, num_blocks), spdk_json_decode_uint64}, 40 {"block_size", offsetof(struct rpc_construct_daos, block_size), spdk_json_decode_uint32}, 41 }; 42 43 static void 44 rpc_bdev_daos_create(struct spdk_jsonrpc_request *request, 45 const struct spdk_json_val *params) 46 { 47 struct rpc_construct_daos req = {NULL}; 48 struct spdk_json_write_ctx *w; 49 struct spdk_bdev *bdev; 50 int rc = 0; 51 52 if (spdk_json_decode_object(params, rpc_construct_daos_decoders, 53 SPDK_COUNTOF(rpc_construct_daos_decoders), 54 &req)) { 55 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 56 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 57 "spdk_json_decode_object failed"); 58 goto cleanup; 59 } 60 61 rc = create_bdev_daos(&bdev, req.name, &req.uuid, req.pool, req.cont, req.oclass, 62 req.num_blocks, req.block_size); 63 if (rc) { 64 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 65 goto cleanup; 66 } 67 68 free_rpc_construct_daos(&req); 69 70 w = spdk_jsonrpc_begin_result(request); 71 spdk_json_write_string(w, spdk_bdev_get_name(bdev)); 72 spdk_jsonrpc_end_result(request, w); 73 return; 74 75 cleanup: 76 free_rpc_construct_daos(&req); 77 } 78 SPDK_RPC_REGISTER("bdev_daos_create", rpc_bdev_daos_create, SPDK_RPC_RUNTIME) 79 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_create, construct_daos_bdev) 80 81 struct rpc_delete_daos { 82 char *name; 83 }; 84 85 static void 86 free_rpc_delete_daos(struct rpc_delete_daos *r) 87 { 88 free(r->name); 89 } 90 91 static const struct spdk_json_object_decoder rpc_delete_daos_decoders[] = { 92 {"name", offsetof(struct rpc_delete_daos, name), spdk_json_decode_string}, 93 }; 94 95 static void 96 rpc_bdev_daos_delete_cb(void *cb_arg, int bdeverrno) 97 { 98 struct spdk_jsonrpc_request *request = cb_arg; 99 100 if (bdeverrno == 0) { 101 spdk_jsonrpc_send_bool_response(request, true); 102 } else { 103 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 104 } 105 } 106 107 static void 108 rpc_bdev_daos_delete(struct spdk_jsonrpc_request *request, 109 const struct spdk_json_val *params) 110 { 111 struct rpc_delete_daos req = {NULL}; 112 113 if (spdk_json_decode_object(params, rpc_delete_daos_decoders, 114 SPDK_COUNTOF(rpc_delete_daos_decoders), 115 &req)) { 116 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 117 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 118 "spdk_json_decode_object failed"); 119 goto cleanup; 120 } 121 122 delete_bdev_daos(req.name, rpc_bdev_daos_delete_cb, request); 123 124 cleanup: 125 free_rpc_delete_daos(&req); 126 } 127 128 SPDK_RPC_REGISTER("bdev_daos_delete", rpc_bdev_daos_delete, SPDK_RPC_RUNTIME) 129 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_delete, delete_daos_bdev) 130 131 struct rpc_bdev_daos_resize { 132 char *name; 133 uint64_t new_size; 134 }; 135 136 static const struct spdk_json_object_decoder rpc_bdev_daos_resize_decoders[] = { 137 {"name", offsetof(struct rpc_bdev_daos_resize, name), spdk_json_decode_string}, 138 {"new_size", offsetof(struct rpc_bdev_daos_resize, new_size), spdk_json_decode_uint64} 139 }; 140 141 static void 142 free_rpc_bdev_daos_resize(struct rpc_bdev_daos_resize *req) 143 { 144 free(req->name); 145 } 146 147 static void 148 rpc_bdev_daos_resize(struct spdk_jsonrpc_request *request, 149 const struct spdk_json_val *params) 150 { 151 struct rpc_bdev_daos_resize req = {}; 152 int rc; 153 154 if (spdk_json_decode_object(params, rpc_bdev_daos_resize_decoders, 155 SPDK_COUNTOF(rpc_bdev_daos_resize_decoders), 156 &req)) { 157 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 158 "spdk_json_decode_object failed"); 159 goto cleanup; 160 } 161 162 rc = bdev_daos_resize(req.name, req.new_size); 163 if (rc) { 164 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 165 goto cleanup; 166 } 167 168 spdk_jsonrpc_send_bool_response(request, true); 169 cleanup: 170 free_rpc_bdev_daos_resize(&req); 171 } 172 SPDK_RPC_REGISTER("bdev_daos_resize", rpc_bdev_daos_resize, SPDK_RPC_RUNTIME) 173