diff options
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); |