@@ -991,15 +991,15 @@ static void test_copy(void)
991991 __u16 nlbs [TEST_COPY_NR ] = { 0xa , 0xb , 0xc };
992992 __u64 slbas [TEST_COPY_NR ] = { 0x1000 , 0x20000000 , 0x300040000000 };
993993 __u32 short_pi [TEST_COPY_NR ] = { 0x1000 , 0x20000000 , 0x40000000 };
994- __u32 elbatms [TEST_COPY_NR ] = { 0x1ff , 0x3ff , 0x3ff };
995- __u32 elbats [TEST_COPY_NR ] = { 0x111 , 0x222 , 0x333 };
994+ __u16 elbatms [TEST_COPY_NR ] = { 0x1ff , 0x3ff , 0x3ff };
995+ __u16 elbats [TEST_COPY_NR ] = { 0x111 , 0x222 , 0x333 };
996996 __u8 expected_data [sizeof (struct nvme_copy_range_f0 ) * TEST_COPY_NR ] = {
997997 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0 , 0 , 0 , 0 , 0 , 0 ,
998- 0xa , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0 , 0 , 0x11 , 1 , 0xff , 1 ,
998+ 0xa , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0 , 1 , 0x11 , 1 , 0xff ,
999999 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x20 , 0 , 0 , 0 , 0 ,
1000- 0xb , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x20 , 0x22 , 2 , 0xff , 3 ,
1000+ 0xb , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x20 , 0 , 0 , 0 , 2 , 0x22 , 3 , 0xff ,
10011001 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x40 , 0 , 0x30 , 0 , 0 ,
1002- 0xc , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x40 , 0x33 , 3 , 0xff , 3
1002+ 0xc , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x40 , 0 , 0 , 0 , 3 , 0x33 , 3 , 0xff
10031003 };
10041004
10051005 _cleanup_free_ struct nvme_copy_range_f0 * copy = NULL ;
@@ -1034,6 +1034,63 @@ static void test_copy(void)
10341034 check (cmd .result == 0 , "returned result %" PRIu64 , (uint64_t )cmd .result );
10351035}
10361036
1037+ static void test_copy_range_f1 (void )
1038+ {
1039+ __u16 nr = TEST_COPY_NR , cev = 0 , dspec = 0 ;
1040+ int copy_size = sizeof (struct nvme_copy_range_f1 ) * nr , err ;
1041+ bool prinfor = false, prinfow = false, stcw = false,
1042+ stcr = false, fua = false, lr = false;
1043+ __u8 cetype = 0 , dtype = 0 , desfmt = 0x1 ;
1044+ __u64 sdlba = 0xfffff ;
1045+ __u16 nlbs [TEST_COPY_NR ] = { 0xa , 0xb , 0xc };
1046+ __u64 slbas [TEST_COPY_NR ] = { 0x1000 , 0x20000000 , 0x300040000000 };
1047+ __u64 long_pi [TEST_COPY_NR ] = { 0x1000 , 0x20000000 , 0x40000000 };
1048+ __u16 elbatms [TEST_COPY_NR ] = { 0x1ff , 0x3ff , 0x3ff };
1049+ __u16 elbats [TEST_COPY_NR ] = { 0x111 , 0x222 , 0x333 };
1050+ __u8 expected_data [sizeof (struct nvme_copy_range_f1 ) * TEST_COPY_NR ] = {
1051+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x10 , 0 , 0 , 0 , 0 , 0 , 0 ,
1052+ 0xa , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1053+ 0 , 0 , 0x10 , 0 , 1 , 0x11 , 1 , 0xff , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1054+ 0 , 0 , 0 , 0x20 , 0 , 0 , 0 , 0 , 0xb , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1055+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x20 , 0 , 0 , 0 , 2 , 0x22 , 3 , 0xff ,
1056+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0x40 , 0 , 0x30 , 0 , 0 ,
1057+ 0xc , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1058+ 0x40 , 0 , 0 , 0 , 3 , 0x33 , 3 , 0xff
1059+ };
1060+
1061+ _cleanup_free_ struct nvme_copy_range_f1 * copy = NULL ;
1062+
1063+ copy = calloc (1 , copy_size );
1064+ check (copy , "copy: ENOMEM" );
1065+
1066+ struct mock_cmd mock_io_cmd = {
1067+ .opcode = nvme_cmd_copy ,
1068+ .nsid = TEST_NSID ,
1069+ .cdw10 = sdlba & 0xffffffff ,
1070+ .cdw11 = sdlba >> 32 ,
1071+ .cdw12 = ((nr - 1 ) & 0xff ) | ((desfmt & 0xf ) << 8 ) |
1072+ ((prinfor & 0xf ) << 12 ) |
1073+ ((dtype & 0xf ) << 20 ) |
1074+ ((prinfow & 0xf ) << 26 ) |
1075+ ((fua & 0x1 ) << 30 ) | ((lr & 0x1 ) << 31 ),
1076+ .data_len = nr * sizeof (struct nvme_copy_range_f1 ),
1077+ .in_data = expected_data ,
1078+ };
1079+ struct nvme_passthru_cmd cmd ;
1080+
1081+ set_mock_io_cmds (& mock_io_cmd , 1 );
1082+ nvme_init_copy_range_f1 (copy , nlbs , slbas , long_pi , elbatms , elbats ,
1083+ nr );
1084+ nvme_init_copy (& cmd , TEST_NSID , sdlba , nr , desfmt ,
1085+ prinfor , prinfow , cetype , dtype , stcw , stcr ,
1086+ fua , lr , cev , dspec , (void * )copy );
1087+ err = nvme_submit_io_passthru (test_hdl , & cmd );
1088+ end_mock_cmds ();
1089+ check (err == 0 , "returned error %d" , err );
1090+ check (cmd .result == 0 , "returned result %" PRIu64 ,
1091+ (uint64_t )cmd .result );
1092+ }
1093+
10371094static void test_resv_acquire (void )
10381095{
10391096 enum nvme_resv_rtype rtype = NVME_RESERVATION_RTYPE_EAAR ;
@@ -1448,6 +1505,7 @@ int main(void)
14481505 RUN_TEST (verify );
14491506 RUN_TEST (dsm );
14501507 RUN_TEST (copy );
1508+ RUN_TEST (copy_range_f1 );
14511509 RUN_TEST (resv_acquire );
14521510 RUN_TEST (resv_register );
14531511 RUN_TEST (resv_release );
0 commit comments