1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) croit GmbH. 3 * All rights reserved. 4 */ 5 6 #include "bdev_daos.h" 7 #include "spdk/rpc.h" 8 #include "spdk/util.h" 9 #include "spdk/uuid.h" 10 #include "spdk/string.h" 11 #include "spdk/log.h" 12 13 struct rpc_construct_daos { 14 char *name; 15 char *uuid; 16 char *pool; 17 char *cont; 18 char *oclass; 19 uint64_t num_blocks; 20 uint32_t block_size; 21 }; 22 23 static void 24 free_rpc_construct_daos(struct rpc_construct_daos *r) 25 { 26 free(r->name); 27 free(r->uuid); 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_string, 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_uuid *uuid = NULL; 50 struct spdk_uuid decoded_uuid; 51 struct spdk_bdev *bdev; 52 int rc = 0; 53 54 if (spdk_json_decode_object(params, rpc_construct_daos_decoders, 55 SPDK_COUNTOF(rpc_construct_daos_decoders), 56 &req)) { 57 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 58 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 59 "spdk_json_decode_object failed"); 60 goto cleanup; 61 } 62 63 if (req.uuid) { 64 if (spdk_uuid_parse(&decoded_uuid, req.uuid)) { 65 spdk_jsonrpc_send_error_response(request, -EINVAL, 66 "Failed to parse bdev UUID"); 67 goto cleanup; 68 } 69 uuid = &decoded_uuid; 70 } 71 72 rc = create_bdev_daos(&bdev, req.name, uuid, req.pool, req.cont, req.oclass, 73 req.num_blocks, req.block_size); 74 if (rc) { 75 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 76 goto cleanup; 77 } 78 79 free_rpc_construct_daos(&req); 80 81 w = spdk_jsonrpc_begin_result(request); 82 spdk_json_write_string(w, spdk_bdev_get_name(bdev)); 83 spdk_jsonrpc_end_result(request, w); 84 return; 85 86 cleanup: 87 free_rpc_construct_daos(&req); 88 } 89 SPDK_RPC_REGISTER("bdev_daos_create", rpc_bdev_daos_create, SPDK_RPC_RUNTIME) 90 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_create, construct_daos_bdev) 91 92 struct rpc_delete_daos { 93 char *name; 94 }; 95 96 static void 97 free_rpc_delete_daos(struct rpc_delete_daos *r) 98 { 99 free(r->name); 100 } 101 102 static const struct spdk_json_object_decoder rpc_delete_daos_decoders[] = { 103 {"name", offsetof(struct rpc_delete_daos, name), spdk_json_decode_string}, 104 }; 105 106 static void 107 rpc_bdev_daos_delete_cb(void *cb_arg, int bdeverrno) 108 { 109 struct spdk_jsonrpc_request *request = cb_arg; 110 111 spdk_jsonrpc_send_bool_response(request, bdeverrno == 0); 112 } 113 114 static void 115 rpc_bdev_daos_delete(struct spdk_jsonrpc_request *request, 116 const struct spdk_json_val *params) 117 { 118 struct rpc_delete_daos req = {NULL}; 119 struct spdk_bdev *bdev; 120 121 if (spdk_json_decode_object(params, rpc_delete_daos_decoders, 122 SPDK_COUNTOF(rpc_delete_daos_decoders), 123 &req)) { 124 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 125 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 126 "spdk_json_decode_object failed"); 127 goto cleanup; 128 } 129 130 bdev = spdk_bdev_get_by_name(req.name); 131 if (bdev == NULL) { 132 SPDK_INFOLOG(bdev_daos, "bdev '%s' does not exist\n", req.name); 133 spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); 134 goto cleanup; 135 } 136 137 delete_bdev_daos(bdev, rpc_bdev_daos_delete_cb, request); 138 139 cleanup: 140 free_rpc_delete_daos(&req); 141 } 142 143 SPDK_RPC_REGISTER("bdev_daos_delete", rpc_bdev_daos_delete, SPDK_RPC_RUNTIME) 144 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_delete, delete_daos_bdev) 145 146 struct rpc_bdev_daos_resize { 147 char *name; 148 uint64_t new_size; 149 }; 150 151 static const struct spdk_json_object_decoder rpc_bdev_daos_resize_decoders[] = { 152 {"name", offsetof(struct rpc_bdev_daos_resize, name), spdk_json_decode_string}, 153 {"new_size", offsetof(struct rpc_bdev_daos_resize, new_size), spdk_json_decode_uint64} 154 }; 155 156 static void 157 free_rpc_bdev_daos_resize(struct rpc_bdev_daos_resize *req) 158 { 159 free(req->name); 160 } 161 162 static void 163 rpc_bdev_daos_resize(struct spdk_jsonrpc_request *request, 164 const struct spdk_json_val *params) 165 { 166 struct rpc_bdev_daos_resize req = {}; 167 int rc; 168 169 if (spdk_json_decode_object(params, rpc_bdev_daos_resize_decoders, 170 SPDK_COUNTOF(rpc_bdev_daos_resize_decoders), 171 &req)) { 172 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 173 "spdk_json_decode_object failed"); 174 goto cleanup; 175 } 176 177 rc = bdev_daos_resize(req.name, req.new_size); 178 if (rc) { 179 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 180 goto cleanup; 181 } 182 183 spdk_jsonrpc_send_bool_response(request, true); 184 cleanup: 185 free_rpc_bdev_daos_resize(&req); 186 } 187 SPDK_RPC_REGISTER("bdev_daos_resize", rpc_bdev_daos_resize, SPDK_RPC_RUNTIME) 188