Simplify FreeBSD's locking requirements in zfs_replay.c
Now that the FreeBSD zfs_vnops code avoids asserting that a vnode lock is held when z_replay is true we can limit the FreeBSD specific changes to the couple of changes where it is necessary to drop the vnode locks because a function returns with it held. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matt Macy <mmacy@FreeBSD.org> Closes #9865
This commit is contained in:
parent
e2ef1cbf04
commit
3d91490f7c
|
@ -71,6 +71,9 @@ zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode,
|
||||||
bzero(vap, sizeof (*vap));
|
bzero(vap, sizeof (*vap));
|
||||||
vap->va_mask = (uint_t)mask;
|
vap->va_mask = (uint_t)mask;
|
||||||
vap->va_mode = mode;
|
vap->va_mode = mode;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
vap->va_type = IFTOVT(mode);
|
||||||
|
#endif
|
||||||
vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid;
|
vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid;
|
||||||
vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid;
|
vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid;
|
||||||
vap->va_rdev = zfs_cmpldev(rdev);
|
vap->va_rdev = zfs_cmpldev(rdev);
|
||||||
|
@ -419,9 +422,12 @@ zfs_replay_create_acl(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
}
|
}
|
||||||
|
|
||||||
bail:
|
bail:
|
||||||
if (error == 0 && zp != NULL)
|
if (error == 0 && zp != NULL) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
VOP_UNLOCK1(ZTOV(zp));
|
||||||
|
#endif
|
||||||
zrele(zp);
|
zrele(zp);
|
||||||
|
}
|
||||||
zrele(dzp);
|
zrele(dzp);
|
||||||
|
|
||||||
if (zfsvfs->z_fuid_replay)
|
if (zfsvfs->z_fuid_replay)
|
||||||
|
@ -503,9 +509,6 @@ zfs_replay_create(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
lr->lr_uid, lr->lr_gid);
|
lr->lr_uid, lr->lr_gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY);
|
|
||||||
#endif
|
|
||||||
switch (txtype) {
|
switch (txtype) {
|
||||||
case TX_CREATE_ATTR:
|
case TX_CREATE_ATTR:
|
||||||
lrattr = (lr_attr_t *)(caddr_t)(lr + 1);
|
lrattr = (lr_attr_t *)(caddr_t)(lr + 1);
|
||||||
|
@ -556,13 +559,13 @@ zfs_replay_create(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
error = SET_ERROR(ENOTSUP);
|
error = SET_ERROR(ENOTSUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
VOP_UNLOCK(ZTOV(dzp), 0);
|
|
||||||
#endif
|
|
||||||
out:
|
out:
|
||||||
if (error == 0 && zp != NULL)
|
if (error == 0 && zp != NULL) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
VOP_UNLOCK1(ZTOV(zp));
|
||||||
|
#endif
|
||||||
zrele(zp);
|
zrele(zp);
|
||||||
|
}
|
||||||
zrele(dzp);
|
zrele(dzp);
|
||||||
|
|
||||||
if (zfsvfs->z_fuid_replay)
|
if (zfsvfs->z_fuid_replay)
|
||||||
|
@ -590,9 +593,6 @@ zfs_replay_remove(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
if (lr->lr_common.lrc_txtype & TX_CI)
|
if (lr->lr_common.lrc_txtype & TX_CI)
|
||||||
vflg |= FIGNORECASE;
|
vflg |= FIGNORECASE;
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY);
|
|
||||||
#endif
|
|
||||||
switch ((int)lr->lr_common.lrc_txtype) {
|
switch ((int)lr->lr_common.lrc_txtype) {
|
||||||
case TX_REMOVE:
|
case TX_REMOVE:
|
||||||
error = zfs_remove(dzp, name, kcred, vflg);
|
error = zfs_remove(dzp, name, kcred, vflg);
|
||||||
|
@ -604,9 +604,6 @@ zfs_replay_remove(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
error = SET_ERROR(ENOTSUP);
|
error = SET_ERROR(ENOTSUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
VOP_UNLOCK(ZTOV(dzp), 0);
|
|
||||||
#endif
|
|
||||||
zrele(dzp);
|
zrele(dzp);
|
||||||
|
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -636,15 +633,7 @@ zfs_replay_link(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
if (lr->lr_common.lrc_txtype & TX_CI)
|
if (lr->lr_common.lrc_txtype & TX_CI)
|
||||||
vflg |= FIGNORECASE;
|
vflg |= FIGNORECASE;
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
|
||||||
vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY);
|
|
||||||
vn_lock(ZTOV(zp), LK_EXCLUSIVE | LK_RETRY);
|
|
||||||
#endif
|
|
||||||
error = zfs_link(dzp, zp, name, kcred, vflg);
|
error = zfs_link(dzp, zp, name, kcred, vflg);
|
||||||
#ifdef __FreeBSD__
|
|
||||||
VOP_UNLOCK(ZTOV(zp), 0);
|
|
||||||
VOP_UNLOCK(ZTOV(dzp), 0);
|
|
||||||
#endif
|
|
||||||
zrele(zp);
|
zrele(zp);
|
||||||
zrele(dzp);
|
zrele(dzp);
|
||||||
|
|
||||||
|
@ -680,7 +669,6 @@ zfs_replay_rename(void *arg1, void *arg2, boolean_t byteswap)
|
||||||
|
|
||||||
zrele(tdzp);
|
zrele(tdzp);
|
||||||
zrele(sdzp);
|
zrele(sdzp);
|
||||||
|
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue