Message ID | 3fe20b13641fe569107f1474d17befd8caa0b076.1724263426.git.trond.myklebust@hammerspace.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | [1/3] NFSv4: Add missing rescheduling points in nfs_client_return_marked_delegations | expand |
On Wed, 2024-08-21 at 14:05 -0400, trondmy@kernel.org wrote: > From: Trond Myklebust <trond.myklebust@hammerspace.com> > > 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@hammerspace.com> > --- > 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@kernel.org>
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);