Skip to content

Commit 565b30e

Browse files
ikegami-tigaw
authored andcommitted
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 cccefc4 commit 565b30e

1 file changed

Lines changed: 52 additions & 9 deletions

File tree

nvme.c

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,48 @@ 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+
print_info("blkdev: %s, fd: %d\n", blkdev, fd);
333+
}
334+
335+
if (fd < 0) {
336+
fd = open(dev, flags);
337+
print_info("dev: %s, fd: %d\n", dev, fd);
338+
}
339+
340+
return fd;
341+
}
342+
343+
static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags, __u32 nsid)
303344
{
304345
struct nvme_dev *dev;
305346
int err;
@@ -310,7 +351,7 @@ static int open_dev_direct(struct nvme_dev **devp, char *devstr, int flags)
310351

311352
dev->type = NVME_DEV_DIRECT;
312353
dev->name = basename(devstr);
313-
err = open(devstr, flags);
354+
err = open_blkdev_direct(devstr, flags, nsid);
314355
if (err < 0) {
315356
nvme_show_perror(devstr);
316357
goto err_free;
@@ -412,10 +453,12 @@ static int check_arg_dev(int argc, char **argv)
412453
return 0;
413454
}
414455

415-
static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags)
456+
static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags,
457+
struct argconfig_commandline_options *opts)
416458
{
417459
char *devname;
418460
int ret;
461+
__u32 nsid = get_nsid(opts);
419462

420463
ret = check_arg_dev(argc, argv);
421464
if (ret)
@@ -427,7 +470,7 @@ static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags)
427470
if (!strncmp(devname, "mctp:", strlen("mctp:")))
428471
ret = open_dev_mi_mctp(dev, devname);
429472
else
430-
ret = open_dev_direct(dev, devname, flags);
473+
ret = open_dev_direct(dev, devname, flags, nsid);
431474

432475
return ret ? -errno : 0;
433476
}
@@ -457,22 +500,22 @@ int parse_and_open(struct nvme_dev **dev, int argc, char **argv,
457500
if (ret)
458501
return ret;
459502

460-
ret = get_dev(dev, argc, argv, O_RDONLY);
503+
ret = get_dev(dev, argc, argv, O_RDONLY, opts);
461504
if (ret < 0)
462505
argconfig_print_help(desc, opts);
463506

464507
return ret;
465508
}
466509

467510
int open_exclusive(struct nvme_dev **dev, int argc, char **argv,
468-
int ignore_exclusive)
511+
int ignore_exclusive, struct argconfig_commandline_options *opts)
469512
{
470513
int flags = O_RDONLY;
471514

472515
if (!ignore_exclusive)
473516
flags |= O_EXCL;
474517

475-
return get_dev(dev, argc, argv, flags);
518+
return get_dev(dev, argc, argv, flags, opts);
476519
}
477520

478521
int validate_output_format(const char *format, nvme_print_flags_t *flags)
@@ -6202,7 +6245,7 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin
62026245
if (err)
62036246
return err;
62046247

6205-
err = open_exclusive(&dev, argc, argv, cfg.force);
6248+
err = open_exclusive(&dev, argc, argv, cfg.force, opts);
62066249
if (err) {
62076250
if (errno == EBUSY) {
62086251
fprintf(stderr, "Failed to open %s.\n", basename(argv[optind]));
@@ -7883,7 +7926,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
78837926
err = parse_args(argc, argv, desc, opts);
78847927
if (err)
78857928
return err;
7886-
err = open_exclusive(&dev, argc, argv, cfg.force);
7929+
err = open_exclusive(&dev, argc, argv, cfg.force, opts);
78877930
if (err) {
78887931
if (errno == EBUSY) {
78897932
fprintf(stderr, "Failed to open %s.\n", basename(argv[optind]));

0 commit comments

Comments
 (0)