Commit 1c9b5265 authored by Matthew Wilcox's avatar Matthew Wilcox

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: default avatarMatthew Wilcox <matthew.r.wilcox@intel.com>
Acked-by: default avatarKeith Busch <keith.busch@intel.com>
parent af2d9ca7
...@@ -1166,10 +1166,10 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio) ...@@ -1166,10 +1166,10 @@ static int nvme_submit_io(struct nvme_ns *ns, struct nvme_user_io __user *uio)
c.rw.slba = cpu_to_le64(io.slba); c.rw.slba = cpu_to_le64(io.slba);
c.rw.length = cpu_to_le16(io.nblocks); c.rw.length = cpu_to_le16(io.nblocks);
c.rw.control = cpu_to_le16(io.control); c.rw.control = cpu_to_le16(io.control);
c.rw.dsmgmt = cpu_to_le16(io.dsmgmt); c.rw.dsmgmt = cpu_to_le32(io.dsmgmt);
c.rw.reftag = io.reftag; c.rw.reftag = cpu_to_le32(io.reftag);
c.rw.apptag = io.apptag; c.rw.apptag = cpu_to_le16(io.apptag);
c.rw.appmask = io.appmask; c.rw.appmask = cpu_to_le16(io.appmask);
/* XXX: metadata */ /* XXX: metadata */
length = nvme_setup_prps(dev, &c.common, iod, length, GFP_KERNEL); length = nvme_setup_prps(dev, &c.common, iod, length, GFP_KERNEL);
......
...@@ -207,11 +207,11 @@ struct nvme_common_command { ...@@ -207,11 +207,11 @@ struct nvme_common_command {
__u8 flags; __u8 flags;
__u16 command_id; __u16 command_id;
__le32 nsid; __le32 nsid;
__u32 cdw2[2]; __le32 cdw2[2];
__le64 metadata; __le64 metadata;
__le64 prp1; __le64 prp1;
__le64 prp2; __le64 prp2;
__u32 cdw10[6]; __le32 cdw10[6];
}; };
struct nvme_rw_command { struct nvme_rw_command {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment