diff options
author | Fedor Uporov <fsu@FreeBSD.org> | 2020-02-18 16:39:57 +0000 |
---|---|---|
committer | Fedor Uporov <fsu@FreeBSD.org> | 2020-02-18 16:39:57 +0000 |
commit | 3767ed5b11369e06a662e017d6036caa09a46120 (patch) | |
tree | af71a6e92508c0204a6abe7203cf0f367551fb9d /sys/fs/ext2fs/ext2_vnops.c | |
parent | 56cd269eacea1795eb8a40d5eb4d9d7dc69814ae (diff) | |
download | src-3767ed5b11369e06a662e017d6036caa09a46120.tar.gz src-3767ed5b11369e06a662e017d6036caa09a46120.zip |
Add a EXT2FS-specific implementation for lseek(SEEK_DATA).
The lseek(SEEK_DATA) optimization logic could be simply borrowed from ufs side.
See, https://reviews.freebsd.org/D19599.
Reviewed by: pfg
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D23605
Notes
Notes:
svn path=/head/; revision=358073
Diffstat (limited to 'sys/fs/ext2fs/ext2_vnops.c')
-rw-r--r-- | sys/fs/ext2fs/ext2_vnops.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/fs/ext2fs/ext2_vnops.c b/sys/fs/ext2fs/ext2_vnops.c index 3cd69c847c9c..0e719a4a542b 100644 --- a/sys/fs/ext2fs/ext2_vnops.c +++ b/sys/fs/ext2fs/ext2_vnops.c @@ -2157,11 +2157,24 @@ ext2_read(struct vop_read_args *ap) static int ext2_ioctl(struct vop_ioctl_args *ap) { + struct vnode *vp; + int error; + vp = ap->a_vp; switch (ap->a_command) { case FIOSEEKDATA: + if (!(VTOI(vp)->i_flag & IN_E4EXTENTS)) { + error = vn_lock(vp, LK_SHARED); + if (error == 0) { + error = ext2_bmap_seekdata(vp, + (off_t *)ap->a_data); + VOP_UNLOCK(vp); + } else + error = EBADF; + return (error); + } case FIOSEEKHOLE: - return (vn_bmap_seekhole(ap->a_vp, ap->a_command, + return (vn_bmap_seekhole(vp, ap->a_command, (off_t *)ap->a_data, ap->a_cred)); default: return (ENOTTY); |