On Apr 14, 2011, at 3:10 PM, Chuck Lever wrote: > > On Apr 14, 2011, at 3:04 PM, Weston Andros Adamson wrote: > >> The loop was being restarted after each delegation that has NFS_DELEGATION_NEED_RECLAIM >> set. Instead, build a temporary list of delegations that need to be freed and free >> them after the for-each-delegation loop. >> >> Signed-off-by: Weston Andros Adamson <dros@xxxxxxxxxx> >> --- >> fs/nfs/delegation.c | 16 +++++++++++----- >> 1 files changed, 11 insertions(+), 5 deletions(-) >> >> diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c >> index bbbc6bf..c87fad8 100644 >> --- a/fs/nfs/delegation.c >> +++ b/fs/nfs/delegation.c >> @@ -645,8 +645,8 @@ void nfs_delegation_reap_unclaimed(struct nfs_client *clp) >> struct nfs_delegation *delegation; >> struct nfs_server *server; >> struct inode *inode; >> + LIST_HEAD(tmplist); >> >> -restart: >> rcu_read_lock(); >> list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { >> list_for_each_entry_rcu(delegation, &server->delegations, >> @@ -659,15 +659,21 @@ restart: >> continue; >> delegation = nfs_detach_delegation(NFS_I(inode), >> server); >> - rcu_read_unlock(); >> - >> + /* super_list is unused now that deleg is detached */ >> if (delegation != NULL) >> - nfs_free_delegation(delegation); >> + list_add(&delegation->super_list, &tmplist); >> + >> iput(inode); > > /me idly wonders if that iput() is safe to do inside rcu_read_lock() / rcu_read_unlock(). Hrm, I think you're right. I take this patch back! -dros -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html