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:
pjd 2008-09-05 07:00:40 +00:00
parent ae483162bf
commit 686ff3ee25
3 changed files with 11 additions and 0 deletions

View File

@ -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));
/*

View File

@ -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);
}

View File

@ -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);