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 ��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥