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 char *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->uuid); 29 free(r->pool); 30 free(r->cont); 31 free(r->oclass); 32 } 33 34 static const struct spdk_json_object_decoder rpc_construct_daos_decoders[] = { 35 {"name", offsetof(struct rpc_construct_daos, name), spdk_json_decode_string}, 36 {"uuid", offsetof(struct rpc_construct_daos, uuid), spdk_json_decode_string, true}, 37 {"pool", offsetof(struct rpc_construct_daos, pool), spdk_json_decode_string}, 38 {"cont", offsetof(struct rpc_construct_daos, cont), spdk_json_decode_string}, 39 {"oclass", offsetof(struct rpc_construct_daos, oclass), spdk_json_decode_string, true}, 40 {"num_blocks", offsetof(struct rpc_construct_daos, num_blocks), spdk_json_decode_uint64}, 41 {"block_size", offsetof(struct rpc_construct_daos, block_size), spdk_json_decode_uint32}, 42 }; 43 44 static void 45 rpc_bdev_daos_create(struct spdk_jsonrpc_request *request, 46 const struct spdk_json_val *params) 47 { 48 struct rpc_construct_daos req = {NULL}; 49 struct spdk_json_write_ctx *w; 50 struct spdk_uuid *uuid = NULL; 51 struct spdk_uuid decoded_uuid; 52 struct spdk_bdev *bdev; 53 int rc = 0; 54 55 if (spdk_json_decode_object(params, rpc_construct_daos_decoders, 56 SPDK_COUNTOF(rpc_construct_daos_decoders), 57 &req)) { 58 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 59 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 60 "spdk_json_decode_object failed"); 61 goto cleanup; 62 } 63 64 if (req.uuid) { 65 if (spdk_uuid_parse(&decoded_uuid, req.uuid)) { 66 spdk_jsonrpc_send_error_response(request, -EINVAL, 67 "Failed to parse bdev UUID"); 68 goto cleanup; 69 } 70 uuid = &decoded_uuid; 71 } 72 73 rc = create_bdev_daos(&bdev, req.name, uuid, req.pool, req.cont, req.oclass, 74 req.num_blocks, req.block_size); 75 if (rc) { 76 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 77 goto cleanup; 78 } 79 80 free_rpc_construct_daos(&req); 81 82 w = spdk_jsonrpc_begin_result(request); 83 spdk_json_write_string(w, spdk_bdev_get_name(bdev)); 84 spdk_jsonrpc_end_result(request, w); 85 return; 86 87 cleanup: 88 free_rpc_construct_daos(&req); 89 } 90 SPDK_RPC_REGISTER("bdev_daos_create", rpc_bdev_daos_create, SPDK_RPC_RUNTIME) 91 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_create, construct_daos_bdev) 92 93 struct rpc_delete_daos { 94 char *name; 95 }; 96 97 static void 98 free_rpc_delete_daos(struct rpc_delete_daos *r) 99 { 100 free(r->name); 101 } 102 103 static const struct spdk_json_object_decoder rpc_delete_daos_decoders[] = { 104 {"name", offsetof(struct rpc_delete_daos, name), spdk_json_decode_string}, 105 }; 106 107 static void 108 rpc_bdev_daos_delete_cb(void *cb_arg, int bdeverrno) 109 { 110 struct spdk_jsonrpc_request *request = cb_arg; 111 112 if (bdeverrno == 0) { 113 spdk_jsonrpc_send_bool_response(request, true); 114 } else { 115 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno)); 116 } 117 } 118 119 static void 120 rpc_bdev_daos_delete(struct spdk_jsonrpc_request *request, 121 const struct spdk_json_val *params) 122 { 123 struct rpc_delete_daos req = {NULL}; 124 125 if (spdk_json_decode_object(params, rpc_delete_daos_decoders, 126 SPDK_COUNTOF(rpc_delete_daos_decoders), 127 &req)) { 128 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 129 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 130 "spdk_json_decode_object failed"); 131 goto cleanup; 132 } 133 134 delete_bdev_daos(req.name, rpc_bdev_daos_delete_cb, request); 135 136 cleanup: 137 free_rpc_delete_daos(&req); 138 } 139 140 SPDK_RPC_REGISTER("bdev_daos_delete", rpc_bdev_daos_delete, SPDK_RPC_RUNTIME) 141 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_delete, delete_daos_bdev) 142 143 struct rpc_bdev_daos_resize { 144 char *name; 145 uint64_t new_size; 146 }; 147 148 static const struct spdk_json_object_decoder rpc_bdev_daos_resize_decoders[] = { 149 {"name", offsetof(struct rpc_bdev_daos_resize, name), spdk_json_decode_string}, 150 {"new_size", offsetof(struct rpc_bdev_daos_resize, new_size), spdk_json_decode_uint64} 151 }; 152 153 static void 154 free_rpc_bdev_daos_resize(struct rpc_bdev_daos_resize *req) 155 { 156 free(req->name); 157 } 158 159 static void 160 rpc_bdev_daos_resize(struct spdk_jsonrpc_request *request, 161 const struct spdk_json_val *params) 162 { 163 struct rpc_bdev_daos_resize req = {}; 164 int rc; 165 166 if (spdk_json_decode_object(params, rpc_bdev_daos_resize_decoders, 167 SPDK_COUNTOF(rpc_bdev_daos_resize_decoders), 168 &req)) { 169 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 170 "spdk_json_decode_object failed"); 171 goto cleanup; 172 } 173 174 rc = bdev_daos_resize(req.name, req.new_size); 175 if (rc) { 176 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 177 goto cleanup; 178 } 179 180 spdk_jsonrpc_send_bool_response(request, true); 181 cleanup: 182 free_rpc_bdev_daos_resize(&req); 183 } 184 SPDK_RPC_REGISTER("bdev_daos_resize", rpc_bdev_daos_resize, SPDK_RPC_RUNTIME) 185