@@ -339,7 +339,6 @@ static ssize_t getrandom_bytes(void *buf, size_t buflen)
339339#endif
340340}
341341
342-
343342static int check_arg_dev (int argc , char * * argv )
344343{
345344 if (optind >= argc ) {
@@ -7387,6 +7386,7 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
73877386 _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
73887387 _cleanup_nvme_transport_handle_ struct nvme_transport_handle * hdl = NULL ;
73897388 __u16 nr , nb , ns , nrts , natms , nats , nids ;
7389+ struct nvme_passthru_cmd cmd ;
73907390 __u16 nlbs [256 ] = { 0 };
73917391 __u64 slbas [256 ] = { 0 };
73927392 __u32 snsids [256 ] = { 0 };
@@ -7477,24 +7477,35 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
74777477 if (err )
74787478 return err ;
74797479
7480- nb = argconfig_parse_comma_sep_array_u16 (cfg .nlbs , nlbs , ARRAY_SIZE (nlbs ));
7481- ns = argconfig_parse_comma_sep_array_u64 (cfg .slbas , slbas , ARRAY_SIZE (slbas ));
7482- nids = argconfig_parse_comma_sep_array_u32 (cfg .snsids , snsids , ARRAY_SIZE (snsids ));
7483- argconfig_parse_comma_sep_array_u16 (cfg .sopts , sopts , ARRAY_SIZE (sopts ));
7484-
7485- if (cfg .format == 0 || cfg .format == 2 ) {
7486- nrts = argconfig_parse_comma_sep_array_u32 (cfg .eilbrts , eilbrts .short_pi ,
7487- ARRAY_SIZE (eilbrts .short_pi ));
7488- } else if (cfg .format == 1 || cfg .format == 3 ) {
7489- nrts = argconfig_parse_comma_sep_array_u64 (cfg .eilbrts , eilbrts .long_pi ,
7490- ARRAY_SIZE (eilbrts .long_pi ));
7491- } else {
7480+ nb = argconfig_parse_comma_sep_array_u16 (cfg .nlbs , nlbs ,
7481+ ARRAY_SIZE (nlbs ));
7482+ ns = argconfig_parse_comma_sep_array_u64 (cfg .slbas , slbas ,
7483+ ARRAY_SIZE (slbas ));
7484+ nids = argconfig_parse_comma_sep_array_u32 (cfg .snsids , snsids ,
7485+ ARRAY_SIZE (snsids ));
7486+ argconfig_parse_comma_sep_array_u16 (cfg .sopts , sopts ,
7487+ ARRAY_SIZE (sopts ));
7488+
7489+ switch (cfg .format ) {
7490+ case 0 :
7491+ case 2 :
7492+ nrts = argconfig_parse_comma_sep_array_u32 (cfg .eilbrts ,
7493+ eilbrts .short_pi , ARRAY_SIZE (eilbrts .short_pi ));
7494+ break ;
7495+ case 1 :
7496+ case 3 :
7497+ nrts = argconfig_parse_comma_sep_array_u64 (cfg .eilbrts ,
7498+ eilbrts .long_pi , ARRAY_SIZE (eilbrts .long_pi ));
7499+ break ;
7500+ default :
74927501 nvme_show_error ("invalid format" );
74937502 return - EINVAL ;
74947503 }
74957504
7496- natms = argconfig_parse_comma_sep_array_u32 (cfg .elbatms , elbatms , ARRAY_SIZE (elbatms ));
7497- nats = argconfig_parse_comma_sep_array_u32 (cfg .elbats , elbats , ARRAY_SIZE (elbats ));
7505+ natms = argconfig_parse_comma_sep_array_u32 (cfg .elbatms , elbatms ,
7506+ ARRAY_SIZE (elbatms ));
7507+ nats = argconfig_parse_comma_sep_array_u32 (cfg .elbats , elbats ,
7508+ ARRAY_SIZE (elbats ));
74987509
74997510 nr = max (nb , max (ns , max (nrts , max (natms , nats ))));
75007511 if (cfg .format == 2 || cfg .format == 3 ) {
@@ -7514,7 +7525,8 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
75147525 if (!cfg .namespace_id ) {
75157526 err = nvme_get_nsid (hdl , & cfg .namespace_id );
75167527 if (err < 0 ) {
7517- nvme_show_error ("get-namespace-id: %s" , nvme_strerror (- err ));
7528+ nvme_show_error ("get-namespace-id: %s" ,
7529+ nvme_strerror (- err ));
75187530 return err ;
75197531 }
75207532 }
@@ -7523,37 +7535,33 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
75237535 if (!copy )
75247536 return - ENOMEM ;
75257537
7526- if (cfg .format == 0 )
7527- nvme_init_copy_range (copy -> f0 , nlbs , slbas , eilbrts .short_pi , elbatms , elbats , nr );
7528- else if (cfg .format == 1 )
7529- nvme_init_copy_range_f1 (copy -> f1 , nlbs , slbas , eilbrts .long_pi , elbatms , elbats , nr );
7530- else if (cfg .format == 2 )
7531- nvme_init_copy_range_f2 (copy -> f2 , snsids , nlbs , slbas , sopts , eilbrts .short_pi , elbatms ,
7532- elbats , nr );
7533- else if (cfg .format == 3 )
7534- nvme_init_copy_range_f3 (copy -> f3 , snsids , nlbs , slbas , sopts , eilbrts .long_pi , elbatms ,
7535- elbats , nr );
7536-
7537- struct nvme_copy_args args = {
7538- .args_size = sizeof (args ),
7539- .nsid = cfg .namespace_id ,
7540- .copy = copy -> f0 ,
7541- .sdlba = cfg .sdlba ,
7542- .nr = nr ,
7543- .prinfor = cfg .prinfor ,
7544- .prinfow = cfg .prinfow ,
7545- .dtype = cfg .dtype ,
7546- .dspec = cfg .dspec ,
7547- .format = cfg .format ,
7548- .lr = cfg .lr ,
7549- .fua = cfg .fua ,
7550- .ilbrt_u64 = cfg .ilbrt ,
7551- .lbatm = cfg .lbatm ,
7552- .lbat = cfg .lbat ,
7553- .timeout = nvme_cfg .timeout ,
7554- .result = NULL ,
7555- };
7556- err = nvme_copy (hdl , & args );
7538+ switch (cfg .format ) {
7539+ case 1 :
7540+ nvme_init_copy_range_f1 (copy -> f1 , nlbs , slbas , eilbrts .long_pi ,
7541+ elbatms , elbats , nr );
7542+ break ;
7543+ case 2 :
7544+ nvme_init_copy_range_f2 (copy -> f2 , snsids , nlbs , slbas , sopts ,
7545+ eilbrts .short_pi , elbatms , elbats , nr );
7546+ break ;
7547+ case 3 :
7548+ nvme_init_copy_range_f3 (copy -> f3 , snsids , nlbs , slbas , sopts ,
7549+ eilbrts .long_pi , elbatms , elbats , nr );
7550+ break ;
7551+ default :
7552+ nvme_init_copy_range (copy -> f0 , nlbs , slbas , eilbrts .short_pi ,
7553+ elbatms , elbats , nr );
7554+ break ;
7555+ }
7556+
7557+ nvme_init_copy (& cmd , cfg .namespace_id , cfg .sdlba , nr , cfg .format ,
7558+ cfg .prinfor , cfg .prinfow , 0 , cfg .dtype , false, false,
7559+ cfg .fua , cfg .lr , 0 , cfg .dspec , copy -> f0 );
7560+ nvme_init_var_size_tags ((struct nvme_passthru_cmd64 * )& cmd ,
7561+ NVME_NVM_PIF_32B_GUARD , 0 , cfg .ilbrt , 0 );
7562+ nvme_init_app_tag ((struct nvme_passthru_cmd64 * )& cmd , cfg .lbat ,
7563+ cfg .lbatm );
7564+ err = nvme_submit_admin_passthru (hdl , & cmd , NULL );
75577565 if (err < 0 )
75587566 nvme_show_error ("NVMe Copy: %s" , nvme_strerror (- err ));
75597567 else if (err != 0 )
0 commit comments