Hi Sergio

On Tue, Jun 04, 2024 at 03:03:15PM +0000, Sergio Gelato wrote:
> Package: nfs-common
> Version: 2.6.2-4
> Severity: important
> Tags: patch upstream
> 
> On some of our bookworm systems I've seen what looked like a file descriptor 
> leak. Sample lsof output:
> 
> [...]
> rpc.idmap 675 root  126r      DIR               0,40        0      10813 
> /run/rpc_pipefs/nfs/clnt11e6 (deleted)
> rpc.idmap 675 root  127u     FIFO               0,40      0t0      10817 
> /run/rpc_pipefs/nfs/clnt11e6/idmap (deleted)
> rpc.idmap 675 root  128r      DIR               0,40        0      10834 
> /run/rpc_pipefs/nfs/clnt11ef (deleted)
> rpc.idmap 675 root  129u     FIFO               0,40      0t0      10838 
> /run/rpc_pipefs/nfs/clnt11ef/idmap (deleted)
> rpc.idmap 675 root  130r      DIR               0,40        0      10855 
> /run/rpc_pipefs/nfs/clnt11f8 (deleted)
> rpc.idmap 675 root  131u     FIFO               0,40      0t0      10859 
> /run/rpc_pipefs/nfs/clnt11f8/idmap (deleted)
> 
> Cranking up the verbosity level to 3 showed that dirscancb never reaps stale 
> entries in its queue (no "Stale client" lines). The reason turns out to be 
> that the scan terminates on the first directory entry that doesn't contain an 
> "idmap" file. Applying the attached patch seems to have solved the problem 
> for me.
> 
> As far as I can tell the bug is still present upstream, and has been for many 
> years (that "goto out" is from 2007 and replaced a "return" so the bug is 
> even older than that).
> 
> Marking "important" since this has actually caused observable problems in our 
> environment.

> From: Sergio Gelato <sergio.gel...@astro.su.se>
> Date: Tue, 4 Jun 2024 16:02:59 +0200
> Subject: rpc.idmapd: nfsopen() failures should not be fatal
> 
> dirscancb() loops over all clnt* subdirectories of /run/rpc_pipefs/nfs/.
> Some of these directories contain /idmap files, others don't. nfsopen()
> returns -1 for the latter; we then want to skip the directory, not abort
> the entire scan.
> ---
>  utils/idmapd/idmapd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
> index e79c124..f3c540d 100644
> --- a/utils/idmapd/idmapd.c
> +++ b/utils/idmapd/idmapd.c
> @@ -556,7 +556,7 @@ dirscancb(int fd, short UNUSED(which), void *data)
>                       if (nfsopen(ic) == -1) {
>                               close(ic->ic_dirfd);
>                               free(ic);
> -                             goto out;
> +                             continue;
>                       }
>  
>                       if (verbose > 2)

Can you please report your issue upstream (to the linux-nfs) list and
submit your patch there? 

Thanks already,

Regards,
Salvatore

Reply via email to