]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
fabrics: add disconnect-all command
authorSagi Grimberg <sagi@grimberg.me>
Sat, 1 Sep 2018 01:36:05 +0000 (18:36 -0700)
committerKeith Busch <keith.busch@intel.com>
Thu, 6 Sep 2018 00:17:33 +0000 (18:17 -0600)
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Documentation/nvme-disconnect-all.txt [new file with mode: 0644]
fabrics.c
fabrics.h
nvme-builtin.h
nvme.c

diff --git a/Documentation/nvme-disconnect-all.txt b/Documentation/nvme-disconnect-all.txt
new file mode 100644 (file)
index 0000000..6be7e41
--- /dev/null
@@ -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
index 09cb97c5b880aae355443d1466157cbd2f261bcf..029105b227ff1c0eac4d4bcee1f80a79be703dac 100644 (file)
--- 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;
+}
index 91aec90f0ab085630c80f249db6615c6b1349164..988f3ef2fbc463c53c1b14a9ef34cd91fda4b29c 100644 (file)
--- 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
index f9e47b33803c5d5cde5789528e9b3c5a42bbb2d5..afd12b0559109b97a15349127d01d7b55e114fc2 100644 (file)
@@ -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 a1e85833cb9458aa65d9150b45a4613174392623..970fc0bd02432eb2a0251d2cb5b1c499f1f56d66 100644 (file)
--- 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;