@@ -7974,23 +7974,24 @@ unsigned long long elapsed_utime(struct timeval start_time,
79747974
79757975static int submit_io (int opcode , char * command , const char * desc , int argc , char * * argv )
79767976{
7977+ _cleanup_nvme_transport_handle_ struct nvme_transport_handle * hdl = NULL ;
7978+ _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
7979+ unsigned long long buffer_size = 0 , mbuffer_size = 0 ;
7980+ _cleanup_free_ struct nvme_nvm_id_ns * nvm_ns = NULL ;
7981+ _cleanup_huge_ struct nvme_mem_huge mh = { 0 , };
7982+ _cleanup_free_ struct nvme_id_ns * ns = NULL ;
7983+ unsigned int logical_block_size = 0 ;
79777984 struct timeval start_time , end_time ;
7978- void * buffer ;
79797985 _cleanup_free_ void * mbuffer = NULL ;
7980- int err = 0 ;
79817986 _cleanup_fd_ int dfd = -1 , mfd = -1 ;
7982- int flags , pi_size ;
7983- int mode = 0644 ;
7987+ __u8 lba_index , sts = 0 , pif = 0 ;
79847988 __u16 control = 0 , nblocks = 0 ;
7989+ struct nvme_passthru_cmd cmd ;
7990+ int flags , pi_size ;
79857991 __u32 dsmgmt = 0 ;
7986- unsigned int logical_block_size = 0 ;
7987- unsigned long long buffer_size = 0 , mbuffer_size = 0 ;
7988- _cleanup_huge_ struct nvme_mem_huge mh = { 0 , };
7989- _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
7990- _cleanup_nvme_transport_handle_ struct nvme_transport_handle * hdl = NULL ;
7991- _cleanup_free_ struct nvme_nvm_id_ns * nvm_ns = NULL ;
7992- _cleanup_free_ struct nvme_id_ns * ns = NULL ;
7993- __u8 lba_index , sts = 0 , pif = 0 ;
7992+ int mode = 0644 ;
7993+ void * buffer ;
7994+ int err = 0 ;
79947995 __u16 ms ;
79957996
79967997 const char * start_block_addr = "64-bit addr of first block to access" ;
@@ -8090,8 +8091,10 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
80908091 err = open_exclusive (& ctx , & hdl , argc , argv , cfg .force );
80918092 if (err ) {
80928093 if (err == - EBUSY ) {
8093- fprintf (stderr , "Failed to open %s.\n" , basename (argv [optind ]));
8094- fprintf (stderr , "Namespace is currently busy.\n" );
8094+ fprintf (stderr , "Failed to open %s.\n" ,
8095+ basename (argv [optind ]));
8096+ fprintf (stderr ,
8097+ "Namespace is currently busy.\n" );
80958098 if (!cfg .force )
80968099 fprintf (stderr ,
80978100 "Use the force [--force] option to ignore that.\n" );
@@ -8105,7 +8108,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81058108 if (!cfg .namespace_id ) {
81068109 err = nvme_get_nsid (hdl , & cfg .namespace_id );
81078110 if (err < 0 ) {
8108- nvme_show_error ("get-namespace-id: %s" , nvme_strerror (- err ));
8111+ nvme_show_error ("get-namespace-id: %s" ,
8112+ nvme_strerror (- err ));
81098113 return err ;
81108114 }
81118115 }
@@ -8123,7 +8127,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81238127 control |= NVME_IO_STC ;
81248128 if (cfg .dtype ) {
81258129 if (cfg .dtype > 0xf ) {
8126- nvme_show_error ("Invalid directive type, %x" , cfg .dtype );
8130+ nvme_show_error ("Invalid directive type, %x" ,
8131+ cfg .dtype );
81278132 return - EINVAL ;
81288133 }
81298134 control |= cfg .dtype << 4 ;
@@ -8198,19 +8203,26 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
81988203
81998204 buffer_size = ((long long )cfg .block_count + 1 ) * logical_block_size ;
82008205 if (cfg .data_size < buffer_size )
8201- nvme_show_error ("Rounding data size to fit block count (%lld bytes)" , buffer_size );
8206+ nvme_show_error (
8207+ "Rounding data size to fit block count (%lld bytes)" ,
8208+ buffer_size );
82028209 else
82038210 buffer_size = cfg .data_size ;
82048211
82058212 if (argconfig_parse_seen (opts , "block-count" )) {
82068213 /* Use the value provided */
82078214 nblocks = cfg .block_count ;
82088215 } else {
8209- /* Get the required block count. Note this is a zeroes based value. */
8210- nblocks = ((buffer_size + (logical_block_size - 1 )) / logical_block_size ) - 1 ;
8216+ /*
8217+ * Get the required block count. Note this is a zeroes based
8218+ * value.
8219+ */
8220+ nblocks = ((buffer_size + (logical_block_size - 1 )) /
8221+ logical_block_size ) - 1 ;
82118222
82128223 /* Update the data size based on the required block count */
8213- buffer_size = ((unsigned long long )nblocks + 1 ) * logical_block_size ;
8224+ buffer_size = ((unsigned long long )nblocks + 1 ) *
8225+ logical_block_size ;
82148226 }
82158227
82168228 buffer = nvme_alloc_huge (buffer_size , & mh );
@@ -8222,8 +8234,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82228234 if (cfg .metadata_size ) {
82238235 mbuffer_size = ((unsigned long long )cfg .block_count + 1 ) * ms ;
82248236 if (ms && cfg .metadata_size < mbuffer_size )
8225- nvme_show_error ("Rounding metadata size to fit block count (%lld bytes)" ,
8226- mbuffer_size );
8237+ nvme_show_error (
8238+ "Rounding metadata size to fit block count (%lld bytes)" ,
8239+ mbuffer_size );
82278240 else
82288241 mbuffer_size = cfg .metadata_size ;
82298242
@@ -8240,7 +8253,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82408253 err = read (dfd , (void * )buffer , cfg .data_size );
82418254 if (err < 0 ) {
82428255 err = - errno ;
8243- nvme_show_error ("failed to read data buffer from input file %s" , strerror (errno ));
8256+ nvme_show_error (
8257+ "failed to read data buffer from input file %s" ,
8258+ strerror (errno ));
82448259 return err ;
82458260 }
82468261 }
@@ -8249,7 +8264,9 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82498264 err = read (mfd , (void * )mbuffer , mbuffer_size );
82508265 if (err < 0 ) {
82518266 err = - errno ;
8252- nvme_show_error ("failed to read meta-data buffer from input file %s" , strerror (errno ));
8267+ nvme_show_error (
8268+ "failed to read meta-data buffer from input file %s" ,
8269+ strerror (errno ));
82538270 return err ;
82548271 }
82558272 }
@@ -8260,55 +8277,57 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
82608277 printf ("flags : %02x\n" , 0 );
82618278 printf ("control : %04x\n" , control );
82628279 printf ("nblocks : %04x\n" , nblocks );
8263- printf ("metadata : %" PRIx64 "\n" , (uint64_t )(uintptr_t )mbuffer );
8264- printf ("addr : %" PRIx64 "\n" , (uint64_t )(uintptr_t )buffer );
8265- printf ("slba : %" PRIx64 "\n" , (uint64_t )cfg .start_block );
8280+ printf ("metadata : %" PRIx64 "\n" ,
8281+ (uint64_t )(uintptr_t )mbuffer );
8282+ printf ("addr : %" PRIx64 "\n" ,
8283+ (uint64_t )(uintptr_t )buffer );
8284+ printf ("slba : %" PRIx64 "\n" ,
8285+ (uint64_t )cfg .start_block );
82668286 printf ("dsmgmt : %08x\n" , dsmgmt );
8267- printf ("reftag : %" PRIx64 "\n" , (uint64_t )cfg .ref_tag );
8287+ printf ("reftag : %" PRIx64 "\n" ,
8288+ (uint64_t )cfg .ref_tag );
82688289 printf ("apptag : %04x\n" , cfg .app_tag );
82698290 printf ("appmask : %04x\n" , cfg .app_tag_mask );
82708291 printf ("storagetagcheck : %04x\n" , cfg .storage_tag_check );
8271- printf ("storagetag : %" PRIx64 "\n" , (uint64_t )cfg .storage_tag );
8292+ printf ("storagetag : %" PRIx64 "\n" ,
8293+ (uint64_t )cfg .storage_tag );
82728294 printf ("pif : %02x\n" , pif );
82738295 printf ("sts : %02x\n" , sts );
82748296 }
82758297 if (nvme_cfg .dry_run )
82768298 return 0 ;
82778299
8278- struct nvme_io_args args = {
8279- .args_size = sizeof (args ),
8280- .nsid = cfg .namespace_id ,
8281- .slba = cfg .start_block ,
8282- .nlb = nblocks ,
8283- .control = control ,
8284- .dsm = cfg .dsmgmt ,
8285- .sts = sts ,
8286- .pif = pif ,
8287- .dspec = cfg .dspec ,
8288- .reftag = (__u32 )cfg .ref_tag ,
8289- .reftag_u64 = cfg .ref_tag ,
8290- .apptag = cfg .app_tag ,
8291- .appmask = cfg .app_tag_mask ,
8292- .storage_tag = cfg .storage_tag ,
8293- .data_len = buffer_size ,
8294- .data = buffer ,
8295- .metadata_len = mbuffer_size ,
8296- .metadata = mbuffer ,
8297- .timeout = nvme_cfg .timeout ,
8298- .result = NULL ,
8299- };
83008300 gettimeofday (& start_time , NULL );
8301- err = nvme_io (hdl , & args , opcode );
8301+ nvme_init_io (& cmd , opcode , cfg .namespace_id , cfg .start_block , buffer ,
8302+ buffer_size , mbuffer , mbuffer_size );
8303+ cmd .cdw12 = NVME_FIELD_ENCODE (nblocks ,
8304+ NVME_IOCS_COMMON_CDW12_NLB_SHIFT ,
8305+ NVME_IOCS_COMMON_CDW12_NLB_MASK ) |
8306+ NVME_FIELD_ENCODE (control ,
8307+ NVME_IOCS_COMMON_CDW12_CONTROL_SHIFT ,
8308+ NVME_IOCS_COMMON_CDW12_CONTROL_MASK );
8309+ cmd .cdw13 = NVME_FIELD_ENCODE (cfg .dspec ,
8310+ NVME_IOCS_COMMON_CDW13_DSPEC_SHIFT ,
8311+ NVME_IOCS_COMMON_CDW13_DSPEC_MASK ) |
8312+ NVME_FIELD_ENCODE (cfg .dsmgmt ,
8313+ NVME_IOCS_COMMON_CDW13_DSM_SHIFT ,
8314+ NVME_IOCS_COMMON_CDW13_DSM_MASK );
8315+ nvme_init_var_size_tags (& cmd , pif , sts , cfg .ref_tag , cfg .storage_tag );
8316+ nvme_init_app_tag (& cmd , cfg .app_tag , cfg .app_tag_mask );
8317+ err = nvme_submit_admin_passthru (hdl , & cmd , NULL );
83028318 gettimeofday (& end_time , NULL );
83038319 if (cfg .latency )
8304- printf (" latency: %s: %llu us\n" , command , elapsed_utime (start_time , end_time ));
8320+ printf (" latency: %s: %llu us\n" ,
8321+ command , elapsed_utime (start_time , end_time ));
83058322 if (err < 0 ) {
83068323 nvme_show_error ("submit-io: %s" , nvme_strerror (- err ));
83078324 } else if (err ) {
83088325 nvme_show_status (err );
83098326 } else {
8310- if (!(opcode & 1 ) && write (dfd , (void * )buffer , buffer_size ) < 0 ) {
8311- nvme_show_error ("write: %s: failed to write buffer to output file" ,
8327+ if (!(opcode & 1 ) &&
8328+ write (dfd , (void * )buffer , buffer_size ) < 0 ) {
8329+ nvme_show_error (
8330+ "write: %s: failed to write buffer to output file" ,
83128331 strerror (errno ));
83138332 err = - EINVAL ;
83148333 } else if (!(opcode & 1 ) && cfg .metadata_size &&
0 commit comments