Fix zfs_xattr_owner_unlinked on FreeBSD and comment

Explain FreeBSD VFS' unfortunate idiosyncratic locking requirements.
There is no functional change for other platforms.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
Closes #9720
This commit is contained in:
Matthew Macy 2019-12-16 09:49:05 -08:00 committed by Brian Behlendorf
parent ddb4e69db5
commit ba434b18ec
2 changed files with 18 additions and 0 deletions

View File

@ -232,7 +232,13 @@ zfs_xattr_owner_unlinked(znode_t *zp)
int unlinked = 0;
znode_t *dzp;
/*
* zrele drops the vnode lock which violates the VOP locking contract
* on FreeBSD. See comment at the top of zfs_replay.c for more detail.
*/
#ifndef __FreeBSD__
zhold(zp);
#endif
/*
* if zp is XATTR node, keep walking up via z_xattr_parent until we
* get the owner
@ -247,7 +253,9 @@ zfs_xattr_owner_unlinked(znode_t *zp)
zp = dzp;
unlinked = zp->z_unlinked;
}
#ifndef __FreeBSD__
zrele(zp);
#endif
return (unlinked);
}

View File

@ -48,6 +48,16 @@
#include <sys/cred.h>
#include <sys/zpl.h>
/*
* NB: FreeBSD expects to be able to do vnode locking in lookup and
* hold the locks across all subsequent VOPs until vput is called.
* This means that its zfs vnops routines can't do any internal locking.
* In order to have the same contract as the Linux vnops there would
* needed to be duplicate locked vnops. If the vnops were used more widely
* in common code this would likely be preferable. However, currently
* this is the only file where this is the case.
*/
/*
* Functions to replay ZFS intent log (ZIL) records
* The functions are called through a function vector (zfs_replay_vector)