Commit 1bba38b2 authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: Clean up nfs_delegation_reap_unclaimed()

Convert nfs_delegation_reap_unclaimed() to use nfs_client_for_each_server()
for efficiency.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent af3b61bf
...@@ -1092,53 +1092,51 @@ void nfs_delegation_mark_reclaim(struct nfs_client *clp) ...@@ -1092,53 +1092,51 @@ void nfs_delegation_mark_reclaim(struct nfs_client *clp)
rcu_read_unlock(); rcu_read_unlock();
} }
/** static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server,
* nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done void __always_unused *data)
* @clp: nfs_client to process
*
*/
void nfs_delegation_reap_unclaimed(struct nfs_client *clp)
{ {
struct nfs_delegation *delegation; struct nfs_delegation *delegation;
struct nfs_server *server;
struct inode *inode; struct inode *inode;
restart: restart:
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { restart_locked:
list_for_each_entry_rcu(delegation, &server->delegations, list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
super_list) { if (test_bit(NFS_DELEGATION_INODE_FREEING,
if (test_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags) ||
&delegation->flags) || test_bit(NFS_DELEGATION_RETURNING,
test_bit(NFS_DELEGATION_RETURNING, &delegation->flags) ||
&delegation->flags) || test_bit(NFS_DELEGATION_NEED_RECLAIM,
test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0)
&delegation->flags) == 0) continue;
continue; inode = nfs_delegation_grab_inode(delegation);
if (!nfs_sb_active(server->super)) if (inode == NULL)
break; /* continue in outer loop */ goto restart_locked;
inode = nfs_delegation_grab_inode(delegation); delegation = nfs_start_delegation_return_locked(NFS_I(inode));
if (inode == NULL) { rcu_read_unlock();
rcu_read_unlock(); if (delegation != NULL) {
nfs_sb_deactive(server->super); if (nfs_detach_delegation(NFS_I(inode), delegation,
goto restart; server) != NULL)
} nfs_free_delegation(delegation);
delegation = nfs_start_delegation_return_locked(NFS_I(inode)); /* Match nfs_start_delegation_return_locked */
rcu_read_unlock(); nfs_put_delegation(delegation);
if (delegation != NULL) {
if (nfs_detach_delegation(NFS_I(inode), delegation,
server) != NULL)
nfs_free_delegation(delegation);
/* Match nfs_start_delegation_return_locked */
nfs_put_delegation(delegation);
}
iput(inode);
nfs_sb_deactive(server->super);
cond_resched();
goto restart;
} }
iput(inode);
cond_resched();
goto restart;
} }
rcu_read_unlock(); rcu_read_unlock();
return 0;
}
/**
* nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done
* @clp: nfs_client to process
*
*/
void nfs_delegation_reap_unclaimed(struct nfs_client *clp)
{
nfs_client_for_each_server(clp, nfs_server_reap_unclaimed_delegations,
NULL);
} }
static inline bool nfs4_server_rebooted(const struct nfs_client *clp) static inline bool nfs4_server_rebooted(const struct nfs_client *clp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment