Re: [PATCH v3 10/19] VFS/ovl: add d_alloc_noblock_return()

Al Viro <[email protected]>
Newsgroups org.kernel.vger.linux-unionfs,org.kernel.vger.linux-efi,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs
Message-ID <20260428043511.GW3518998@ZenIV>
On Tue, Apr 28, 2026 at 10:34:50AM +1000, NeilBrown wrote:

> > This contract is a bit subtle.
> > We have plenty of contracts where the caller must dput() in case of success
> > or in case of error, but must dput in case of a specific error that
> > sounds fragile.
> > 
> > How about:
> > * If the existing dentry is d_in_lookup(), d_alloc_noblock()
> >  * returns with error %-EWOULDBLOCK and the blocking dentry is passed
> >  * in @dentryp. Regardless of the returned error, if @dentryp is set by this
> >  * function, the returned dentry must be dput() by the caller.
> 
> That is sensible, though I've used slightly different words.

I would add "dentry reference stored in *dentryp may be in any state -
the only thing promised is that the reference is counting one;
do *NOT* expect it to be in-lookup or in the same directory or
hashed at any point or anything whatsoever, really.  Users beware."

In case it's not obvious from the above, I don't think it's a safe API to have -
there's very little you can do to that dentry other than dput() it and it does
change things in a fairly subtle way: right now in-lookup dentry is *not*
visible to any thread other than caller of d_alloc_parallel() that has created
it.  In particular, d_in_lookup(dentry) can only change due to actions of the
same thread.  With this primitive added this is no longer obviously true.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.