[PATCH 1/2] nvme-cli: add support for an abort command
Minwoo Im
minwoo.im.dev at gmail.com
Wed Jan 24 04:25:36 PST 2018
Add support for an abort command.
sqid and cid are enough to be __u16, but declared in __u32 to check
being without either or both parameters.
Signed-off-by: Minwoo Im <minwoo.im.dev at gmail.com>
---
nvme-builtin.h | 1 +
nvme-ioctl.c | 13 +++++++++++++
nvme-ioctl.h | 1 +
nvme.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+)
diff --git a/nvme-builtin.h b/nvme-builtin.h
index 4adfa78..c5d14ec 100644
--- a/nvme-builtin.h
+++ b/nvme-builtin.h
@@ -59,6 +59,7 @@ COMMAND_LIST(
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)
+ ENTRY("abort", "Submit an Abort, return results", abort_cmd)
);
#endif
diff --git a/nvme-ioctl.c b/nvme-ioctl.c
index 5c900b7..e0ed8d8 100644
--- a/nvme-ioctl.c
+++ b/nvme-ioctl.c
@@ -778,3 +778,16 @@ int nvme_dir_recv(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
return err;
}
+int nvme_abort(int fd, __u16 sqid, __u16 cid, __u32 *result)
+{
+ struct nvme_admin_cmd cmd = {
+ .opcode = nvme_admin_abort_cmd,
+ .cdw10 = cid << 16 | sqid,
+ };
+ int err;
+
+ err = nvme_submit_admin_passthru(fd, &cmd);
+ if (!err && result)
+ *result = cmd.result;
+ return err;
+}
diff --git a/nvme-ioctl.h b/nvme-ioctl.h
index 4031c70..295a187 100644
--- a/nvme-ioctl.h
+++ b/nvme-ioctl.h
@@ -127,5 +127,6 @@ int nvme_dir_recv(int fd, __u32 nsid, __u16 dspec, __u8 dtype, __u8 doper,
__u32 data_len, __u32 dw12, void *data, __u32 *result);
int nvme_get_properties(int fd, void **pbar);
int nvme_set_property(int fd, int offset, int value);
+int nvme_abort(int fd, __u16 sqid, __u16 cid, __u32 *result);
#endif /* _NVME_LIB_H */
diff --git a/nvme.c b/nvme.c
index 2723cb6..bc45b9b 100644
--- a/nvme.c
+++ b/nvme.c
@@ -3678,6 +3678,56 @@ free:
return err;
}
+static int abort_cmd(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+ const char *desc = "It's used to abort a specific command previously "\
+ "submitted to the Admin Submission Queue or an "\
+ "I/O Submission Queue.";
+ const char *sqid = "Submission Queue Identifier";
+ const char *cid = "Command Identifier";
+ __u32 result;
+ int fd;
+ int err;
+
+ struct config {
+ __u32 sqid;
+ __u32 cid;
+ };
+
+ struct config cfg = {
+ .sqid = 0xFFFFFFFF,
+ .cid = 0xFFFFFFFF,
+ };
+
+ const struct argconfig_commandline_options command_line_options[] = {
+ {"sqid", 's', "NUM", CFG_POSITIVE, &cfg.sqid, required_argument, sqid},
+ {"cid", 'c', "NUM", CFG_POSITIVE, &cfg.cid, required_argument, cid},
+ {NULL}
+ };
+
+ fd = parse_and_open(argc, argv, desc, command_line_options, &cfg, sizeof(cfg));
+ if (fd < 0)
+ return fd;
+
+ if (cfg.sqid >= (1 << 16) || cfg.cid >= (1 << 16)) {
+ fprintf(stderr, "sqid or cid not valid\n");
+ return EINVAL;
+ }
+
+ err = nvme_abort(fd, cfg.sqid, cfg.cid, &result);
+ if (err)
+ fprintf(stderr, "NVMe Status:%s(%x)\n",
+ nvme_status_to_string(err), err);
+ else {
+ if (result & 0x1)
+ printf("CMD(%04x) in SQ(%04X) not aborted.\n", cfg.cid, cfg.sqid);
+ else
+ printf("CMD(%04x) in SQ(%04X) successfully aborted.\n", cfg.cid, cfg.sqid);
+ }
+
+ return err;
+}
+
static int passthru(int argc, char **argv, int ioctl_cmd, const char *desc, struct command *cmd)
{
void *data = NULL, *metadata = NULL;
--
2.7.4
More information about the Linux-nvme
mailing list