@@ -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
467506int 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
478517int 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