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