vfs: export lseek_execute() to modules
Subsystems (7)
RFC PATCH 1/1 vfs: export lseek_execute() to modules
From: Jie Liu <[email protected]>
For those file systems(btrfs/ext4/xfs/ocfs2/tmpfs) that support SEEK_DATA/SEEK_HOLE functions, we end up handling the similar matter in lseek_execute() to verify the final offset.
To reduce the duplications, this patch make lseek_execute() public accessible so that we can call it directly from them.
Thanks Dave Chinner for this suggestion.
--- fs/btrfs/file.c | 15 +-------------- fs/ext4/file.c | 24 ++---------------------- fs/ocfs2/file.c | 12 +----------- fs/read_write.c | 5 +++-- fs/xfs/xfs_file.c | 6 ++---- include/linux/fs.h | 2 ++ mm/shmem.c | 5 +---- 7 files changed, 12 insertions(+), 57 deletions(-)
fs/btrfs/file.c +1 -14
@@ -2425,20 +2425,7 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence) } } -if (offset <0 && !(file->f_mode &FMODE_UNSIGNED_OFFSET )) { - offset = -EINVAL ; - goto out; - } -if (offset > inode->i_sb->s_maxbytes) { - offset = -EINVAL ; - goto out; - } - -/* Special lock needed here? */ -if (offset != file->f_pos) { - file->f_pos = offset; - file->f_version =0 ; - } + offset =lseek_execute (file, inode, offset, inode->i_sb->s_maxbytes); out:mutex_unlock (&inode->i_mutex);return offset;
fs/ext4/file.c +2 -22
@@ -494,17 +494,7 @@ static loff_t ext4_seek_data(struct file *file, loff_t offset, loff_t maxsize)if (dataoff > isize)return -ENXIO ; -if (dataoff <0 && !(file->f_mode &FMODE_UNSIGNED_OFFSET )) -return -EINVAL ; -if (dataoff > maxsize) -return -EINVAL ; - -if (dataoff != file->f_pos) { - file->f_pos = dataoff; - file->f_version =0 ; - } - -return dataoff; +return lseek_execute (file, inode, dataoff, maxsize); }/*
@@ -580,17 +570,7 @@ static loff_t ext4_seek_hole(struct file *file, loff_t offset, loff_t maxsize)if (holeoff > isize) holeoff = isize; -if (holeoff <0 && !(file->f_mode &FMODE_UNSIGNED_OFFSET )) -return -EINVAL ; -if (holeoff > maxsize) -return -EINVAL ; - -if (holeoff != file->f_pos) { - file->f_pos = holeoff; - file->f_version =0 ; - } - -return holeoff; +return lseek_execute (file, inode, holeoff, maxsize); }/*
fs/ocfs2/file.c +1 -11
@@ -2646,17 +2646,7 @@ static loff_t ocfs2_file_llseek(struct file *file, loff_t offset, int whence) goto out; } -if (offset <0 && !(file->f_mode &FMODE_UNSIGNED_OFFSET )) - ret = -EINVAL ; -if (!ret && offset > inode->i_sb->s_maxbytes) - ret = -EINVAL ; -if (ret) - goto out; - -if (offset != file->f_pos) { - file->f_pos = offset; - file->f_version =0 ; - } + offset =lseek_execute (file, inode, offset, inode->i_sb->s_maxbytes); out:mutex_unlock (&inode->i_mutex);
fs/read_write.c +3 -2
@@ -41,8 +41,8 @@ static inline int unsigned_offsets(struct file *file)return file->f_mode &FMODE_UNSIGNED_OFFSET ; } -static loff_t lseek_execute (struct file *file,struct inode *inode, -loff_t offset,loff_t maxsize) +loff_t lseek_execute (struct file *file,struct inode *inode, +loff_t offset,loff_t maxsize) {if (offset <0 && !unsigned_offsets (file))return -EINVAL ;
@@ -55,6 +55,7 @@ static loff_t lseek_execute(struct file *file, struct inode *inode, }return offset; } +EXPORT_SYMBOL (lseek_execute);/** * generic_file_llseek_size - generic llseek implementation for regular files
fs/xfs/xfs_file.c +2 -4
@@ -1270,8 +1270,7 @@ xfs_seek_data( } out: -if (offset != file->f_pos) - file->f_pos = offset; + offset =lseek_execute (file, inode, offset, inode->i_sb->s_maxbytes); out_unlock:xfs_iunlock_map_shared (ip, lock);
@@ -1379,8 +1378,7 @@ out:* situation in particular. */ offset =min_t (loff_t, offset, isize); -if (offset != file->f_pos) - file->f_pos = offset; + offset =lseek_execute (file, inode, offset, inode->i_sb->s_maxbytes); out_unlock:xfs_iunlock_map_shared (ip, lock);
include/linux/fs.h +2 -0
@@ -2419,6 +2419,8 @@ extern void file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);extern loff_t noop_llseek (struct file *file,loff_t offset,int whence);extern loff_t no_llseek (struct file *file,loff_t offset,int whence); +extern loff_t lseek_execute (struct file *file,struct inode *inode, +loff_t offset,loff_t maxsize);extern loff_t generic_file_llseek (struct file *file,loff_t offset,int whence);extern loff_t generic_file_llseek_size (struct file *file,loff_t offset,int whence,loff_t maxsize,loff_t eof);
mm/shmem.c +1 -4
@@ -1798,10 +1798,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence) } } -if (offset >=0 && offset != file->f_pos) { - file->f_pos = offset; - file->f_version =0 ; - } + offset =lseek_execute (file, inode, offset,MAX_LFS_FILESIZE );mutex_unlock (&inode->i_mutex);return offset; }
Signature · 7 lines
1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 10 lines · Jeff Liu
From: Jie Liu <[email protected]>
For those file systems(btrfs/ext4/xfs/ocfs2/tmpfs) that support SEEK_DATA/SEEK_HOLE functions, we end up handling the similar matter in
lseek_execute()to verify the final offset.To reduce the duplications, this patch make
lseek_execute()public accessible so that we can call it directly from them.Thanks Dave Chinner for this suggestion.
Please add a kerneldoc comment explaining the use of this function.
Quoted 7 lines · Christoph Hellwig
Quoted 6 lines · Jeff Liu
From: Jie Liu <[email protected]>
For those file systems(btrfs/ext4/xfs/ocfs2/tmpfs) that support SEEK_DATA/SEEK_HOLE functions, we end up handling the similar matter in
lseek_execute()to verify the final offset.
Quoted 6 lines
Quoted 4 lines
To reduce the duplications, this patch make
lseek_execute()public accessible so that we can call it directly from them.Thanks Dave Chinner for this suggestion.
Please add a kerneldoc comment explaining the use of this function.
Ok, I'll repost it later.
Thanks,
-Jeff
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>