[PATCH] Fix 'implicit declaration' warning and update vgone(9)
Kostik Belousov
kostikbel at gmail.com
Thu Oct 28 13:21:12 UTC 2010
On Wed, Oct 27, 2010 at 11:57:31PM -0400, Benjamin Kaduk wrote:
> On Wed, 27 Oct 2010, Kostik Belousov wrote:
>
> >On Wed, Oct 27, 2010 at 10:59:56AM -0400, Benjamin Kaduk wrote:
> >>[1] The old (racy) function is osi_TryEvictVCache, here:
> >>http://git.openafs.org/?p=openafs.git;a=blob;f=src/afs/FBSD/osi_vcache.c;h=c2060c74f0155a610d2ea94f3c7f508e8ca4373a;hb=HEAD
> >The function looks very strange for much more serious reasons. Why do you
> >try to manage the vnode revocation in the filesystem module at all ?
>
> I am still becoming familiar with the AFS code, but I think this is
> largely due to a difference in the vfs structure that AFS has been using
> and the FreeBSD standard. E.g. vop_inactive/vop_reclaim do not actually
> free filesystem-specific resources, instead keeping a free list of
> "vcache" entries. So, the original authors of this AFS code were
> approaching the problem in a somewhat different way.
> Therefore, are somewhat-orthogonal pools of vcaches and vnodes (with some
> intersection). If the vcaches are all in use in use, there is a routine
> which tries to "shake some loose"; if it can free up vcaches, their
> associated vnodes also need to be cleaned up in some fashion. It may be
> that no additional code is actually needed to do this, though -- I am not
> sure.
I think the best would be to move the code to vop_reclaim(), possibly calling
vgone() from vop_inactivate().
>
> >VFS will (assumedly in a right way) revoke and destroy non-referenced
> >vnodes when needed.
> >
>
> You are, in essence, suggesting that the body of the conditional should
> be just "return 1;"? (In my incomplete testing the vref() call was always
> made.)
See above.
>
> >Anyway, you need to hold vnode lock before checking for the vnode
> >refcounter.
> >See the vfs_subr.c:vlrureclaim() for the correct dance with
> >vholdl()/vn_lock()
> >sequence that does the revocation I mentioned in the race-free way.
>
> Unless I am mistaken, the path you refer to still uses vgonel(), which is
> not available to me. Is it safe to drop and reaquire the interlock
> between the vgone and vdrop?
vgonel() use is an optimization to avoid dropping/reacquiring the vnode
interlock. Correct code can call vdrop() after vgone() call, without
doing anything with interlock. Please note that vnode lock should be
dropped between vgone and vdrop.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20101028/17476bdf/attachment.pgp
More information about the freebsd-hackers
mailing list