xfs
[Top] [All Lists]

Re: [PATCH v2] fs: Add new pre-allocation ioctls to vfs for compatibilit

To: Ankit Jain <me@xxxxxxxxxxxxx>
Subject: Re: [PATCH v2] fs: Add new pre-allocation ioctls to vfs for compatibility with legacy xfs ioctls
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Fri, 19 Dec 2008 15:37:44 +1100
Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx>, mfasheh@xxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, joel.becker@xxxxxxxxxx, Christoph Hellwig <hch@xxxxxxxxxxxxx>, xfs-masters@xxxxxxxxxxx, linux-fsdevel@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx, ocfs2-devel@xxxxxxxxxxxxxx
In-reply-to: <494ABEBC.8060101@xxxxxxxxxxxxx>
Mail-followup-to: Ankit Jain <me@xxxxxxxxxxxxx>, Al Viro <viro@xxxxxxxxxxxxxxxxxx>, mfasheh@xxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, joel.becker@xxxxxxxxxx, Christoph Hellwig <hch@xxxxxxxxxxxxx>, xfs-masters@xxxxxxxxxxx, linux-fsdevel@xxxxxxxxxxxxxxx, xfs@xxxxxxxxxxx, ocfs2-devel@xxxxxxxxxxxxxx
References: <494ABEBC.8060101@xxxxxxxxxxxxx>
User-agent: Mutt/1.5.18 (2008-05-17)
On Fri, Dec 19, 2008 at 02:51:00AM +0530, Ankit Jain wrote:
> This patch adds ioctls to vfs for compatibility with legacy XFS
> pre-allocation ioctls (XFS_IOC_*RESVP*). The implementation
> effectively invokes sys_fallocate for the new ioctls.
> Note: These legacy ioctls are also implemented by OCFS2.
> 
> Changes in v2:
> - Dropped the incorrect handling of *UNRESVSP* ioctl.
> - Made the ioctl and argument structure kernel only (__KERNEL__)
> 
> Signed-off-by: Ankit Jain <me@xxxxxxxxxxxxx>
.....
> @@ -361,6 +393,9 @@ static int file_ioctl(struct file *filp, unsigned int cmd,
>               return put_user(inode->i_sb->s_blocksize, p);
>       case FIONREAD:
>               return put_user(i_size_read(inode) - filp->f_pos, p);
> +     case F_IOC_RESVSP:
> +     case F_IOC_RESVSP64:
> +             return ioctl_preallocate(filp, arg);
>       }
>  
>       return vfs_ioctl(filp, cmd, arg);

Adding this here breaks XFS_IOC_RESVSP in subtle and interesting
ways.

XFS_IOC_RESVSP supports invisible I/O, and that means
XFS_IOC_RESVSP needs to be passed through to vfs_ioctl()
to vector to XFS to handle.

This happenѕ because:

> +struct space_resv {
> +     __s16           l_type;
> +     __s16           l_whence;
> +     __s64           l_start;
> +     __s64           l_len;          /* len == 0 means until end of file */
> +     __s32           l_sysid;
> +     __u32           l_pid;
> +     __s32           l_pad[4];       /* reserve area                     */
> +};
> +
> +#define F_IOC_RESVSP         _IOW('X', 40, struct space_resv)
> +#define F_IOC_RESVSP64               _IOW('X', 42, struct space_resv)

Is the same as:

#define XFS_IOC_RESVSP          _IOW ('X', 40, struct xfs_flock64)
#define XFS_IOC_RESVSP64        _IOW ('X', 42, struct xfs_flock64)

because:

typedef struct xfs_flock64 {
        __s16           l_type;
        __s16           l_whence;
        __s64           l_start;
        __s64           l_len;          /* len == 0 means until end of file */
        __s32           l_sysid;
        __u32           l_pid;
        __s32           l_pad[4];       /* reserve area                     */
} xfs_flock64_t;


is the same size as struct space_resv. Hence existing calls to
XFS_IOC_RESVSP will now vector incorrectly down the fallocate path
resulting in invisible operations will now be visible....

Cheers,

Dave.
-- 
Dave Chinner
david@xxxxxxxxxxxxx

<Prev in Thread] Current Thread [Next in Thread>