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>
This commit is contained in:
		
					parent
					
						
							
								af2d9ca744
							
						
					
				
			
			
				commit
				
					
						1c9b52651d
					
				
			
		
					 2 changed files with 6 additions and 6 deletions
				
			
		| 
						 | 
					@ -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 {
 | 
				
			||||||
	__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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue