diff mbox

[4/4] orangefs: simplify compat ioctl handling

Message ID 20180528222013.18402-4-viro@ZenIV.linux.org.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Al Viro May 28, 2018, 10:20 p.m. UTC
From: Al Viro <viro@zeniv.linux.org.uk>

no need to mess with copy_in_user(), etc...

Cc: Mike Marshall <hubcap@omnibond.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/orangefs/devorangefs-req.c | 54 ++++++++++---------------------------------
 1 file changed, 12 insertions(+), 42 deletions(-)

Comments

kernel test robot May 31, 2018, 11:11 a.m. UTC | #1
Hi Al,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v4.17-rc7 next-20180530]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Al-Viro/vmsplice-lift-import_iovec-into-do_vmsplice/20180531-161308
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> fs/orangefs/devorangefs-req.c:739:26: sparse: incorrect type in assignment (different address spaces) @@    expected void *ptr @@    got void [noderef] <avoid *ptr @@
   fs/orangefs/devorangefs-req.c:739:26:    expected void *ptr
   fs/orangefs/devorangefs-req.c:739:26:    got void [noderef] <asn:1>*
   fs/orangefs/devorangefs-req.c:158:16: sparse: context imbalance in 'orangefs_devreq_read' - different lock contexts for basic block

vim +739 fs/orangefs/devorangefs-req.c

   718	
   719	/*
   720	 * 32 bit user-space apps' ioctl handlers when kernel modules
   721	 * is compiled as a 64 bit one
   722	 */
   723	static long orangefs_devreq_compat_ioctl(struct file *filp, unsigned int cmd,
   724					      unsigned long args)
   725	{
   726		long ret;
   727	
   728		/* Check for properly constructed commands */
   729		ret = check_ioctl_command(cmd);
   730		if (ret < 0)
   731			return ret;
   732		if (cmd == ORANGEFS_DEV_MAP) {
   733			struct ORANGEFS_dev_map_desc desc;
   734			struct ORANGEFS_dev_map_desc32 d32;
   735	
   736			if (copy_from_user(&d32, (void __user *)args, sizeof(d32)))
   737				return -EFAULT;
   738	
 > 739			desc.ptr = compat_ptr(d32.ptr);
   740			desc.total_size = d32.total_size;
   741			desc.size = d32.size;
   742			desc.count = d32.count;
   743			return orangefs_bufmap_initialize(&desc);
   744		}
   745		/* no other ioctl requires translation */
   746		return dispatch_ioctl_command(cmd, args);
   747	}
   748	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c
index 66369ec90020..8581daf19634 100644
--- a/fs/orangefs/devorangefs-req.c
+++ b/fs/orangefs/devorangefs-req.c
@@ -716,37 +716,6 @@  struct ORANGEFS_dev_map_desc32 {
 	__s32 count;
 };
 
-static unsigned long translate_dev_map26(unsigned long args, long *error)
-{
-	struct ORANGEFS_dev_map_desc32 __user *p32 = (void __user *)args;
-	/*
-	 * Depending on the architecture, allocate some space on the
-	 * user-call-stack based on our expected layout.
-	 */
-	struct ORANGEFS_dev_map_desc __user *p =
-	    compat_alloc_user_space(sizeof(*p));
-	compat_uptr_t addr;
-
-	*error = 0;
-	/* get the ptr from the 32 bit user-space */
-	if (get_user(addr, &p32->ptr))
-		goto err;
-	/* try to put that into a 64-bit layout */
-	if (put_user(compat_ptr(addr), &p->ptr))
-		goto err;
-	/* copy the remaining fields */
-	if (copy_in_user(&p->total_size, &p32->total_size, sizeof(__s32)))
-		goto err;
-	if (copy_in_user(&p->size, &p32->size, sizeof(__s32)))
-		goto err;
-	if (copy_in_user(&p->count, &p32->count, sizeof(__s32)))
-		goto err;
-	return (unsigned long)p;
-err:
-	*error = -EFAULT;
-	return 0;
-}
-
 /*
  * 32 bit user-space apps' ioctl handlers when kernel modules
  * is compiled as a 64 bit one
@@ -755,25 +724,26 @@  static long orangefs_devreq_compat_ioctl(struct file *filp, unsigned int cmd,
 				      unsigned long args)
 {
 	long ret;
-	unsigned long arg = args;
 
 	/* Check for properly constructed commands */
 	ret = check_ioctl_command(cmd);
 	if (ret < 0)
 		return ret;
 	if (cmd == ORANGEFS_DEV_MAP) {
-		/*
-		 * convert the arguments to what we expect internally
-		 * in kernel space
-		 */
-		arg = translate_dev_map26(args, &ret);
-		if (ret < 0) {
-			gossip_err("Could not translate dev map\n");
-			return ret;
-		}
+		struct ORANGEFS_dev_map_desc desc;
+		struct ORANGEFS_dev_map_desc32 d32;
+
+		if (copy_from_user(&d32, (void __user *)args, sizeof(d32)))
+			return -EFAULT;
+
+		desc.ptr = compat_ptr(d32.ptr);
+		desc.total_size = d32.total_size;
+		desc.size = d32.size;
+		desc.count = d32.count;
+		return orangefs_bufmap_initialize(&desc);
 	}
 	/* no other ioctl requires translation */
-	return dispatch_ioctl_command(cmd, arg);
+	return dispatch_ioctl_command(cmd, args);
 }
 
 #endif /* CONFIG_COMPAT is in .config */