@@ -338,7 +338,6 @@ static ssize_t getrandom_bytes(void *buf, size_t buflen)
338338 return result ;
339339}
340340
341-
342341static int check_arg_dev (int argc , char * * argv )
343342{
344343 if (optind >= argc ) {
@@ -7412,6 +7411,7 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
74127411 _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
74137412 _cleanup_nvme_transport_handle_ struct nvme_transport_handle * hdl = NULL ;
74147413 __u16 nr , nb , ns , nrts , natms , nats , nids ;
7414+ struct nvme_passthru_cmd cmd ;
74157415 __u16 nlbs [256 ] = { 0 };
74167416 __u64 slbas [256 ] = { 0 };
74177417 __u32 snsids [256 ] = { 0 };
@@ -7502,24 +7502,35 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
75027502 if (err )
75037503 return err ;
75047504
7505- nb = argconfig_parse_comma_sep_array_u16 (cfg .nlbs , nlbs , ARRAY_SIZE (nlbs ));
7506- ns = argconfig_parse_comma_sep_array_u64 (cfg .slbas , slbas , ARRAY_SIZE (slbas ));
7507- nids = argconfig_parse_comma_sep_array_u32 (cfg .snsids , snsids , ARRAY_SIZE (snsids ));
7508- argconfig_parse_comma_sep_array_u16 (cfg .sopts , sopts , ARRAY_SIZE (sopts ));
7509-
7510- if (cfg .format == 0 || cfg .format == 2 ) {
7511- nrts = argconfig_parse_comma_sep_array_u32 (cfg .eilbrts , eilbrts .short_pi ,
7512- ARRAY_SIZE (eilbrts .short_pi ));
7513- } else if (cfg .format == 1 || cfg .format == 3 ) {
7514- nrts = argconfig_parse_comma_sep_array_u64 (cfg .eilbrts , eilbrts .long_pi ,
7515- ARRAY_SIZE (eilbrts .long_pi ));
7516- } else {
7505+ nb = argconfig_parse_comma_sep_array_u16 (cfg .nlbs , nlbs ,
7506+ ARRAY_SIZE (nlbs ));
7507+ ns = argconfig_parse_comma_sep_array_u64 (cfg .slbas , slbas ,
7508+ ARRAY_SIZE (slbas ));
7509+ nids = argconfig_parse_comma_sep_array_u32 (cfg .snsids , snsids ,
7510+ ARRAY_SIZE (snsids ));
7511+ argconfig_parse_comma_sep_array_u16 (cfg .sopts , sopts ,
7512+ ARRAY_SIZE (sopts ));
7513+
7514+ switch (cfg .format ) {
7515+ case 0 :
7516+ case 2 :
7517+ nrts = argconfig_parse_comma_sep_array_u32 (cfg .eilbrts ,
7518+ eilbrts .short_pi , ARRAY_SIZE (eilbrts .short_pi ));
7519+ break ;
7520+ case 1 :
7521+ case 3 :
7522+ nrts = argconfig_parse_comma_sep_array_u64 (cfg .eilbrts ,
7523+ eilbrts .long_pi , ARRAY_SIZE (eilbrts .long_pi ));
7524+ break ;
7525+ default :
75177526 nvme_show_error ("invalid format" );
75187527 return - EINVAL ;
75197528 }
75207529
7521- natms = argconfig_parse_comma_sep_array_u32 (cfg .elbatms , elbatms , ARRAY_SIZE (elbatms ));
7522- nats = argconfig_parse_comma_sep_array_u32 (cfg .elbats , elbats , ARRAY_SIZE (elbats ));
7530+ natms = argconfig_parse_comma_sep_array_u32 (cfg .elbatms , elbatms ,
7531+ ARRAY_SIZE (elbatms ));
7532+ nats = argconfig_parse_comma_sep_array_u32 (cfg .elbats , elbats ,
7533+ ARRAY_SIZE (elbats ));
75237534
75247535 nr = max (nb , max (ns , max (nrts , max (natms , nats ))));
75257536 if (cfg .format == 2 || cfg .format == 3 ) {
@@ -7548,37 +7559,33 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
75487559 if (!copy )
75497560 return - ENOMEM ;
75507561
7551- if (cfg .format == 0 )
7552- nvme_init_copy_range (copy -> f0 , nlbs , slbas , eilbrts .short_pi , elbatms , elbats , nr );
7553- else if (cfg .format == 1 )
7554- nvme_init_copy_range_f1 (copy -> f1 , nlbs , slbas , eilbrts .long_pi , elbatms , elbats , nr );
7555- else if (cfg .format == 2 )
7556- nvme_init_copy_range_f2 (copy -> f2 , snsids , nlbs , slbas , sopts , eilbrts .short_pi , elbatms ,
7557- elbats , nr );
7558- else if (cfg .format == 3 )
7559- nvme_init_copy_range_f3 (copy -> f3 , snsids , nlbs , slbas , sopts , eilbrts .long_pi , elbatms ,
7560- elbats , nr );
7561-
7562- struct nvme_copy_args args = {
7563- .args_size = sizeof (args ),
7564- .nsid = cfg .namespace_id ,
7565- .copy = copy -> f0 ,
7566- .sdlba = cfg .sdlba ,
7567- .nr = nr ,
7568- .prinfor = cfg .prinfor ,
7569- .prinfow = cfg .prinfow ,
7570- .dtype = cfg .dtype ,
7571- .dspec = cfg .dspec ,
7572- .format = cfg .format ,
7573- .lr = cfg .lr ,
7574- .fua = cfg .fua ,
7575- .ilbrt_u64 = cfg .ilbrt ,
7576- .lbatm = cfg .lbatm ,
7577- .lbat = cfg .lbat ,
7578- .timeout = nvme_cfg .timeout ,
7579- .result = NULL ,
7580- };
7581- err = nvme_copy (hdl , & args );
7562+ switch (cfg .format ) {
7563+ case 1 :
7564+ nvme_init_copy_range_f1 (copy -> f1 , nlbs , slbas , eilbrts .long_pi ,
7565+ elbatms , elbats , nr );
7566+ break ;
7567+ case 2 :
7568+ nvme_init_copy_range_f2 (copy -> f2 , snsids , nlbs , slbas , sopts ,
7569+ eilbrts .short_pi , elbatms , elbats , nr );
7570+ break ;
7571+ case 3 :
7572+ nvme_init_copy_range_f3 (copy -> f3 , snsids , nlbs , slbas , sopts ,
7573+ eilbrts .long_pi , elbatms , elbats , nr );
7574+ break ;
7575+ default :
7576+ nvme_init_copy_range (copy -> f0 , nlbs , slbas , eilbrts .short_pi ,
7577+ elbatms , elbats , nr );
7578+ break ;
7579+ }
7580+
7581+ nvme_init_copy (& cmd , cfg .namespace_id , cfg .sdlba , nr , cfg .format ,
7582+ cfg .prinfor , cfg .prinfow , 0 , cfg .dtype , false, false,
7583+ cfg .fua , cfg .lr , 0 , cfg .dspec , copy -> f0 );
7584+ nvme_init_var_size_tags ((struct nvme_passthru_cmd64 * )& cmd ,
7585+ NVME_NVM_PIF_32B_GUARD , 0 , cfg .ilbrt , 0 );
7586+ nvme_init_app_tag ((struct nvme_passthru_cmd64 * )& cmd , cfg .lbat ,
7587+ cfg .lbatm );
7588+ err = nvme_submit_admin_passthru (hdl , & cmd , NULL );
75827589 if (err < 0 )
75837590 nvme_show_error ("NVMe Copy: %s" , nvme_strerror (err ));
75847591 else if (err != 0 )
0 commit comments