From 6be654aad72fb9bc36ead924b671cbf2bfad0ebf Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Mon, 18 Jun 2018 04:07:33 -0400 Subject: [PATCH] bdev: add delete_iscsi_bdev call Since delete_bdev should be used only for debug purpose, this patch adds delete call specific for iSCSI bdev. No changes in spdkcli, since it is not implemented yet. Tests unchanged, because test is only done by running bdevperf and exiting. Without time to delete_iscsi_bdev. Change-Id: I8341bfb65932a1deb1fb6463e11ef932d6f6d597 Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/415678 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/bdev/iscsi/bdev_iscsi.c | 11 ++++++ lib/bdev/iscsi/bdev_iscsi.h | 11 ++++++ lib/bdev/iscsi/bdev_iscsi_rpc.c | 62 +++++++++++++++++++++++++++++++++ scripts/rpc.py | 9 +++++ scripts/rpc/bdev.py | 10 ++++++ 5 files changed, 103 insertions(+) diff --git a/lib/bdev/iscsi/bdev_iscsi.c b/lib/bdev/iscsi/bdev_iscsi.c index 3ed7faaa9..203813d81 100644 --- a/lib/bdev/iscsi/bdev_iscsi.c +++ b/lib/bdev/iscsi/bdev_iscsi.c @@ -751,6 +751,17 @@ err: return rc; } +void +delete_iscsi_disk(struct spdk_bdev *bdev, spdk_delete_iscsi_complete cb_fn, void *cb_arg) +{ + if (!bdev || bdev->module != &g_iscsi_bdev_module) { + cb_fn(cb_arg, -ENODEV); + return; + } + + spdk_bdev_unregister(bdev, cb_fn, cb_arg); +} + static void bdev_iscsi_initialize_cb(void *cb_arg, struct spdk_bdev *bdev, int status) { diff --git a/lib/bdev/iscsi/bdev_iscsi.h b/lib/bdev/iscsi/bdev_iscsi.h index b3ec941f4..b1d22fa82 100644 --- a/lib/bdev/iscsi/bdev_iscsi.h +++ b/lib/bdev/iscsi/bdev_iscsi.h @@ -36,6 +36,8 @@ #include "spdk/bdev.h" +typedef void (*spdk_delete_iscsi_complete)(void *cb_arg, int bdeverrno); + /** * SPDK bdev iSCSI callback type. * @@ -61,4 +63,13 @@ typedef void (*spdk_bdev_iscsi_create_cb)(void *cb_arg, struct spdk_bdev *bdev, int create_iscsi_disk(const char *bdev_name, const char *initiator_iqn, const char *url, spdk_bdev_iscsi_create_cb cb_fn, void *cb_arg); +/** + * Delete iSCSI bdev. + * + * \param bdev Pointer to iSCSI bdev. + * \param cb_fn Completion callback + * \param cb_arg Completion callback custom arguments + */ +void delete_iscsi_disk(struct spdk_bdev *bdev, spdk_delete_iscsi_complete cb_fn, void *cb_arg); + #endif // SPDK_BDEV_ISCSI_H diff --git a/lib/bdev/iscsi/bdev_iscsi_rpc.c b/lib/bdev/iscsi/bdev_iscsi_rpc.c index 5478d70ce..b163672f9 100644 --- a/lib/bdev/iscsi/bdev_iscsi_rpc.c +++ b/lib/bdev/iscsi/bdev_iscsi_rpc.c @@ -111,3 +111,65 @@ invalid: spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc)); } SPDK_RPC_REGISTER("construct_iscsi_bdev", spdk_rpc_construct_iscsi_bdev, SPDK_RPC_RUNTIME) + +struct rpc_delete_iscsi { + char *name; +}; + +static void +free_rpc_delete_iscsi(struct rpc_delete_iscsi *r) +{ + free(r->name); +} + +static const struct spdk_json_object_decoder rpc_delete_iscsi_decoders[] = { + {"name", offsetof(struct rpc_delete_iscsi, name), spdk_json_decode_string}, +}; + +static void +_spdk_rpc_delete_iscsi_bdev_cb(void *cb_arg, int bdeverrno) +{ + struct spdk_jsonrpc_request *request = cb_arg; + struct spdk_json_write_ctx *w; + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_bool(w, bdeverrno == 0); + spdk_jsonrpc_end_result(request, w); +} + +static void +spdk_rpc_delete_iscsi_bdev(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct rpc_delete_iscsi req = {NULL}; + struct spdk_bdev *bdev; + int rc; + + if (spdk_json_decode_object(params, rpc_delete_iscsi_decoders, + SPDK_COUNTOF(rpc_delete_iscsi_decoders), + &req)) { + rc = -EINVAL; + goto invalid; + } + + bdev = spdk_bdev_get_by_name(req.name); + if (bdev == NULL) { + rc = -ENODEV; + goto invalid; + } + + delete_iscsi_disk(bdev, _spdk_rpc_delete_iscsi_bdev_cb, request); + + free_rpc_delete_iscsi(&req); + + return; + +invalid: + free_rpc_delete_iscsi(&req); + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc)); +} +SPDK_RPC_REGISTER("delete_iscsi_bdev", spdk_rpc_delete_iscsi_bdev, SPDK_RPC_RUNTIME) diff --git a/scripts/rpc.py b/scripts/rpc.py index 82ecda2ff..19622293d 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -262,6 +262,15 @@ if __name__ == "__main__": p.add_argument('--url', help="iSCSI Lun URL", required=True) p.set_defaults(func=construct_iscsi_bdev) + @call_cmd + def delete_iscsi_bdev(args): + rpc.bdev.delete_iscsi_bdev(args.client, + name=args.name) + + p = subparsers.add_parser('delete_iscsi_bdev', help='Delete an iSCSI bdev') + p.add_argument('name', help='iSCSI bdev name') + p.set_defaults(func=delete_iscsi_bdev) + @call_cmd def construct_pmem_bdev(args): print_array(rpc.bdev.construct_pmem_bdev(args.client, diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index e03b9af97..4cd024d91 100755 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -187,6 +187,16 @@ def construct_iscsi_bdev(client, name, url, initiator_iqn): return client.call('construct_iscsi_bdev', params) +def delete_iscsi_bdev(client, name): + """Remove iSCSI bdev from the system. + + Args: + bdev_name: name of iSCSI bdev to delete + """ + params = {'name': name} + return client.call('delete_iscsi_bdev', params) + + def construct_pmem_bdev(client, pmem_file, name): """Construct a libpmemblk block device.