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
This commit is contained in:
parent
ae483162bf
commit
686ff3ee25
@ -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));
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user