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 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 } 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 {"num_blocks", offsetof(struct rpc_construct_daos, num_blocks), spdk_json_decode_uint64}, 39 {"block_size", offsetof(struct rpc_construct_daos, block_size), spdk_json_decode_uint32}, 40 }; 41 42 static void 43 rpc_bdev_daos_create(struct spdk_jsonrpc_request *request, 44 const struct spdk_json_val *params) 45 { 46 struct rpc_construct_daos req = {NULL}; 47 struct spdk_json_write_ctx *w; 48 struct spdk_uuid *uuid = NULL; 49 struct spdk_uuid decoded_uuid; 50 struct spdk_bdev *bdev; 51 int rc = 0; 52 53 if (spdk_json_decode_object(params, rpc_construct_daos_decoders, 54 SPDK_COUNTOF(rpc_construct_daos_decoders), 55 &req)) { 56 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 57 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 58 "spdk_json_decode_object failed"); 59 goto cleanup; 60 } 61 62 if (req.uuid) { 63 if (spdk_uuid_parse(&decoded_uuid, req.uuid)) { 64 spdk_jsonrpc_send_error_response(request, -EINVAL, 65 "Failed to parse bdev UUID"); 66 goto cleanup; 67 } 68 uuid = &decoded_uuid; 69 } 70 71 rc = create_bdev_daos(&bdev, req.name, uuid, req.pool, req.cont, 72 req.num_blocks, req.block_size); 73 if (rc) { 74 spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); 75 goto cleanup; 76 } 77 78 free_rpc_construct_daos(&req); 79 80 w = spdk_jsonrpc_begin_result(request); 81 spdk_json_write_string(w, spdk_bdev_get_name(bdev)); 82 spdk_jsonrpc_end_result(request, w); 83 return; 84 85 cleanup: 86 free_rpc_construct_daos(&req); 87 } 88 SPDK_RPC_REGISTER("bdev_daos_create", rpc_bdev_daos_create, SPDK_RPC_RUNTIME) 89 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_create, construct_daos_bdev) 90 91 struct rpc_delete_daos { 92 char *name; 93 }; 94 95 static void 96 free_rpc_delete_daos(struct rpc_delete_daos *r) 97 { 98 free(r->name); 99 } 100 101 static const struct spdk_json_object_decoder rpc_delete_daos_decoders[] = { 102 {"name", offsetof(struct rpc_delete_daos, name), spdk_json_decode_string}, 103 }; 104 105 static void 106 rpc_bdev_daos_delete_cb(void *cb_arg, int bdeverrno) 107 { 108 struct spdk_jsonrpc_request *request = cb_arg; 109 110 spdk_jsonrpc_send_bool_response(request, bdeverrno == 0); 111 } 112 113 static void 114 rpc_bdev_daos_delete(struct spdk_jsonrpc_request *request, 115 const struct spdk_json_val *params) 116 { 117 struct rpc_delete_daos req = {NULL}; 118 struct spdk_bdev *bdev; 119 120 if (spdk_json_decode_object(params, rpc_delete_daos_decoders, 121 SPDK_COUNTOF(rpc_delete_daos_decoders), 122 &req)) { 123 SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n"); 124 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, 125 "spdk_json_decode_object failed"); 126 goto cleanup; 127 } 128 129 bdev = spdk_bdev_get_by_name(req.name); 130 if (bdev == NULL) { 131 SPDK_INFOLOG(bdev_daos, "bdev '%s' does not exist\n", req.name); 132 spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); 133 goto cleanup; 134 } 135 136 delete_bdev_daos(bdev, rpc_bdev_daos_delete_cb, request); 137 138 cleanup: 139 free_rpc_delete_daos(&req); 140 } 141 142 SPDK_RPC_REGISTER("bdev_daos_delete", rpc_bdev_daos_delete, SPDK_RPC_RUNTIME) 143 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_delete, delete_daos_bdev) 144