On Wed, 2024-08-21 at 14:05 -0400, trondmy@xxxxxxxxxx wrote: > From: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> > > 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 <trond.myklebust@xxxxxxxxxxxxxxx> > --- > fs/nfs/delegation.c | 15 +++++---------- > 1 file changed, 5 insertions(+), 10 deletions(-) > > diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c > index d5edb3b3eeef..20cb2008f9e4 100644 > --- a/fs/nfs/delegation.c > +++ b/fs/nfs/delegation.c > @@ -647,6 +647,9 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server, > prev = delegation; > continue; > } > + inode = nfs_delegation_grab_inode(delegation); > + if (inode == NULL) > + continue; > > if (prev) { > struct inode *tmp = nfs_delegation_grab_inode(prev); > @@ -657,12 +660,6 @@ static int nfs_server_return_marked_delegations(struct nfs_server *server, > } > } > > - inode = nfs_delegation_grab_inode(delegation); > - if (inode == NULL) { > - rcu_read_unlock(); > - iput(to_put); > - goto restart; > - } > delegation = nfs_start_delegation_return_locked(NFS_I(inode)); > rcu_read_unlock(); > > @@ -1184,7 +1181,6 @@ static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server, > struct inode *inode; > restart: > rcu_read_lock(); > -restart_locked: > list_for_each_entry_rcu(delegation, &server->delegations, super_list) { > if (test_bit(NFS_DELEGATION_INODE_FREEING, > &delegation->flags) || > @@ -1195,7 +1191,7 @@ static int nfs_server_reap_unclaimed_delegations(struct nfs_server *server, > continue; > inode = nfs_delegation_grab_inode(delegation); > if (inode == NULL) > - goto restart_locked; > + continue; > delegation = nfs_start_delegation_return_locked(NFS_I(inode)); > rcu_read_unlock(); > if (delegation != NULL) { > @@ -1318,7 +1314,6 @@ static int nfs_server_reap_expired_delegations(struct nfs_server *server, > > restart: > rcu_read_lock(); > -restart_locked: > list_for_each_entry_rcu(delegation, &server->delegations, super_list) { > if (test_bit(NFS_DELEGATION_INODE_FREEING, > &delegation->flags) || > @@ -1330,7 +1325,7 @@ static int nfs_server_reap_expired_delegations(struct nfs_server *server, > continue; > inode = nfs_delegation_grab_inode(delegation); > if (inode == NULL) > - goto restart_locked; > + continue; > spin_lock(&delegation->lock); > cred = get_cred_rcu(delegation->cred); > nfs4_stateid_copy(&stateid, &delegation->stateid); Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>