diff options
author | avg <avg@FreeBSD.org> | 2016-06-13 10:53:34 +0000 |
---|---|---|
committer | avg <avg@FreeBSD.org> | 2016-06-13 10:53:34 +0000 |
commit | c862120336bfb1c36fe50f6fd462a8c86967e33d (patch) | |
tree | 450d5b4d2579f18f756b3cd40b19b9202fc1c40c | |
parent | 57d47130dd562fc8beecb4d17d212b745cd4d730 (diff) | |
download | FreeBSD-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.c | 12 |
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); |