--- /usr/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c 2009-03-05 15:31:16.000000000 +0100 +++ src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c 2009-03-13 04:11:48.000000000 +0100 @@ -4503,9 +4503,16 @@ vop_getextattr { LOOKUP_XATTR); if (error != 0) { ZFS_EXIT(zfsvfs); + MPASS(xvp == NULL); return (error); } + /* + * As long as the xvp lock is held in exclusive mode at this point + * drop it but keep the reference. + */ + VOP_UNLOCK(xvp, 0); + flags = FREAD; NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, attrname, xvp, td); @@ -4514,6 +4521,7 @@ vop_getextattr { NDFREE(&nd, NDF_ONLY_PNBUF); if (error != 0) { ZFS_EXIT(zfsvfs); + VN_RELE(xvp); return (error); } @@ -4526,6 +4534,7 @@ vop_getextattr { VOP_UNLOCK(vp, 0); vn_close(vp, flags, ap->a_cred, td); + VN_RELE(xvp); ZFS_EXIT(zfsvfs); return (error); @@ -4565,9 +4574,16 @@ vop_deleteextattr { LOOKUP_XATTR); if (error != 0) { ZFS_EXIT(zfsvfs); + MPASS(xvp == NULL); return (error); } + /* + * As long as the xvp lock is held in exclusive mode at this point + * drop it but keep the reference. + */ + VOP_UNLOCK(xvp, 0); + NDINIT_ATVP(&nd, DELETE, NOFOLLOW | LOCKPARENT | LOCKLEAF | MPSAFE, UIO_SYSSPACE, attrname, xvp, td); error = namei(&nd); @@ -4575,6 +4591,7 @@ vop_deleteextattr { NDFREE(&nd, NDF_ONLY_PNBUF); if (error != 0) { ZFS_EXIT(zfsvfs); + VN_RELE(xvp); return (error); } VOP_LEASE(nd.ni_dvp, td, ap->a_cred, LEASE_WRITE); @@ -4585,6 +4602,7 @@ vop_deleteextattr { vrele(vp); else vput(vp); + VN_RELE(xvp); ZFS_EXIT(zfsvfs); return (error); @@ -4625,9 +4643,16 @@ vop_setextattr { LOOKUP_XATTR); if (error != 0) { ZFS_EXIT(zfsvfs); + MPASS(xvp == NULL); return (error); } + /* + * As long as the xvp lock is held in exclusive mode at this point + * drop it but keep the reference. + */ + VOP_UNLOCK(xvp, 0); + flags = FFLAGS(O_WRONLY | O_CREAT); NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, attrname, xvp, td); @@ -4636,6 +4661,7 @@ vop_setextattr { NDFREE(&nd, NDF_ONLY_PNBUF); if (error != 0) { ZFS_EXIT(zfsvfs); + VN_RELE(xvp); return (error); } @@ -4648,6 +4674,7 @@ vop_setextattr { VOP_UNLOCK(vp, 0); vn_close(vp, flags, ap->a_cred, td); + VN_RELE(xvp); ZFS_EXIT(zfsvfs); return (error); @@ -4694,9 +4721,16 @@ vop_listextattr { LOOKUP_XATTR); if (error != 0) { ZFS_EXIT(zfsvfs); + MPASS(xvp == NULL); return (error); } + /* + * As long as the xvp lock is held in exclusive mode at this point + * drop it but keep the reference. + */ + VOP_UNLOCK(xvp, 0); + NDINIT_ATVP(&nd, LOOKUP, NOFOLLOW | LOCKLEAF | LOCKSHARED | MPSAFE, UIO_SYSSPACE, ".", xvp, td); error = namei(&nd); @@ -4704,6 +4738,7 @@ vop_listextattr { NDFREE(&nd, NDF_ONLY_PNBUF); if (error != 0) { ZFS_EXIT(zfsvfs); + VN_RELE(xvp); return (error); } @@ -4760,6 +4795,7 @@ vop_listextattr { } while (!eof && error == 0); vput(vp); + VN_RELE(xvp); ZFS_EXIT(zfsvfs); return (error);