From 62ae3bea42cb3a81cc77492568747a330f783100 Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Tue, 14 Mar 2017 11:49:42 -0400 Subject: [PATCH] nvme-cli/format: use existing LBAF if none requested We previously default to LBAF 0 if the user didn't specify one. If a specific LBAF is not explicitly requested, most people expect format to not change their currently in use LBAF. This patch uses the current format if we have a namespace to query. https://github.com/linux-nvme/nvme-cli/issues/164 Signed-off-by: Keith Busch --- nvme.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 17318b4..4b4d7fa 100644 --- a/nvme.c +++ b/nvme.c @@ -1397,7 +1397,9 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu const char *ms = "[0-1]: extended format off/on"; const char *reset = "Automatically reset the controller after successful format"; const char *timeout = "timeout value, in milliseconds"; + struct nvme_id_ns ns; int err, fd; + __u8 prev_lbaf = 0; struct config { __u32 namespace_id; @@ -1413,7 +1415,7 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu struct config cfg = { .namespace_id = 0xffffffff, .timeout = 120000, - .lbaf = 0, + .lbaf = 0xff, .ses = 0, .pi = 0, .reset = 0, @@ -1435,6 +1437,24 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu if (fd < 0) return fd; + if (S_ISBLK(nvme_stat.st_mode)) + cfg.namespace_id = get_nsid(fd); + if (cfg.namespace_id != 0xffffffff) { + err = nvme_identify_ns(fd, cfg.namespace_id, 0, &ns); + if (err) { + if (err < 0) + perror("identify-namespace"); + else + fprintf(stderr, + "NVME Admin command error:%s(%x)\n", + nvme_status_to_string(err), err); + return err; + } + prev_lbaf = ns.flbas & 0xf; + } + if (cfg.lbaf == 0xff) + cfg.lbaf = prev_lbaf; + /* ses & pi checks set to 7 for forward-compatibility */ if (cfg.ses > 7) { fprintf(stderr, "invalid secure erase settings:%d\n", cfg.ses); @@ -1456,8 +1476,6 @@ static int format(int argc, char **argv, struct command *cmd, struct plugin *plu fprintf(stderr, "invalid ms:%d\n", cfg.ms); return EINVAL; } - if (S_ISBLK(nvme_stat.st_mode)) - cfg.namespace_id = get_nsid(fd); err = nvme_format(fd, cfg.namespace_id, cfg.lbaf, cfg.ses, cfg.pi, cfg.pil, cfg.ms, cfg.timeout); -- 2.49.0