aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/ext2fs/ext2_vnops.c
diff options
context:
space:
mode:
authorFedor Uporov <fsu@FreeBSD.org>2020-02-18 16:39:57 +0000
committerFedor Uporov <fsu@FreeBSD.org>2020-02-18 16:39:57 +0000
commit3767ed5b11369e06a662e017d6036caa09a46120 (patch)
treeaf71a6e92508c0204a6abe7203cf0f367551fb9d /sys/fs/ext2fs/ext2_vnops.c
parent56cd269eacea1795eb8a40d5eb4d9d7dc69814ae (diff)
downloadsrc-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.c15
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);