Skip to content

Commit 2afd197

Browse files
committed
nvme: use blkdev for direct if namespace-id specified
Since IO commands rejected by the chardev if more than one namespace. Signed-off-by: Tokunori Ikegami <[email protected]>
1 parent fe3b962 commit 2afd197

File tree

1 file changed

+48
-9
lines changed

1 file changed

+48
-9
lines changed

nvme.c

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,44 @@ static bool is_blkdev(struct nvme_dev *dev)
299299
return S_ISBLK(dev->direct.stat.st_mode);
300300
}
301301

302-
static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags)
302+
static bool is_nvme_dev(char *dev)
303+
{
304+
int instance;
305+
int head_instance;
306+
307+
return sscanf(basename(dev), "nvme%dn%d", &instance, &head_instance) == 1;
308+
}
309+
310+
static __u32 get_nsid(struct argconfig_commandline_options *opts)
311+
{
312+
__u32 *nsid = argconfig_get_value(opts, "namespace-id");
313+
314+
if (nsid && *nsid != NVME_NSID_ALL)
315+
return *nsid;
316+
317+
return NVME_NSID_NONE;
318+
}
319+
320+
static int open_blkdev_direct(char *dev, int flags, __u32 nsid)
321+
{
322+
_cleanup_free_ char *blkdev = NULL;
323+
int fd = -1;
324+
325+
if (is_nvme_dev(dev) && nsid) {
326+
if (asprintf(&blkdev, "%sn%d", dev, nsid) < 0)
327+
blkdev = NULL;
328+
}
329+
330+
if (blkdev)
331+
fd = open(blkdev, flags);
332+
333+
if (fd < 0)
334+
fd = open(dev, flags);
335+
336+
return fd;
337+
}
338+
339+
static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags, __u32 nsid)
303340
{
304341
struct nvme_dev *dev;
305342
int err;
@@ -310,7 +347,7 @@ static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags)
310347

311348
dev->type = NVME_DEV_DIRECT;
312349
dev->name = basename(devstr);
313-
err = open(devstr, flags);
350+
err = open_blkdev_direct(devstr, flags, nsid);
314351
if (err < 0) {
315352
nvme_show_perror(devstr);
316353
goto err_free;
@@ -412,10 +449,12 @@ static int check_arg_dev(int argc, char **argv)
412449
return 0;
413450
}
414451

415-
static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags)
452+
static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags,
453+
struct argconfig_commandline_options *opts)
416454
{
417455
char *devname;
418456
int ret;
457+
__u32 nsid = get_nsid(opts);
419458

420459
ret = check_arg_dev(argc, argv);
421460
if (ret)
@@ -427,7 +466,7 @@ static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags)
427466
if (!strncmp(devname, "mctp:", strlen("mctp:")))
428467
ret = open_dev_mi_mctp(dev, devname);
429468
else
430-
ret = open_dev_direct(dev, devname, flags);
469+
ret = open_dev_direct(dev, devname, flags, nsid);
431470

432471
return ret ? -errno : 0;
433472
}
@@ -457,22 +496,22 @@ int parse_and_open(struct nvme_dev **dev, int argc, char **argv,
457496
if (ret)
458497
return ret;
459498

460-
ret = get_dev(dev, argc, argv, O_RDONLY);
499+
ret = get_dev(dev, argc, argv, O_RDONLY, opts);
461500
if (ret < 0)
462501
argconfig_print_help(desc, opts);
463502

464503
return ret;
465504
}
466505

467506
int open_exclusive(struct nvme_dev **dev, int argc, char **argv,
468-
int ignore_exclusive)
507+
int ignore_exclusive, struct argconfig_commandline_options *opts)
469508
{
470509
int flags = O_RDONLY;
471510

472511
if (!ignore_exclusive)
473512
flags |= O_EXCL;
474513

475-
return get_dev(dev, argc, argv, flags);
514+
return get_dev(dev, argc, argv, flags, opts);
476515
}
477516

478517
int validate_output_format(const char *format, nvme_print_flags_t *flags)
@@ -6182,7 +6221,7 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin
61826221
if (err)
61836222
return err;
61846223

6185-
err = open_exclusive(&dev, argc, argv, cfg.force);
6224+
err = open_exclusive(&dev, argc, argv, cfg.force, opts);
61866225
if (err) {
61876226
if (errno == EBUSY) {
61886227
fprintf(stderr, "Failed to open %s.\n", basename(argv[optind]));
@@ -7863,7 +7902,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
78637902
err = parse_args(argc, argv, desc, opts);
78647903
if (err)
78657904
return err;
7866-
err = open_exclusive(&dev, argc, argv, cfg.force);
7905+
err = open_exclusive(&dev, argc, argv, cfg.force, opts);
78677906
if (err) {
78687907
if (errno == EBUSY) {
78697908
fprintf(stderr, "Failed to open %s.\n", basename(argv[optind]));

0 commit comments

Comments
 (0)