diff options
author | pjd <pjd@FreeBSD.org> | 2008-09-05 07:00:40 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2008-09-05 07:00:40 +0000 |
commit | 686ff3ee25fc6bea21e81985922455f1b70977ec (patch) | |
tree | abab79e4d803a0f94b1abf6989eb70d2ef306d24 /sys/cddl | |
parent | ae483162bf199d6e6f04f929bc062f67178095d5 (diff) | |
download | FreeBSD-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')
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); |