FreeBSD 7.2 + NFS + nullfs + unlink + fstat = Stale NFS File Handle

Gleb Kurtsou gleb.kurtsou at
Wed Oct 28 17:39:58 UTC 2009

On (28/10/2009 09:48), Linda Messerschmidt wrote:
> On Wed, Oct 28, 2009 at 8:48 AM, Andrey Simonenko
> <simon at> wrote:
> > As I understand when a file is opened in NULLFS its vnode gets new
> > reference on 'count of users', but this new reference is not propagated
> > to the lower vnode (vnode that is under NULLFS).  When a file is removed
> > NULLFS passes this op to the lower FS (NFS in this example) and that
> > FS sees that its vnode has only a single reference on 'count of users'.
> >
> > In case of NFS when there is a request to remove a vnode it checks that
> > value of 'count of users' for this vnode.  If this count is equal to 1,
> > then NFS client code does 'RPC remove'.  If this count is greater than 1
> > (for example when a file is opened), then NFS client code renames pathname
> > to .nfs-file, but does not send 'RPC remove' to the NFS server.
> That sounds like a pretty reasonable explanation of what's going on.
> Unfortunately it does sound like this would be tough to fix.  Since
> NFS deletes are a special case, short of making an NFS-aware nullfs,
> which seems silly, it sounds like the "solution" would be rewriting
> nullfs to propagate the reference count.  I don't know enough about
> nullfs to know exactly how hard that would be, but I'm guessing it's
> not the work of a lazy afternoon. :-)
I think that's not about nullfs. Nullfs behaves correctly. It grabs
reference for a vnode and even tries too release it as soon as possible.
NFS logic is wrong here, imho. vrefcnt(vp) == 1 supposed to mean that
vnode is going to be reclaimed on next reference release and nothing
more. And it doesn't mean that reference is going to be released any
time soon. Although network filesystems in the tree abuse it the same
way NFS does.

Probably what NFS tries to do is to check if file descriptor is opened
for a vnode. This assumption holds only for a single code path out of
many: syscall by user. But there is plenty of code invoking vnode
operations without even allocating file descriptor.

Propagating per file descriptor reference counting into filesystem
itself is a layer violation and should be avoided in my opinion. There
should be a way to fix NFS by replacing vrefcnt check.

> >>       if (!fd) {
> >           ^^^^^ should be (fd < 0)
> Oops, you are right!
> Thanks very much!
> _______________________________________________
> freebsd-hackers at mailing list
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at"

More information about the freebsd-hackers mailing list