Re: [PATCH 8/8] nfsd: hold net namespace reference in nfsd_file
Al Viro <viro-RmSDqhL/[email protected]>
| Newsgroups | gmane.linux.nfs,gmane.linux.kernel |
|---|---|
| Message-ID | <20260601175034.GI2636677@ZenIV> |
On Mon, Jun 01, 2026 at 01:31:11PM -0400, Jeff Layton wrote: > Take a net-namespace reference in nfsd_file_alloc() (get_net) and > release it in nfsd_file_free() (put_net), so that nf_net is always > valid for files that the GC or shrinker has isolated from the hash > table and LRU -- which __nfsd_file_cache_purge() cannot see. > > Without this, nf_net can dangle for in-flight files whose net namespace > is torn down concurrently, causing a use-after-free when > nfsd_file_dispose_list_delayed() calls net_generic(nf->nf_net, ...). > > Because nfsd_file_free() now calls put_net(nf->nf_net), the old > nfsd_file_put_local() pattern of returning nf->nf_net after > nfsd_file_put() is unsafe -- put_net() could theoretically drop the > last net namespace reference, leaving the returned pointer stale. > Fix this by moving the nfsd_net_put() call into nfsd_file_put_local() > itself, before the nfsd_file_put() that may trigger nfsd_file_free(). > The function now returns void and the caller no longer needs to handle > the net reference. That means that each nfsd_file_alloc()/nfsd_file_free() is now touching the same cacheline on kernels with netns enabled. Scalability implications might be interesting...