Commit 430ff791 authored by Al Viro's avatar Al Viro

orangefs: simplify compat ioctl handling

no need to mess with copy_in_user(), etc...
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5ed0127f
...@@ -716,37 +716,6 @@ struct ORANGEFS_dev_map_desc32 { ...@@ -716,37 +716,6 @@ struct ORANGEFS_dev_map_desc32 {
__s32 count; __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 * 32 bit user-space apps' ioctl handlers when kernel modules
* is compiled as a 64 bit one * is compiled as a 64 bit one
...@@ -755,25 +724,26 @@ static long orangefs_devreq_compat_ioctl(struct file *filp, unsigned int cmd, ...@@ -755,25 +724,26 @@ static long orangefs_devreq_compat_ioctl(struct file *filp, unsigned int cmd,
unsigned long args) unsigned long args)
{ {
long ret; long ret;
unsigned long arg = args;
/* Check for properly constructed commands */ /* Check for properly constructed commands */
ret = check_ioctl_command(cmd); ret = check_ioctl_command(cmd);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (cmd == ORANGEFS_DEV_MAP) { if (cmd == ORANGEFS_DEV_MAP) {
/* struct ORANGEFS_dev_map_desc desc;
* convert the arguments to what we expect internally struct ORANGEFS_dev_map_desc32 d32;
* in kernel space
*/ if (copy_from_user(&d32, (void __user *)args, sizeof(d32)))
arg = translate_dev_map26(args, &ret); return -EFAULT;
if (ret < 0) {
gossip_err("Could not translate dev map\n"); desc.ptr = compat_ptr(d32.ptr);
return ret; desc.total_size = d32.total_size;
} desc.size = d32.size;
desc.count = d32.count;
return orangefs_bufmap_initialize(&desc);
} }
/* no other ioctl requires translation */ /* no other ioctl requires translation */
return dispatch_ioctl_command(cmd, arg); return dispatch_ioctl_command(cmd, args);
} }
#endif /* CONFIG_COMPAT is in .config */ #endif /* CONFIG_COMPAT is in .config */
......
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