fallocate should be a file operation
Currently all filesystems except XFS implement fallocate asynchronously, while XFS forced a commit. Both of these are suboptimal - in case of O_SYNC I/O we really want our allocation on disk, especially for the !KEEP_SIZE case where we actually grow the file with user-visible zeroes. On the other hand always commiting the transaction is a bad idea for fast-path uses of fallocate like for example in recent Samba versions. Given that block allocation is a data plane operation anyway change it from an inode operation to a file operation so that we have the file structure available that lets us check for O_SYNC. This also includes moving the code around for a few of the filesystems, and remove the already unnedded S_ISDIR checks given that we only wire up fallocate for regular files. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
此提交包含在:
@@ -1989,9 +1989,10 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,
|
||||
return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0);
|
||||
}
|
||||
|
||||
static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
|
||||
static long ocfs2_fallocate(struct file *file, int mode, loff_t offset,
|
||||
loff_t len)
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
||||
struct ocfs2_space_resv sr;
|
||||
int change_size = 1;
|
||||
@@ -2002,9 +2003,6 @@ static long ocfs2_fallocate(struct inode *inode, int mode, loff_t offset,
|
||||
if (!ocfs2_writes_unwritten_extents(osb))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
return -ENODEV;
|
||||
|
||||
if (mode & FALLOC_FL_KEEP_SIZE)
|
||||
change_size = 0;
|
||||
|
||||
@@ -2612,7 +2610,6 @@ const struct inode_operations ocfs2_file_iops = {
|
||||
.getxattr = generic_getxattr,
|
||||
.listxattr = ocfs2_listxattr,
|
||||
.removexattr = generic_removexattr,
|
||||
.fallocate = ocfs2_fallocate,
|
||||
.fiemap = ocfs2_fiemap,
|
||||
};
|
||||
|
||||
@@ -2644,6 +2641,7 @@ const struct file_operations ocfs2_fops = {
|
||||
.flock = ocfs2_flock,
|
||||
.splice_read = ocfs2_file_splice_read,
|
||||
.splice_write = ocfs2_file_splice_write,
|
||||
.fallocate = ocfs2_fallocate,
|
||||
};
|
||||
|
||||
const struct file_operations ocfs2_dops = {
|
||||
|
新增問題並參考
封鎖使用者