fs: Add new pre-allocation ioctls to vfs for compatibility with legacy xfs ioctls
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. Also handles the compat_ioctl case. Note: These legacy ioctls are also implemented by OCFS2. [AV: folded fixes from hch] Signed-off-by: Ankit Jain <me@ankitjain.org> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
35
fs/ioctl.c
35
fs/ioctl.c
@@ -15,6 +15,7 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/falloc.h>
|
||||
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
@@ -403,6 +404,37 @@ EXPORT_SYMBOL(generic_block_fiemap);
|
||||
|
||||
#endif /* CONFIG_BLOCK */
|
||||
|
||||
/*
|
||||
* This provides compatibility with legacy XFS pre-allocation ioctls
|
||||
* which predate the fallocate syscall.
|
||||
*
|
||||
* Only the l_start, l_len and l_whence fields of the 'struct space_resv'
|
||||
* are used here, rest are ignored.
|
||||
*/
|
||||
int ioctl_preallocate(struct file *filp, void __user *argp)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct space_resv sr;
|
||||
|
||||
if (copy_from_user(&sr, argp, sizeof(sr)))
|
||||
return -EFAULT;
|
||||
|
||||
switch (sr.l_whence) {
|
||||
case SEEK_SET:
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
sr.l_start += filp->f_pos;
|
||||
break;
|
||||
case SEEK_END:
|
||||
sr.l_start += i_size_read(inode);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return do_fallocate(filp, FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len);
|
||||
}
|
||||
|
||||
static int file_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
@@ -414,6 +446,9 @@ static int file_ioctl(struct file *filp, unsigned int cmd,
|
||||
return ioctl_fibmap(filp, p);
|
||||
case FIONREAD:
|
||||
return put_user(i_size_read(inode) - filp->f_pos, p);
|
||||
case FS_IOC_RESVSP:
|
||||
case FS_IOC_RESVSP64:
|
||||
return ioctl_preallocate(filp, p);
|
||||
}
|
||||
|
||||
return vfs_ioctl(filp, cmd, arg);
|
||||
|
Reference in New Issue
Block a user