aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew.r.wilcox@intel.com>2013-04-16 15:21:06 -0400
committerMatthew Wilcox <matthew.r.wilcox@intel.com>2013-04-16 15:21:06 -0400
commit1c9b52651dad0ff1fa71fc6205c86d972f25bcc0 (patch)
tree387be3d96798e7b5c4d35accd3067d4095552387
parentaf2d9ca744af5e03390eeb3864d08ce75c860899 (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.c8
-rw-r--r--include/linux/nvme.h4
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
217struct nvme_rw_command { 217struct nvme_rw_command {