From 3f9582d7f91876e6e4df6f6dda392fb30f0a355f Mon Sep 17 00:00:00 2001 From: Sagi Grimberg Date: Fri, 31 Aug 2018 18:36:05 -0700 Subject: [PATCH] fabrics: add disconnect-all command Signed-off-by: Sagi Grimberg Reviewed-by: Chaitanya Kulkarni Signed-off-by: Keith Busch --- Documentation/nvme-disconnect-all.txt | 34 +++++++++++++++++++++++++++ fabrics.c | 29 +++++++++++++++++++++++ fabrics.h | 1 + nvme-builtin.h | 1 + nvme.c | 6 +++++ 5 files changed, 71 insertions(+) create mode 100644 Documentation/nvme-disconnect-all.txt diff --git a/Documentation/nvme-disconnect-all.txt b/Documentation/nvme-disconnect-all.txt new file mode 100644 index 00000000..6be7e414 --- /dev/null +++ b/Documentation/nvme-disconnect-all.txt @@ -0,0 +1,34 @@ +nvme-disconnect-all(1) +====================== + +NAME +---- +nvme-disconnect-all - Disconnect from all connected Fabrics controllers. + +SYNOPSIS +-------- +[verse] +'nvme disconnect-all' + +DESCRIPTION +----------- +Disconnects and removes all existing NVMe over Fabrics controllers. + +See the documentation for the nvme-disconnect(1) command for further +background. + +EXAMPLES +-------- +* Disconnect all existing nvme controllers: ++ +------------ +# nvme disconnect-all +------------ + +SEE ALSO +-------- +nvme-disconnect(1) + +NVME +---- +Part of the nvme-user suite diff --git a/fabrics.c b/fabrics.c index 09cb97c5..029105b2 100644 --- a/fabrics.c +++ b/fabrics.c @@ -1048,3 +1048,32 @@ int disconnect(const char *desc, int argc, char **argv) return ret; } + +int disconnect_all(const char *desc, int argc, char **argv) +{ + struct subsys_list_item *slist; + int i, j, ret = 0, subcnt = 0; + const struct argconfig_commandline_options command_line_options[] = { + {NULL}, + }; + + ret = argconfig_parse(argc, argv, desc, command_line_options, &cfg, + sizeof(cfg)); + if (ret) + return ret; + + slist = get_subsys_list(&subcnt); + for (i = 0; i < subcnt; i++) { + struct subsys_list_item *subsys = &slist[i]; + + for (j = 0; j < subsys->nctrls; j++) { + struct ctrl_list_item *ctrl = &subsys->ctrls[j]; + + ret = disconnect_by_device(ctrl->name); + if (ret) + goto out; + } + } +out: + return ret; +} diff --git a/fabrics.h b/fabrics.h index 91aec90f..988f3ef2 100644 --- a/fabrics.h +++ b/fabrics.h @@ -4,5 +4,6 @@ extern int discover(const char *desc, int argc, char **argv, bool connect); extern int connect(const char *desc, int argc, char **argv); extern int disconnect(const char *desc, int argc, char **argv); +extern int disconnect_all(const char *desc, int argc, char **argv); #endif diff --git a/nvme-builtin.h b/nvme-builtin.h index f9e47b33..afd12b05 100644 --- a/nvme-builtin.h +++ b/nvme-builtin.h @@ -63,6 +63,7 @@ COMMAND_LIST( ENTRY("connect-all", "Discover and Connect to NVMeoF subsystems", connect_all_cmd) ENTRY("connect", "Connect to NVMeoF subsystem", connect_cmd) ENTRY("disconnect", "Disconnect from NVMeoF subsystem", disconnect_cmd) + ENTRY("disconnect-all", "Disconnect from all connected NVMeoF subsystems", disconnect_all_cmd) ENTRY("gen-hostnqn", "Generate NVMeoF host NQN", gen_hostnqn_cmd) ENTRY("dir-receive", "Submit a Directive Receive command, return results", dir_receive) ENTRY("dir-send", "Submit a Directive Send command, return results", dir_send) diff --git a/nvme.c b/nvme.c index a1e85833..970fc0bd 100644 --- a/nvme.c +++ b/nvme.c @@ -4628,6 +4628,12 @@ static int disconnect_cmd(int argc, char **argv, struct command *command, struct return disconnect(desc, argc, argv); } +static int disconnect_all_cmd(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Disconnect from all connected NVMeoF subsystems"; + return disconnect_all(desc, argc, argv); +} + void register_extension(struct plugin *plugin) { plugin->parent = &nvme; -- 2.50.1