mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-04-06 17:49:11 +03:00
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;
|
int unlinked = 0;
|
||||||
znode_t *dzp;
|
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);
|
zhold(zp);
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* if zp is XATTR node, keep walking up via z_xattr_parent until we
|
* if zp is XATTR node, keep walking up via z_xattr_parent until we
|
||||||
* get the owner
|
* get the owner
|
||||||
@ -247,7 +253,9 @@ zfs_xattr_owner_unlinked(znode_t *zp)
|
|||||||
zp = dzp;
|
zp = dzp;
|
||||||
unlinked = zp->z_unlinked;
|
unlinked = zp->z_unlinked;
|
||||||
}
|
}
|
||||||
|
#ifndef __FreeBSD__
|
||||||
zrele(zp);
|
zrele(zp);
|
||||||
|
#endif
|
||||||
return (unlinked);
|
return (unlinked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,16 @@
|
|||||||
#include <sys/cred.h>
|
#include <sys/cred.h>
|
||||||
#include <sys/zpl.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
|
* Functions to replay ZFS intent log (ZIL) records
|
||||||
* The functions are called through a function vector (zfs_replay_vector)
|
* The functions are called through a function vector (zfs_replay_vector)
|
||||||
|
Loading…
Reference in New Issue
Block a user