]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
Merge branch 'master' of https://github.com/benreese0/nvme-cli into benreese0-master
authorKeith Busch <keith.busch@intel.com>
Tue, 29 Jan 2019 00:48:47 +0000 (17:48 -0700)
committerKeith Busch <keith.busch@intel.com>
Tue, 29 Jan 2019 00:48:47 +0000 (17:48 -0700)
Fixed merge conflicts.

1  2 
nvme.c

diff --cc nvme.c
index 8922ec2fa3973f78835aac19bf418273275a853e,e6d0d9e56a140ed236476356414f180d63462fbb..d19bdd66de7901cc24faf5966a1af96639b5aef0
--- 1/nvme.c
--- 2/nvme.c
+++ b/nvme.c
@@@ -1167,9 -1163,10 +1167,11 @@@ static int create_ns(int argc, char **a
        const char *flbas = "FLBA size";
        const char *dps = "data protection capabilities";
        const char *nmic = "multipath and sharing capabilities";
 +      const char *timeout = "timeout value, in milliseconds";
+       const char *bs = "target block size";
  
-       int err = 0, fd;
+       int err = 0, fd, i;
+       struct nvme_id_ns ns;
        __u32 nsid;
  
        struct config {
                __u8    flbas;
                __u8    dps;
                __u8    nmic;
+               __u64   bs;
 +              __u32   timeout;
        };
  
        struct config cfg = {
+               .flbas = 0xff,
+               .bs = 0x00,
 +              .timeout      = NVME_IOCTL_TIMEOUT,
        };
  
        const struct argconfig_commandline_options command_line_options[] = {
-               {"nsze",  's', "NUM", CFG_LONG_SUFFIX, &cfg.nsze,  required_argument, nsze},
-               {"ncap",  'c', "NUM", CFG_LONG_SUFFIX, &cfg.ncap,  required_argument, ncap},
-               {"flbas", 'f', "NUM", CFG_BYTE,        &cfg.flbas, required_argument, flbas},
-               {"dps",   'd', "NUM", CFG_BYTE,        &cfg.dps,   required_argument, dps},
-               {"nmic",  'm', "NUM", CFG_BYTE,        &cfg.nmic,  required_argument, nmic},
-               {"timeout", 't', "NUM", CFG_POSITIVE,  &cfg.timeout, required_argument, timeout},
 -              {"nsze",         's', "NUM", CFG_LONG_SUFFIX, &cfg.nsze,  required_argument, nsze},
 -              {"ncap",         'c', "NUM", CFG_LONG_SUFFIX, &cfg.ncap,  required_argument, ncap},
 -              {"flbas",        'f', "NUM", CFG_BYTE,        &cfg.flbas, required_argument, flbas},
 -              {"dps",          'd', "NUM", CFG_BYTE,        &cfg.dps,   required_argument, dps},
 -              {"nmic",         'm', "NUM", CFG_BYTE,        &cfg.nmic,  required_argument, nmic},
 -              {"block-size",   'b', "NUM", CFG_LONG_SUFFIX, &cfg.bs,    required_argument, bs},
++              {"nsze",         's', "NUM", CFG_LONG_SUFFIX, &cfg.nsze,    required_argument, nsze},
++              {"ncap",         'c', "NUM", CFG_LONG_SUFFIX, &cfg.ncap,    required_argument, ncap},
++              {"flbas",        'f', "NUM", CFG_BYTE,        &cfg.flbas,   required_argument, flbas},
++              {"dps",          'd', "NUM", CFG_BYTE,        &cfg.dps,     required_argument, dps},
++              {"nmic",         'm', "NUM", CFG_BYTE,        &cfg.nmic,    required_argument, nmic},
++              {"block-size",   'b', "NUM", CFG_LONG_SUFFIX, &cfg.bs,      required_argument, bs},
++              {"timeout",      't', "NUM", CFG_POSITIVE,    &cfg.timeout, required_argument, timeout},
                {NULL}
        };
  
        if (fd < 0)
                return fd;
  
-       err = nvme_ns_create(fd, cfg.nsze, cfg.ncap, cfg.flbas, cfg.dps, cfg.nmic, cfg.timeout, &nsid);
 -      if (cfg.flbas != 0xFF && cfg.bs != 0x00) {
++      if (cfg.flbas != 0xff && cfg.bs != 0x00) {
+               fprintf(stderr,
 -                      "Invalid specification fo both FLBAS and Block Size, please specify only one\n");
++                      "Invalid specification of both FLBAS and Block Size, please specify only one\n");
+                       return EINVAL;
+       }
 -
 -      if (cfg.flbas == 0xFF) {
 -              fprintf(stderr,
 -                      "FLBAS corresponding to block size %llu not found\n", cfg.bs);
 -              fprintf(stderr,
 -                      "Please correct block size, or specify FLBAS directly\n");
 -              return EINVAL;
 -      }
 -
+       if (cfg.bs) {
+               if ((cfg.bs & (~cfg.bs + 1)) != cfg.bs) {
+                       fprintf(stderr,
+                               "Invalid value for block size (%llu). Block size must be a power of two\n", cfg.bs);
+                       return EINVAL;
+               }
+               err = nvme_identify_ns(fd, NVME_NSID_ALL, 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;
+               }
+               for (i = 0; i < 16; ++i) {
+                       if ((1 << ns.lbaf[i].ds) == cfg.bs && ns.lbaf[i].ms == 0) {
+                               cfg.flbas = i;
+                               break;
+                       }
+               }
+       }
++      if (cfg.flbas == 0xff) {
++              fprintf(stderr,
++                      "FLBAS corresponding to block size %llu not found\n", cfg.bs);
++              fprintf(stderr,
++                      "Please correct block size, or specify FLBAS directly\n");
++              return EINVAL;
++      }
 -      err = nvme_ns_create(fd, cfg.nsze, cfg.ncap, cfg.flbas, cfg.dps, cfg.nmic, &nsid);
++      err = nvme_ns_create(fd, cfg.nsze, cfg.ncap, cfg.flbas, cfg.dps,
++                           cfg.nmic, cfg.timeout, &nsid);
        if (!err)
                printf("%s: Success, created nsid:%d\n", cmd->name, nsid);
        else if (err > 0)
@@@ -3077,25 -3115,28 +3122,46 @@@ static int format(int argc, char **argv
                        return err;
                }
                prev_lbaf = ns.flbas & 0xf;
 +
 +              if (cfg.bs) {
 +                      for (i = 0; i < 16; ++i) {
 +                              if ((1ULL << ns.lbaf[i].ds) == cfg.bs &&
 +                                  ns.lbaf[i].ms == 0) {
 +                                      cfg.lbaf = i;
 +                                      break;
 +                              }
 +                      }
 +                      if (cfg.lbaf == 0xff) {
 +                              fprintf(stderr,
 +                                      "LBAF corresponding to block size %"PRIu64"(LBAF %u) not found\n",
 +                                      (uint64_t)cfg.bs, lbads);
 +                              fprintf(stderr,
 +                                      "Please correct block size, or specify LBAF directly\n");
 +                              return EINVAL;
 +                      }
 +              }
        }
+       if (cfg.bs) {
+               __u64 bs = cfg.bs;
+               bs = bs >> 1;
+               while (bs) {
+                       ++lbads;
+                       bs = bs >> 1;
+               }
+               for (i=0; i<16; ++i) {
+                       if (ns.lbaf[i].ds == lbads && ns.lbaf[i].ms == 0) {
+                               cfg.lbaf = i;
+                               break;
+                       }
+               }
+                       if (cfg.lbaf == 0xff) {
+                               fprintf(stderr,
+                                       "LBAF corresponding to block size %llu (LBAF %u) not found\n", cfg.bs, lbads);
+                               fprintf(stderr,
+                                       "Please correct block size, or specify LBAF directly\n");
+                               return EINVAL;
+                       }
+       }
        if (cfg.lbaf == 0xff)
                cfg.lbaf = prev_lbaf;