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:
parent
ddb4e69db5
commit
ba434b18ec
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue