diff options
author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2013-04-16 15:21:06 -0400 |
---|---|---|
committer | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2013-04-16 15:21:06 -0400 |
commit | 1c9b52651dad0ff1fa71fc6205c86d972f25bcc0 (patch) | |
tree | 387be3d96798e7b5c4d35accd3067d4095552387 | |
parent | af2d9ca744af5e03390eeb3864d08ce75c860899 (diff) |
NVMe: Fix endian-related problems in user I/O submission path
When constructing the command, dsmgmt needs to be treated as a 32-bit
value, not a 16-bit value. reftag, apptag and appmask all need to be
converted from native-endian to little-endian. Again, sparse's bitwise
warnings caught this problem. Thanks to Keith for pointing out the
correct way to fix the reftag.
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Acked-by: Keith Busch <keith.busch@intel.com>
-rw-r--r-- | drivers/block/nvme-core.c | 8 | ||||
-rw-r--r-- | include/linux/nvme.h | 4 |
2 files changed, 6 insertions, 6 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index a3c7d504d5e2..dbd2103533c1 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -1166,10 +1166,10 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio) | |||
1166 | c.rw.slba = cpu_to_le64(io.slba); | 1166 | c.rw.slba = cpu_to_le64(io.slba); |
1167 | c.rw.length = cpu_to_le16(io.nblocks); | 1167 | c.rw.length = cpu_to_le16(io.nblocks); |
1168 | c.rw.control = cpu_to_le16(io.control); | 1168 | c.rw.control = cpu_to_le16(io.control); |
1169 | c.rw.dsmgmt = cpu_to_le16(io.dsmgmt); | 1169 | c.rw.dsmgmt = cpu_to_le32(io.dsmgmt); |
1170 | c.rw.reftag = io.reftag; | 1170 | c.rw.reftag = cpu_to_le32(io.reftag); |
1171 | c.rw.apptag = io.apptag; | 1171 | c.rw.apptag = cpu_to_le16(io.apptag); |
1172 | c.rw.appmask = io.appmask; | 1172 | c.rw.appmask = cpu_to_le16(io.appmask); |
1173 | /* XXX: metadata */ | 1173 | /* XXX: metadata */ |
1174 | length = nvme_setup_prps(dev, &c.common, iod, length, GFP_KERNEL); | 1174 | length = nvme_setup_prps(dev, &c.common, iod, length, GFP_KERNEL); |
1175 | 1175 | ||
diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 09f419d4da4e..7ae7ecfc0947 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h | |||
@@ -207,11 +207,11 @@ struct nvme_common_command { | |||
207 | __u8 flags; | 207 | __u8 flags; |
208 | __u16 command_id; | 208 | __u16 command_id; |
209 | __le32 nsid; | 209 | __le32 nsid; |
210 | __u32 cdw2[2]; | 210 | __le32 cdw2[2]; |
211 | __le64 metadata; | 211 | __le64 metadata; |
212 | __le64 prp1; | 212 | __le64 prp1; |
213 | __le64 prp2; | 213 | __le64 prp2; |
214 | __u32 cdw10[6]; | 214 | __le32 cdw10[6]; |
215 | }; | 215 | }; |
216 | 216 | ||
217 | struct nvme_rw_command { | 217 | struct nvme_rw_command { |