aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/ext2fs/ext2_vnops.c
diff options
context:
space:
mode:
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);