@@ -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
467510int 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
478521int 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