summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2016-06-13 10:53:34 +0000
committeravg <avg@FreeBSD.org>2016-06-13 10:53:34 +0000
commitc862120336bfb1c36fe50f6fd462a8c86967e33d (patch)
tree450d5b4d2579f18f756b3cd40b19b9202fc1c40c
parent57d47130dd562fc8beecb4d17d212b745cd4d730 (diff)
downloadFreeBSD-src-c862120336bfb1c36fe50f6fd462a8c86967e33d.zip
FreeBSD-src-c862120336bfb1c36fe50f6fd462a8c86967e33d.tar.gz
zfs_vptocnp: check for an invalid znode
... which can arise after the receive or rollback and failed zfs_rezget(). Approved by: re (kib) MFC after: 1 week
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
index a987138..c632618 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -7170,16 +7170,24 @@ zfs_vptocnp(struct vop_vptocnp_args *ap)
int ltype;
int error;
+ ZFS_ENTER(zfsvfs);
+ ZFS_VERIFY_ZP(zp);
+
/*
* If we are a snapshot mounted under .zfs, run the operation
* on the covered vnode.
*/
if ((error = sa_lookup(zp->z_sa_hdl,
- SA_ZPL_PARENT(zfsvfs), &parent, sizeof (parent))) != 0)
+ SA_ZPL_PARENT(zfsvfs), &parent, sizeof (parent))) != 0) {
+ ZFS_EXIT(zfsvfs);
return (error);
+ }
- if (zp->z_id != parent || zfsvfs->z_parent == zfsvfs)
+ if (zp->z_id != parent || zfsvfs->z_parent == zfsvfs) {
+ ZFS_EXIT(zfsvfs);
return (vop_stdvptocnp(ap));
+ }
+ ZFS_EXIT(zfsvfs);
covered_vp = vp->v_mount->mnt_vnodecovered;
vhold(covered_vp);
OpenPOWER on IntegriCloud