Messages in this thread | | | From | "Myklebust, Trond" <> | Subject | Re: [PATCH] nfs: Don't return referenced delegations | Date | Thu, 13 Dec 2012 14:34:53 +0000 |
| |
On Thu, 2012-12-13 at 14:37 +0800, ycnian@gmail.com wrote: > From: Yanchuan Nian <ycnian@gmail.com> > > 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@gmail.com> > --- > 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@netapp.com www.netapp.com
| |