change in VFS layer API?
Rick Macklem
rmacklem at uoguelph.ca
Sat Oct 25 22:17:07 UTC 2014
Julian Elischer wrote:
> On 10/25/14, 10:47 AM, Julian Elischer wrote:
> > On 10/25/14, 1:18 AM, K. Macy wrote:
> >> On Fri, Oct 24, 2014 at 9:45 AM, Julian Elischer
> >> <julian at freebsd.org> wrote:
> >>> Can anyone point me at a VFS API contract change that occurred
> >>> over the last
> >>> 5 years where a filesystem written to teh old contract would end
> >>> up with
> >>> extra references to all its vnodes/objects? Specifically a
> >>> proprietary
> >>> filesystem that ran on 8.0 now can be compiled but ends up with
> >>> extra
> >>> references on its vnodes and can not free them.
> >>>
> >> I think the contract for some functions has become unclear. I've
> >> found
> >> that the opensolaris' compatibility layer traverse' vput of the
> >> initial vnode passed in triggers negative reference count panics.
> >> It
> >> is clear that some callers of lookup expect the reference to be
> >> maintained on error so the unconditional vput was (well is - this
> >> patch isn't in base) wrong, but in the case of success it isn't
> >> clear.
> >> Doing the vput on success will still eventually (as in a few
> >> seconds
> >> of this torture test script) cause a negative reference count
> >> panic. I
> >> think there needs to be an audit of VFS function contract
> >> compliance.
> >> Preferably by someone who knows what they are. I can only infer
> >> from
> >> cumulative context.
> >
> > I have evidence that the API has actually changed somehow.
> >
> > The old API would have extra calls to remove references to nodes.
> > We don't seem to be seeing those extra calls any more.
> > I'll have more info later.
> My colleague who works on the filesystem in question suspects
> a change in the interplay between _inactive and _reclaim of a
> znode/vnode,
> resulting in extra references on the nodes.
>
> Doesn't ring any bells with anyone?
>
Well, neither X_inactive() nor X_reclaim() are called until the
ref count goes to 0. One quirk is that X_inactive() isn't guaranteed
to be called, so anything you do in X_inactive() needs to be tested
for and done again in X_reclaim(). (I have no idea if this explains
why you have non-zero ref counted vnodes hanging about.)
rick
>
> >> Thanks.
> >>
> >> -K
> >>
> >>
> >
> > _______________________________________________
> > freebsd-fs at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> > To unsubscribe, send any mail to
> > "freebsd-fs-unsubscribe at freebsd.org"
> >
> >
>
> _______________________________________________
> freebsd-fs at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-fs
> To unsubscribe, send any mail to "freebsd-fs-unsubscribe at freebsd.org"
>
More information about the freebsd-fs
mailing list