From: Hao Xu <howeyxu@xxxxxxxxxxx> Add a nowait parameter for iomap_seek(), later IOMAP_NOWAIT is set according to this parameter's value. Signed-off-by: Hao Xu <howeyxu@xxxxxxxxxxx> --- fs/ext4/file.c | 2 +- fs/gfs2/inode.c | 4 ++-- fs/iomap/seek.c | 4 +++- fs/xfs/xfs_file.c | 2 +- include/linux/iomap.h | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 3d59993bce56..c6c38c34148b 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -939,7 +939,7 @@ loff_t ext4_llseek(struct file *file, loff_t offset, int whence) case SEEK_DATA: inode_lock_shared(inode); offset = iomap_seek(inode, offset, &ext4_iomap_report_ops, - whence == SEEK_HOLE); + whence == SEEK_HOLE, false); inode_unlock_shared(inode); break; } diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 628f9d014491..5d6e7471cb07 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -2111,7 +2111,7 @@ loff_t gfs2_seek_data(struct file *file, loff_t offset) inode_lock_shared(inode); ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh); if (!ret) - ret = iomap_seek(inode, offset, &gfs2_iomap_ops, false); + ret = iomap_seek(inode, offset, &gfs2_iomap_ops, false, false); gfs2_glock_dq_uninit(&gh); inode_unlock_shared(inode); @@ -2130,7 +2130,7 @@ loff_t gfs2_seek_hole(struct file *file, loff_t offset) inode_lock_shared(inode); ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh); if (!ret) - ret = iomap_seek(inode, offset, &gfs2_iomap_ops, true); + ret = iomap_seek(inode, offset, &gfs2_iomap_ops, true, false); gfs2_glock_dq_uninit(&gh); inode_unlock_shared(inode); diff --git a/fs/iomap/seek.c b/fs/iomap/seek.c index 5e8641c5f0da..319ea19fa90d 100644 --- a/fs/iomap/seek.c +++ b/fs/iomap/seek.c @@ -52,7 +52,7 @@ static loff_t iomap_seek_data_iter(const struct iomap_iter *iter, loff_t iomap_seek(struct inode *inode, loff_t pos, const struct iomap_ops *ops, - bool hole) + bool hole, bool nowait) { loff_t size = i_size_read(inode); struct iomap_iter iter = { @@ -66,6 +66,8 @@ iomap_seek(struct inode *inode, loff_t pos, const struct iomap_ops *ops, if (pos < 0 || pos >= size) return -ENXIO; + if (nowait) + iter.flags |= IOMAP_NOWAIT; iter.len = size - pos; while ((ret = iomap_iter(&iter, ops)) > 0) iter.processed = hole ? iomap_seek_hole_iter(&iter, &pos) : diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index d7d37f8fb6bc..73adc0aee2ff 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1273,7 +1273,7 @@ xfs_file_llseek( case SEEK_HOLE: case SEEK_DATA: offset = iomap_seek(inode, offset, &xfs_seek_iomap_ops, - whence == SEEK_HOLE); + whence == SEEK_HOLE, nowait); break; } diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 22d5f9b19a22..f99769d4fc42 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -275,7 +275,7 @@ vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, u64 start, u64 len, const struct iomap_ops *ops); loff_t iomap_seek(struct inode *inode, loff_t offset, - const struct iomap_ops *ops, bool hole); + const struct iomap_ops *ops, bool hole, bool nowait); sector_t iomap_bmap(struct address_space *mapping, sector_t bno, const struct iomap_ops *ops); -- 2.25.1