Skip to content

Commit f92214e

Browse files
Trond Myklebustamschuma-ntap
authored andcommitted
NFS: Avoid unnecessary rescanning of the per-server delegation list
If the call to nfs_delegation_grab_inode() fails, we will not have dropped any locks that require us to rescan the list. Signed-off-by: Trond Myklebust <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent d72b796 commit f92214e

File tree

1 file changed

+5
-10
lines changed

1 file changed

+5
-10
lines changed

fs/nfs/delegation.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,9 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server,
647647
prev = delegation;
648648
continue;
649649
}
650+
inode = nfs_delegation_grab_inode(delegation);
651+
if (inode == NULL)
652+
continue;
650653

651654
if (prev) {
652655
struct inode *tmp = nfs_delegation_grab_inode(prev);
@@ -657,12 +660,6 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server,
657660
}
658661
}
659662

660-
inode = nfs_delegation_grab_inode(delegation);
661-
if (inode == NULL) {
662-
rcu_read_unlock();
663-
iput(to_put);
664-
goto restart;
665-
}
666663
delegation = nfs_start_delegation_return_locked(NFS_I(inode));
667664
rcu_read_unlock();
668665

@@ -1184,7 +1181,6 @@ static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server,
11841181
struct inode *inode;
11851182
restart:
11861183
rcu_read_lock();
1187-
restart_locked:
11881184
list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
11891185
if (test_bit(NFS_DELEGATION_INODE_FREEING,
11901186
&delegation->flags) ||
@@ -1195,7 +1191,7 @@ static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server,
11951191
continue;
11961192
inode = nfs_delegation_grab_inode(delegation);
11971193
if (inode == NULL)
1198-
goto restart_locked;
1194+
continue;
11991195
delegation = nfs_start_delegation_return_locked(NFS_I(inode));
12001196
rcu_read_unlock();
12011197
if (delegation != NULL) {
@@ -1318,7 +1314,6 @@ static int nfs_server_reap_expired_delegations(struct nfs_server *server,
13181314

13191315
restart:
13201316
rcu_read_lock();
1321-
restart_locked:
13221317
list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
13231318
if (test_bit(NFS_DELEGATION_INODE_FREEING,
13241319
&delegation->flags) ||
@@ -1330,7 +1325,7 @@ static int nfs_server_reap_expired_delegations(struct nfs_server *server,
13301325
continue;
13311326
inode = nfs_delegation_grab_inode(delegation);
13321327
if (inode == NULL)
1333-
goto restart_locked;
1328+
continue;
13341329
spin_lock(&delegation->lock);
13351330
cred = get_cred_rcu(delegation->cred);
13361331
nfs4_stateid_copy(&stateid, &delegation->stateid);

0 commit comments

Comments
 (0)