Skip to content

Commit 9d71d55

Browse files
ikegami-tigaw
authored andcommitted
libnvme/cmds: change copy desc format tags to big-endian
Change the elbt, elbat and albatm tag fields byte ordering. Signed-off-by: Tokunori Ikegami <[email protected]>
1 parent ee2cd59 commit 9d71d55

4 files changed

Lines changed: 101 additions & 55 deletions

File tree

libnvme/src/nvme/cmds.h

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5235,22 +5235,6 @@ nvme_init_dsm_range(struct nvme_dsm_range *dsm, __u32 *ctx_attrs,
52355235
}
52365236
}
52375237

5238-
/**
5239-
* nvme_init_copy_range_elbt() - Constructs a copy range elbt structure
5240-
* @elbt:
5241-
* @eilbrts: Expected initial logical block reference tag
5242-
*/
5243-
static inline void
5244-
nvme_init_copy_range_elbt(__u8 *elbt, __u64 eilbrt)
5245-
{
5246-
int i;
5247-
5248-
for (i = 0; i < 8; i++)
5249-
elbt[9 - i] = (eilbrt >> (8 * i)) & 0xff;
5250-
elbt[1] = 0;
5251-
elbt[0] = 0;
5252-
}
5253-
52545238
/**
52555239
* nvme_init_copy_range_f0() - Constructs a copy range structure
52565240
* @copy: Copy range array
@@ -5263,17 +5247,17 @@ nvme_init_copy_range_elbt(__u8 *elbt, __u64 eilbrt)
52635247
*/
52645248
static inline void
52655249
nvme_init_copy_range_f0(struct nvme_copy_range_f0 *copy, __u16 *nlbs,
5266-
__u64 *slbas, __u32 *elbts, __u32 *elbatms,
5267-
__u32 *elbats, __u16 nr)
5250+
__u64 *slbas, __u32 *elbts, __u16 *elbatms,
5251+
__u16 *elbats, __u16 nr)
52685252
{
52695253
int i;
52705254

52715255
for (i = 0; i < nr; i++) {
52725256
copy[i].nlb = htole16(nlbs[i]);
52735257
copy[i].slba = htole64(slbas[i]);
5274-
copy[i].elbt = htole32(elbts[i]);
5275-
copy[i].elbatm = htole16(elbatms[i]);
5276-
copy[i].elbat = htole16(elbats[i]);
5258+
copy[i].elbt = htobe32(elbts[i]);
5259+
copy[i].elbatm = htobe16(elbatms[i]);
5260+
copy[i].elbat = htobe16(elbats[i]);
52775261
}
52785262
}
52795263

@@ -5289,17 +5273,19 @@ nvme_init_copy_range_f0(struct nvme_copy_range_f0 *copy, __u16 *nlbs,
52895273
*/
52905274
static inline void
52915275
nvme_init_copy_range_f1(struct nvme_copy_range_f1 *copy, __u16 *nlbs,
5292-
__u64 *slbas, __u64 *eilbrts, __u32 *elbatms,
5293-
__u32 *elbats, __u16 nr)
5276+
__u64 *slbas, __u64 *eilbrts, __u16 *elbatms,
5277+
__u16 *elbats, __u16 nr)
52945278
{
52955279
int i;
52965280

5281+
memset(copy, 0, sizeof(*copy) * nr);
5282+
52975283
for (i = 0; i < nr; i++) {
52985284
copy[i].nlb = htole16(nlbs[i]);
52995285
copy[i].slba = htole64(slbas[i]);
5300-
copy[i].elbatm = htole16(elbatms[i]);
5301-
copy[i].elbat = htole16(elbats[i]);
5302-
nvme_init_copy_range_elbt(copy[i].elbt, eilbrts[i]);
5286+
*(__be64 *)&copy[i].elbt[2] = htobe64(eilbrts[i]);
5287+
copy[i].elbatm = htobe16(elbatms[i]);
5288+
copy[i].elbat = htobe16(elbats[i]);
53035289
}
53045290
}
53055291

@@ -5310,15 +5296,15 @@ nvme_init_copy_range_f1(struct nvme_copy_range_f1 *copy, __u16 *nlbs,
53105296
* @nlbs: Number of logical blocks
53115297
* @slbas: Starting LBA
53125298
* @sopts: Source options
5313-
* @eilbrts: Expected initial logical block reference tag
5299+
* @elbts: Expected initial logical block reference tag
53145300
* @elbatms: Expected logical block application tag mask
53155301
* @elbats: Expected logical block application tag
53165302
* @nr: Number of descriptors to construct
53175303
*/
53185304
static inline void
53195305
nvme_init_copy_range_f2(struct nvme_copy_range_f2 *copy,
53205306
__u32 *snsids, __u16 *nlbs, __u64 *slbas, __u16 *sopts,
5321-
__u32 *eilbrts, __u32 *elbatms, __u32 *elbats,
5307+
__u32 *elbts, __u16 *elbatms, __u16 *elbats,
53225308
__u16 nr)
53235309
{
53245310
int i;
@@ -5328,9 +5314,9 @@ nvme_init_copy_range_f2(struct nvme_copy_range_f2 *copy,
53285314
copy[i].nlb = htole16(nlbs[i]);
53295315
copy[i].slba = htole64(slbas[i]);
53305316
copy[i].sopt = htole16(sopts[i]);
5331-
copy[i].eilbrt = htole32(eilbrts[i]);
5332-
copy[i].elbatm = htole16(elbatms[i]);
5333-
copy[i].elbat = htole16(elbats[i]);
5317+
copy[i].elbt = htobe32(elbts[i]);
5318+
copy[i].elbatm = htobe16(elbatms[i]);
5319+
copy[i].elbat = htobe16(elbats[i]);
53345320
}
53355321
}
53365322

@@ -5349,19 +5335,21 @@ nvme_init_copy_range_f2(struct nvme_copy_range_f2 *copy,
53495335
static inline void
53505336
nvme_init_copy_range_f3(struct nvme_copy_range_f3 *copy, __u32 *snsids,
53515337
__u16 *nlbs, __u64 *slbas, __u16 *sopts,
5352-
__u64 *eilbrts, __u32 *elbatms, __u32 *elbats,
5338+
__u64 *eilbrts, __u16 *elbatms, __u16 *elbats,
53535339
__u16 nr)
53545340
{
53555341
int i;
53565342

5343+
memset(copy, 0, sizeof(*copy) * nr);
5344+
53575345
for (i = 0; i < nr; i++) {
53585346
copy[i].snsid = htole32(snsids[i]);
53595347
copy[i].nlb = htole16(nlbs[i]);
53605348
copy[i].slba = htole64(slbas[i]);
53615349
copy[i].sopt = htole16(sopts[i]);
5362-
copy[i].elbatm = htole16(elbatms[i]);
5363-
copy[i].elbat = htole16(elbats[i]);
5364-
nvme_init_copy_range_elbt(copy[i].elbt, eilbrts[i]);
5350+
*(__be64 *)&copy[i].elbt[2] = htobe64(eilbrts[i]);
5351+
copy[i].elbatm = htobe16(elbatms[i]);
5352+
copy[i].elbat = htobe16(elbats[i]);
53655353
}
53665354
}
53675355

libnvme/src/nvme/types.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6457,9 +6457,9 @@ struct nvme_copy_range_f0 {
64576457
__u8 rsvd19;
64586458
__le16 cev;
64596459
__u8 rsvd22[2];
6460-
__le32 elbt;
6461-
__le16 elbat;
6462-
__le16 elbatm;
6460+
__be32 elbt;
6461+
__be16 elbat;
6462+
__be16 elbatm;
64636463
};
64646464

64656465
/**
@@ -6485,8 +6485,8 @@ struct nvme_copy_range_f1 {
64856485
__le16 cev;
64866486
__u8 rsvd22[4];
64876487
__u8 elbt[10];
6488-
__le16 elbat;
6489-
__le16 elbatm;
6488+
__be16 elbat;
6489+
__be16 elbatm;
64906490
};
64916491

64926492
/**
@@ -6507,7 +6507,7 @@ enum nvme_copy_range_sopt {
65076507
* @rsvd19: Reserved
65086508
* @cev: Command Extension Value
65096509
* @sopt: Source Options
6510-
* @eilbrt: Expected Initial Logical Block Reference Tag /
6510+
* @elbt: Expected Initial Logical Block Reference Tag /
65116511
* Expected Logical Block Storage Tag
65126512
* @elbatm: Expected Logical Block Application Tag Mask
65136513
* @elbat: Expected Logical Block Application Tag
@@ -6521,9 +6521,9 @@ struct nvme_copy_range_f2 {
65216521
__u8 rsvd19;
65226522
__le16 cev;
65236523
__le16 sopt;
6524-
__le32 eilbrt;
6525-
__le16 elbat;
6526-
__le16 elbatm;
6524+
__be32 elbt;
6525+
__be16 elbat;
6526+
__be16 elbatm;
65276527
};
65286528

65296529
/**
@@ -6553,8 +6553,8 @@ struct nvme_copy_range_f3 {
65536553
__le16 sopt;
65546554
__u8 rsvd24[2];
65556555
__u8 elbt[10];
6556-
__le16 elbat;
6557-
__le16 elbatm;
6556+
__be16 elbat;
6557+
__be16 elbatm;
65586558
};
65596559

65606560
/**

libnvme/test/ioctl/misc.c

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
10371094
static 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);

nvme.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7766,8 +7766,8 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
77667766
__u64 long_pi[256];
77677767
} eilbrts;
77687768

7769-
__u32 elbatms[256] = { 0 };
7770-
__u32 elbats[256] = { 0 };
7769+
__u16 elbatms[256] = { 0 };
7770+
__u16 elbats[256] = { 0 };
77717771

77727772
_cleanup_free_ union {
77737773
struct nvme_copy_range_f0 f0[256];
@@ -7876,9 +7876,9 @@ static int copy_cmd(int argc, char **argv, struct command *acmd, struct plugin *
78767876
return -EINVAL;
78777877
}
78787878

7879-
natms = argconfig_parse_comma_sep_array_u32(cfg.elbatms, elbatms,
7879+
natms = argconfig_parse_comma_sep_array_u16(cfg.elbatms, elbatms,
78807880
ARRAY_SIZE(elbatms));
7881-
nats = argconfig_parse_comma_sep_array_u32(cfg.elbats, elbats,
7881+
nats = argconfig_parse_comma_sep_array_u16(cfg.elbats, elbats,
78827882
ARRAY_SIZE(elbats));
78837883

78847884
nr = max(nb, max(ns, max(nrts, max(natms, nats))));

0 commit comments

Comments
 (0)