Re: [PATCH] nfs: Don't return referenced delegations

From: Myklebust, Trond
Date: Thu Dec 13 2012 - 09:44:30 EST


On Thu, 2012-12-13 at 14:37 +0800, ycnian@xxxxxxxxx wrote:
> From: Yanchuan Nian <ycnian@xxxxxxxxx>
>
> The client returns unreferenced delegations in state management. It scans all
> delegations and tests the NFS_DELEGATION_REFERENCED flag. if this flag is not
> set, NFS_DELEGATION_RETURN will be set and the delegation will be returned.
> But unfortunately NFS_DELEGATION_REFERENCED is cleared after the testing, so
> delegations which are still being used will be returned in the next state
> management.
>
> Signed-off-by: Yanchuan Nian <ycnian@xxxxxxxxx>
> ---
> fs/nfs/delegation.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
> index 81c5eec..485e8c0 100644
> --- a/fs/nfs/delegation.c
> +++ b/fs/nfs/delegation.c
> @@ -506,7 +506,7 @@ static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server)
> struct nfs_delegation *delegation;
>
> list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
> - if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags))
> + if (test_bit(NFS_DELEGATION_REFERENCED, &delegation->flags))
> continue;
> nfs_mark_return_delegation(server, delegation);
> }

The clearing of the bit here is 100% intentional. This is a variant on
basic mark-and-sweep garbage collection where if the bit hasn't been set
again the next time we scan, then we assume the delegation isn't being
used.

--
Trond Myklebust
Linux NFS client maintainer

NetApp
Trond.Myklebust@xxxxxxxxxx
www.netapp.com
¢éì®&Þ~º&¶¬–+-±éÝ¥Šw®žË±Êâmébžìdz¹Þ)í…æèw*jg¬±¨¶‰šŽŠÝj/êäz¹ÞŠà2ŠÞ¨è­Ú&¢)ß«a¶Úþø®G«éh®æj:+v‰¨Šwè†Ù>Wš±êÞiÛaxPjØm¶Ÿÿà -»+ƒùdš_