summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2008-09-05 07:00:40 +0000
committerpjd <pjd@FreeBSD.org>2008-09-05 07:00:40 +0000
commit686ff3ee25fc6bea21e81985922455f1b70977ec (patch)
treeabab79e4d803a0f94b1abf6989eb70d2ef306d24 /sys/cddl/contrib
parentae483162bf199d6e6f04f929bc062f67178095d5 (diff)
downloadFreeBSD-src-686ff3ee25fc6bea21e81985922455f1b70977ec.zip
FreeBSD-src-686ff3ee25fc6bea21e81985922455f1b70977ec.tar.gz
Catch up after last insmntque() changes:
- The vnode has to be locked exclusively before calling insmntque(). - Until I find a way to handle insmntque() failures use VV_FORCEINSMQ flag to force insmntque() to always succeed. Reported by: kris, trasz, des, others Suggested by: kib Tested by: trasz
Diffstat (limited to 'sys/cddl/contrib')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c3
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c4
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c4
3 files changed, 11 insertions, 0 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c b/sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c
index 738c9d4..dd2aa82 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/gfs.c
@@ -358,6 +358,7 @@ gfs_file_create(size_t size, vnode_t *pvp, vfs_t *vfsp, vnodeops_t *ops)
fp = kmem_zalloc(size, KM_SLEEP);
error = getnewvnode("zfs", vfsp, ops, &vp);
ASSERT(error == 0);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
vp->v_data = (caddr_t)fp;
/*
@@ -368,7 +369,9 @@ gfs_file_create(size_t size, vnode_t *pvp, vfs_t *vfsp, vnodeops_t *ops)
fp->gfs_size = size;
fp->gfs_type = GFS_FILE;
+ vp->v_vflag |= VV_FORCEINSMQ;
error = insmntque(vp, vfsp);
+ vp->v_vflag &= ~VV_FORCEINSMQ;
KASSERT(error == 0, ("insmntque() failed: error %d", error));
/*
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
index 2b299d7..eea46fc 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
@@ -176,6 +176,8 @@ zfsctl_create(zfsvfs_t *zfsvfs)
vp->v_vflag &= ~VV_ROOT;
zfsvfs->z_ctldir = vp;
+
+ VOP_UNLOCK(vp, 0);
}
/*
@@ -788,6 +790,7 @@ zfsctl_mknode_snapdir(vnode_t *pvp)
mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
avl_create(&sdp->sd_snaps, snapentry_compare,
sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node));
+ VOP_UNLOCK(vp, 0);
return (vp);
}
@@ -860,6 +863,7 @@ zfsctl_snapshot_mknode(vnode_t *pvp, uint64_t objset)
&zfsctl_ops_snapshot, NULL, NULL, MAXNAMELEN, NULL, NULL);
zcp = vp->v_data;
zcp->zc_id = objset;
+ VOP_UNLOCK(vp, 0);
return (vp);
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
index 9abbce3..11ec438 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
@@ -346,7 +346,9 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, uint64_t obj_num, int blksz)
if (vp == NULL)
return (zp);
+ vp->v_vflag |= VV_FORCEINSMQ;
error = insmntque(vp, zfsvfs->z_vfs);
+ vp->v_vflag &= ~VV_FORCEINSMQ;
KASSERT(error == 0, ("insmntque() failed: error %d", error));
vp->v_type = IFTOVT((mode_t)zp->z_phys->zp_mode);
@@ -602,7 +604,9 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
vp->v_type = IFTOVT((mode_t)zp->z_phys->zp_mode);
if (vp->v_type == VDIR)
zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */
+ vp->v_vflag |= VV_FORCEINSMQ;
err = insmntque(vp, zfsvfs->z_vfs);
+ vp->v_vflag &= ~VV_FORCEINSMQ;
KASSERT(err == 0, ("insmntque() failed: error %d", err));
}
mutex_exit(&zp->z_lock);
OpenPOWER on IntegriCloud