1*e21c39aaSAnton Nayshtut /* SPDX-License-Identifier: BSD-3-Clause 2*e21c39aaSAnton Nayshtut * Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3*e21c39aaSAnton Nayshtut */ 4*e21c39aaSAnton Nayshtut 5*e21c39aaSAnton Nayshtut #include "spdk/stdinc.h" 6*e21c39aaSAnton Nayshtut #include "spdk/log.h" 7*e21c39aaSAnton Nayshtut #include "spdk/string.h" 8*e21c39aaSAnton Nayshtut #include "spdk/rpc.h" 9*e21c39aaSAnton Nayshtut #include "spdk/util.h" 10*e21c39aaSAnton Nayshtut #include "fsdev_aio.h" 11*e21c39aaSAnton Nayshtut 12*e21c39aaSAnton Nayshtut struct rpc_aio_create { 13*e21c39aaSAnton Nayshtut char *name; 14*e21c39aaSAnton Nayshtut char *root_path; 15*e21c39aaSAnton Nayshtut struct spdk_fsdev_aio_opts opts; 16*e21c39aaSAnton Nayshtut }; 17*e21c39aaSAnton Nayshtut 18*e21c39aaSAnton Nayshtut static void 19*e21c39aaSAnton Nayshtut free_rpc_aio_create(struct rpc_aio_create *req) 20*e21c39aaSAnton Nayshtut { 21*e21c39aaSAnton Nayshtut free(req->name); 22*e21c39aaSAnton Nayshtut free(req->root_path); 23*e21c39aaSAnton Nayshtut } 24*e21c39aaSAnton Nayshtut 25*e21c39aaSAnton Nayshtut static const struct spdk_json_object_decoder rpc_aio_create_decoders[] = { 26*e21c39aaSAnton Nayshtut {"name", offsetof(struct rpc_aio_create, name), spdk_json_decode_string}, 27*e21c39aaSAnton Nayshtut {"root_path", offsetof(struct rpc_aio_create, root_path), spdk_json_decode_string}, 28*e21c39aaSAnton Nayshtut {"enable_xattr", offsetof(struct rpc_aio_create, opts.xattr_enabled), spdk_json_decode_bool, true}, 29*e21c39aaSAnton Nayshtut {"enable_writeback_cache", offsetof(struct rpc_aio_create, opts.writeback_cache_enabled), spdk_json_decode_bool, true}, 30*e21c39aaSAnton Nayshtut {"max_write", offsetof(struct rpc_aio_create, opts.max_write), spdk_json_decode_uint32, true}, 31*e21c39aaSAnton Nayshtut }; 32*e21c39aaSAnton Nayshtut 33*e21c39aaSAnton Nayshtut static void 34*e21c39aaSAnton Nayshtut rpc_aio_create(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) 35*e21c39aaSAnton Nayshtut { 36*e21c39aaSAnton Nayshtut struct rpc_aio_create req = {}; 37*e21c39aaSAnton Nayshtut struct spdk_json_write_ctx *w; 38*e21c39aaSAnton Nayshtut struct spdk_fsdev *fsdev; 39*e21c39aaSAnton Nayshtut int rc; 40*e21c39aaSAnton Nayshtut 41*e21c39aaSAnton Nayshtut spdk_fsdev_aio_get_default_opts(&req.opts); 42*e21c39aaSAnton Nayshtut 43*e21c39aaSAnton Nayshtut if (spdk_json_decode_object(params, rpc_aio_create_decoders, 44*e21c39aaSAnton Nayshtut SPDK_COUNTOF(rpc_aio_create_decoders), 45*e21c39aaSAnton Nayshtut &req)) { 46*e21c39aaSAnton Nayshtut SPDK_ERRLOG("spdk_json_decode_object failed\n"); 47*e21c39aaSAnton Nayshtut spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 48*e21c39aaSAnton Nayshtut "spdk_json_decode_object failed"); 49*e21c39aaSAnton Nayshtut 50*e21c39aaSAnton Nayshtut free_rpc_aio_create(&req); 51*e21c39aaSAnton Nayshtut return; 52*e21c39aaSAnton Nayshtut } 53*e21c39aaSAnton Nayshtut 54*e21c39aaSAnton Nayshtut rc = spdk_fsdev_aio_create(&fsdev, req.name, req.root_path, &req.opts); 55*e21c39aaSAnton Nayshtut if (rc) { 56*e21c39aaSAnton Nayshtut SPDK_ERRLOG("Failed to create aio %s: rc %d\n", req.name, rc); 57*e21c39aaSAnton Nayshtut spdk_jsonrpc_send_error_response(request, 58*e21c39aaSAnton Nayshtut SPDK_JSONRPC_ERROR_INTERNAL_ERROR, 59*e21c39aaSAnton Nayshtut spdk_strerror(-rc)); 60*e21c39aaSAnton Nayshtut free_rpc_aio_create(&req); 61*e21c39aaSAnton Nayshtut return; 62*e21c39aaSAnton Nayshtut } 63*e21c39aaSAnton Nayshtut 64*e21c39aaSAnton Nayshtut w = spdk_jsonrpc_begin_result(request); 65*e21c39aaSAnton Nayshtut spdk_json_write_string(w, fsdev->name); 66*e21c39aaSAnton Nayshtut spdk_jsonrpc_end_result(request, w); 67*e21c39aaSAnton Nayshtut free_rpc_aio_create(&req); 68*e21c39aaSAnton Nayshtut } 69*e21c39aaSAnton Nayshtut SPDK_RPC_REGISTER("fsdev_aio_create", rpc_aio_create, SPDK_RPC_RUNTIME) 70*e21c39aaSAnton Nayshtut 71*e21c39aaSAnton Nayshtut struct rpc_aio_delete { 72*e21c39aaSAnton Nayshtut char *name; 73*e21c39aaSAnton Nayshtut }; 74*e21c39aaSAnton Nayshtut 75*e21c39aaSAnton Nayshtut static const struct spdk_json_object_decoder rpc_aio_delete_decoders[] = { 76*e21c39aaSAnton Nayshtut {"name", offsetof(struct rpc_aio_delete, name), spdk_json_decode_string}, 77*e21c39aaSAnton Nayshtut }; 78*e21c39aaSAnton Nayshtut 79*e21c39aaSAnton Nayshtut static void 80*e21c39aaSAnton Nayshtut rpc_aio_delete_cb(void *cb_arg, int fsdeverrno) 81*e21c39aaSAnton Nayshtut { 82*e21c39aaSAnton Nayshtut struct spdk_jsonrpc_request *request = cb_arg; 83*e21c39aaSAnton Nayshtut 84*e21c39aaSAnton Nayshtut if (fsdeverrno == 0) { 85*e21c39aaSAnton Nayshtut spdk_jsonrpc_send_bool_response(request, true); 86*e21c39aaSAnton Nayshtut } else { 87*e21c39aaSAnton Nayshtut spdk_jsonrpc_send_error_response(request, fsdeverrno, spdk_strerror(-fsdeverrno)); 88*e21c39aaSAnton Nayshtut } 89*e21c39aaSAnton Nayshtut } 90*e21c39aaSAnton Nayshtut 91*e21c39aaSAnton Nayshtut static void 92*e21c39aaSAnton Nayshtut rpc_aio_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) 93*e21c39aaSAnton Nayshtut { 94*e21c39aaSAnton Nayshtut struct rpc_aio_delete req = {}; 95*e21c39aaSAnton Nayshtut 96*e21c39aaSAnton Nayshtut if (spdk_json_decode_object(params, rpc_aio_delete_decoders, 97*e21c39aaSAnton Nayshtut SPDK_COUNTOF(rpc_aio_delete_decoders), 98*e21c39aaSAnton Nayshtut &req)) { 99*e21c39aaSAnton Nayshtut SPDK_ERRLOG("spdk_json_decode_object failed\n"); 100*e21c39aaSAnton Nayshtut spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, 101*e21c39aaSAnton Nayshtut "spdk_json_decode_object failed"); 102*e21c39aaSAnton Nayshtut 103*e21c39aaSAnton Nayshtut free(req.name); 104*e21c39aaSAnton Nayshtut return; 105*e21c39aaSAnton Nayshtut } 106*e21c39aaSAnton Nayshtut 107*e21c39aaSAnton Nayshtut spdk_fsdev_aio_delete(req.name, rpc_aio_delete_cb, request); 108*e21c39aaSAnton Nayshtut free(req.name); 109*e21c39aaSAnton Nayshtut } 110*e21c39aaSAnton Nayshtut SPDK_RPC_REGISTER("fsdev_aio_delete", rpc_aio_delete, SPDK_RPC_RUNTIME) 111