diff mbox series

NFSD: Fix nfs4_delegation_stat()

Message ID 20240909141516.64363-1-cel@kernel.org (mailing list archive)
State New
Headers show
Series NFSD: Fix nfs4_delegation_stat() | expand

Commit Message

Chuck Lever Sept. 9, 2024, 2:15 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

The xfstests workflow on NFSv4.2 exhausts the capacity of both the
main and scratch devices (backed by xfs) about half-way through
each test run.

Deleting all visible files on both devices frees only a little bit
of space. The test exports can be unshared but not unmounted
(EBUSY). Looks like unlinked but still open files, maybe.

Bisected to commit c495f65ad2ff ("nfsd: fix initial getattr on write
delegation")

Ensure nfsd_file objects acquired by find_rw_file() are released.

Fixes: c495f65ad2ff ("nfsd: fix initial getattr on write delegation")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfs4state.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Tested, problem no longer reproducible. I intend to squash this into
c495f65ad2ff.

Comments

Jeff Layton Sept. 9, 2024, 2:23 p.m. UTC | #1
On Mon, 2024-09-09 at 10:15 -0400, cel@kernel.org wrote:
> From: Chuck Lever <chuck.lever@oracle.com>
> 
> The xfstests workflow on NFSv4.2 exhausts the capacity of both the
> main and scratch devices (backed by xfs) about half-way through
> each test run.
> 
> Deleting all visible files on both devices frees only a little bit
> of space. The test exports can be unshared but not unmounted
> (EBUSY). Looks like unlinked but still open files, maybe.
> 
> Bisected to commit c495f65ad2ff ("nfsd: fix initial getattr on write
> delegation")
> 
> Ensure nfsd_file objects acquired by find_rw_file() are released.
> 
> Fixes: c495f65ad2ff ("nfsd: fix initial getattr on write delegation")
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>  fs/nfsd/nfs4state.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> Tested, problem no longer reproducible. I intend to squash this into
> c495f65ad2ff.
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 252297b98a2e..cb5a9ab451c5 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -5920,6 +5920,7 @@ nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh,
>  {
>  	struct nfsd_file *nf = find_rw_file(dp->dl_stid.sc_file);
>  	struct path path;
> +	int rc;
>  
>  	if (!nf)
>  		return false;
> @@ -5927,11 +5928,12 @@ nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh,
>  	path.mnt = currentfh->fh_export->ex_path.mnt;
>  	path.dentry = file_dentry(nf->nf_file);
>  
> -	if (vfs_getattr(&path, stat,
> -			(STATX_SIZE | STATX_CTIME | STATX_CHANGE_COOKIE),
> -			AT_STATX_SYNC_AS_STAT))
> -		return false;
> -	return true;
> +	rc = vfs_getattr(&path, stat,
> +			 (STATX_SIZE | STATX_CTIME | STATX_CHANGE_COOKIE),
> +			 AT_STATX_SYNC_AS_STAT);
> +
> +	nfsd_file_put(nf);
> +	return rc == 0;
>  }
>  
>  /*

Mea culpa!

Reviewed-by: Jeff Layton <jlayton@kernel.org>
diff mbox series

Patch

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 252297b98a2e..cb5a9ab451c5 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5920,6 +5920,7 @@  nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh,
 {
 	struct nfsd_file *nf = find_rw_file(dp->dl_stid.sc_file);
 	struct path path;
+	int rc;
 
 	if (!nf)
 		return false;
@@ -5927,11 +5928,12 @@  nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh,
 	path.mnt = currentfh->fh_export->ex_path.mnt;
 	path.dentry = file_dentry(nf->nf_file);
 
-	if (vfs_getattr(&path, stat,
-			(STATX_SIZE | STATX_CTIME | STATX_CHANGE_COOKIE),
-			AT_STATX_SYNC_AS_STAT))
-		return false;
-	return true;
+	rc = vfs_getattr(&path, stat,
+			 (STATX_SIZE | STATX_CTIME | STATX_CHANGE_COOKIE),
+			 AT_STATX_SYNC_AS_STAT);
+
+	nfsd_file_put(nf);
+	return rc == 0;
 }
 
 /*