summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
committerRenato Botelho <renato@netgate.com>2016-10-12 11:41:26 -0300
commitcb642130dfc50717bb970a104c44aa7690930a38 (patch)
treec67f108534217a209198c6b201949ecc73acaba3 /sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
parent5dd7ab172435dc99e1abc1f7d73fd5e720050bbc (diff)
parentcd04fbc5e631c6b3e80a14eb7044c3be35fba2d2 (diff)
downloadFreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.zip
FreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.tar.gz
Merge remote-tracking branch 'origin/stable/11' into devel-11
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c20
1 files changed, 14 insertions, 6 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 4693542..a700a5e 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
@@ -1454,7 +1454,8 @@ zfs_lookup_lock(vnode_t *dvp, vnode_t *vp, const char *name, int lkflags)
ASSERT_VOP_LOCKED(dvp, __func__);
#ifdef DIAGNOSTIC
- ASSERT(!RRM_LOCK_HELD(&zfsvfs->z_teardown_lock));
+ if ((zdp->z_pflags & ZFS_XATTR) == 0)
+ VERIFY(!RRM_LOCK_HELD(&zfsvfs->z_teardown_lock));
#endif
if (name[0] == 0 || (name[0] == '.' && name[1] == 0)) {
@@ -3197,6 +3198,11 @@ zfs_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
if (err == 0 && xattr_obj) {
err = zfs_zget(zp->z_zfsvfs, xattr_obj, &attrzp);
+ if (err == 0) {
+ err = vn_lock(ZTOV(attrzp), LK_EXCLUSIVE);
+ if (err != 0)
+ vrele(ZTOV(attrzp));
+ }
if (err)
goto out2;
}
@@ -3206,7 +3212,7 @@ zfs_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
if (new_uid != zp->z_uid &&
zfs_fuid_overquota(zfsvfs, B_FALSE, new_uid)) {
if (attrzp)
- vrele(ZTOV(attrzp));
+ vput(ZTOV(attrzp));
err = SET_ERROR(EDQUOT);
goto out2;
}
@@ -3218,7 +3224,7 @@ zfs_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
if (new_gid != zp->z_gid &&
zfs_fuid_overquota(zfsvfs, B_TRUE, new_gid)) {
if (attrzp)
- vrele(ZTOV(attrzp));
+ vput(ZTOV(attrzp));
err = SET_ERROR(EDQUOT);
goto out2;
}
@@ -3449,7 +3455,7 @@ out:
}
if (attrzp)
- vrele(ZTOV(attrzp));
+ vput(ZTOV(attrzp));
if (aclp)
zfs_acl_free(aclp);
@@ -5968,13 +5974,15 @@ zfs_lock(ap)
vp = ap->a_vp;
flags = ap->a_flags;
if ((flags & LK_INTERLOCK) == 0 && (flags & LK_NOWAIT) == 0 &&
- (vp->v_iflag & VI_DOOMED) == 0 && (zp = vp->v_data) != NULL) {
+ (vp->v_iflag & VI_DOOMED) == 0 && (zp = vp->v_data) != NULL &&
+ (zp->z_pflags & ZFS_XATTR) == 0) {
zfsvfs = zp->z_zfsvfs;
VERIFY(!RRM_LOCK_HELD(&zfsvfs->z_teardown_lock));
}
err = vop_stdlock(ap);
if ((flags & LK_INTERLOCK) != 0 && (flags & LK_NOWAIT) == 0 &&
- (vp->v_iflag & VI_DOOMED) == 0 && (zp = vp->v_data) != NULL) {
+ (vp->v_iflag & VI_DOOMED) == 0 && (zp = vp->v_data) != NULL &&
+ (zp->z_pflags & ZFS_XATTR) == 0) {
zfsvfs = zp->z_zfsvfs;
VERIFY(!RRM_LOCK_HELD(&zfsvfs->z_teardown_lock));
}
OpenPOWER on IntegriCloud