Skip to content

Commit

Permalink
Fix zfs_xattr_owner_unlinked on FreeBSD and comment
Browse files Browse the repository at this point in the history
Explain FreeBSD VFS' unfortunate idiosyncratic locking requirements.

Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
  • Loading branch information
mattmacy committed Dec 14, 2019
1 parent c317c8c commit 59dde84
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
8 changes: 8 additions & 0 deletions module/zfs/zfs_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -247,7 +253,9 @@ zfs_xattr_owner_unlinked(znode_t *zp)
zp = dzp;
unlinked = zp->z_unlinked;
}
#ifndef __FreeBSD__
zrele(zp);
#endif
return (unlinked);
}

Expand Down
10 changes: 10 additions & 0 deletions module/zfs/zfs_replay.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 59dde84

Please sign in to comment.