2015-03-27 16:52:40

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] NFSv4: Return delegations synchronously in evict_inode

Kinglong Mee reports that asynchronous delegations are being killed
by the call to rpc_shutdown_client() when unmounting. This can lead
to state leakage on the server until the client lease expires.

Reported-by: Kinglong Mee <[email protected]>
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/delegation.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index a6ad68865880..08c624448750 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -514,7 +514,7 @@ void nfs_inode_return_delegation_noreclaim(struct inode *inode)

delegation = nfs_inode_detach_delegation(inode);
if (delegation != NULL)
- nfs_do_return_delegation(inode, delegation, 0);
+ nfs_do_return_delegation(inode, delegation, 1);
}

/**
--
2.1.0



2015-03-28 13:50:55

by Kinglong Mee

[permalink] [raw]
Subject: Re: [PATCH] NFSv4: Return delegations synchronously in evict_inode

On 2015/3/28 0:52, Trond Myklebust wrote:
> Kinglong Mee reports that asynchronous delegations are being killed
> by the call to rpc_shutdown_client() when unmounting. This can lead
> to state leakage on the server until the client lease expires.
>
> Reported-by: Kinglong Mee <[email protected]>
> Signed-off-by: Trond Myklebust <[email protected]>

With this patch, client can return delegation, destroy session and
client id correctly. I'd like it.

Tested-by: Kinglong Mee <[email protected]>

thanks,
Kinglong Mee

> ---
> fs/nfs/delegation.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
> index a6ad68865880..08c624448750 100644
> --- a/fs/nfs/delegation.c
> +++ b/fs/nfs/delegation.c
> @@ -514,7 +514,7 @@ void nfs_inode_return_delegation_noreclaim(struct inode *inode)
>
> delegation = nfs_inode_detach_delegation(inode);
> if (delegation != NULL)
> - nfs_do_return_delegation(inode, delegation, 0);
> + nfs_do_return_delegation(inode, delegation, 1);
> }
>
> /**
>