Re: [PATCH] fs: Add new pre-allocation ioctls to vfs for compatibility with legacy xfs ioctls

From: Arnd Bergmann
Date: Sat Jun 20 2009 - 04:14:39 EST


On Friday 19 June 2009 06:28:07 pm Christoph Hellwig wrote:

> +/* on ia32 l_start is on a 32-bit boundary */
> +#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
> +struct space_resv_32 {
> + __s16 l_type;
> + __s16 l_whence;
> + __s64 l_start __attribute__((packed));
> + /* len == 0 means until end of file */
> + __s64 l_len __attribute__((packed));
> + __s32 l_sysid;
> + __u32 l_pid;
> + __s32 l_pad[4]; /* reserve area */
> +};
> +
> +#define FS_IOC_RESVSP_32 _IOW ('X', 40, struct space_resv_32)
> +#define FS_IOC_RESVSP64_32 _IOW ('X', 42, struct space_resv_32)

I'd just define this using compat_s64 instead of __s64 __packed so we can
use the same code on all architectures, even at the small cost of extra
text size on non-x86 architectures.

> +/* just account for different alignment */
> +static int compat_ioctl_preallocate(struct file *file, unsigned long arg)
> +{
> + struct space_resv_32 __user *p32 = (void __user *)arg;
> + struct space_resv __user *p = compat_alloc_user_space(sizeof(*p));
> +
> + if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) ||
> + copy_in_user(&p->l_whence, &p32->l_whence, sizeof(s16)) ||
> + copy_in_user(&p->l_start, &p32->l_start, sizeof(s64)) ||
> + copy_in_user(&p->l_len, &p32->l_len, sizeof(s64)) ||
> + copy_in_user(&p->l_sysid, &p32->l_sysid, sizeof(s32)) ||
> + copy_in_user(&p->l_pid, &p32->l_pid, sizeof(u32)) ||
> + copy_in_user(&p->l_pad, &p32->l_pad, 4*sizeof(u32)))
> + return -EFAULT;
> +
> + return ioctl_preallocate(file, p);
> +}
> +#endif
> +

Here, you can call do_fallocate directly in the same way that ioctl_preallocate
does, replacing the copy_in_user calls with __get_user().

Arnd <><
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/