NFS: Improve warning message when locks are lost.

NFSv4 can lose locks if, for example there is a network partition for
longer than the lease period.  When this happens a warning message

  NFS: __nfs4_reclaim_open_state: Lock reclaim failed!

is generated, possibly once for each lock (though rate limited).

This is potentially misleading as is can be read as suggesting that lock
reclaim was attempted.  However the default behaviour is to not attempt
to recover locks (except due to server report).

This patch changes the reporting to produce at most one message for each
attempt to recover all state from a given server.  The message reports
the server name and the number of locks lost if that number is non-zero.
It reports that locks were lost and give no suggestion as to whether
there was an attempt or not.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
NeilBrown 2022-03-21 10:59:51 +11:00 committed by Anna Schumaker
parent 71342db057
commit 3e2910c7e2

View File

@ -1602,7 +1602,8 @@ static inline void nfs42_complete_copies(struct nfs4_state_owner *sp,
#endif /* CONFIG_NFS_V4_2 */ #endif /* CONFIG_NFS_V4_2 */
static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_state *state, static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_state *state,
const struct nfs4_state_recovery_ops *ops) const struct nfs4_state_recovery_ops *ops,
int *lost_locks)
{ {
struct nfs4_lock_state *lock; struct nfs4_lock_state *lock;
int status; int status;
@ -1620,7 +1621,7 @@ static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_st
list_for_each_entry(lock, &state->lock_states, ls_locks) { list_for_each_entry(lock, &state->lock_states, ls_locks) {
trace_nfs4_state_lock_reclaim(state, lock); trace_nfs4_state_lock_reclaim(state, lock);
if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags)) if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
pr_warn_ratelimited("NFS: %s: Lock reclaim failed!\n", __func__); *lost_locks += 1;
} }
spin_unlock(&state->state_lock); spin_unlock(&state->state_lock);
} }
@ -1630,7 +1631,9 @@ static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_st
return status; return status;
} }
static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops) static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp,
const struct nfs4_state_recovery_ops *ops,
int *lost_locks)
{ {
struct nfs4_state *state; struct nfs4_state *state;
unsigned int loop = 0; unsigned int loop = 0;
@ -1666,7 +1669,7 @@ restart:
#endif /* CONFIG_NFS_V4_2 */ #endif /* CONFIG_NFS_V4_2 */
refcount_inc(&state->count); refcount_inc(&state->count);
spin_unlock(&sp->so_lock); spin_unlock(&sp->so_lock);
status = __nfs4_reclaim_open_state(sp, state, ops); status = __nfs4_reclaim_open_state(sp, state, ops, lost_locks);
switch (status) { switch (status) {
default: default:
@ -1909,6 +1912,7 @@ static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recov
struct rb_node *pos; struct rb_node *pos;
LIST_HEAD(freeme); LIST_HEAD(freeme);
int status = 0; int status = 0;
int lost_locks = 0;
restart: restart:
rcu_read_lock(); rcu_read_lock();
@ -1928,8 +1932,11 @@ restart:
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
rcu_read_unlock(); rcu_read_unlock();
status = nfs4_reclaim_open_state(sp, ops); status = nfs4_reclaim_open_state(sp, ops, &lost_locks);
if (status < 0) { if (status < 0) {
if (lost_locks)
pr_warn("NFS: %s: lost %d locks\n",
clp->cl_hostname, lost_locks);
set_bit(ops->owner_flag_bit, &sp->so_flags); set_bit(ops->owner_flag_bit, &sp->so_flags);
nfs4_put_state_owner(sp); nfs4_put_state_owner(sp);
status = nfs4_recovery_handle_error(clp, status); status = nfs4_recovery_handle_error(clp, status);
@ -1943,6 +1950,9 @@ restart:
} }
rcu_read_unlock(); rcu_read_unlock();
nfs4_free_state_owners(&freeme); nfs4_free_state_owners(&freeme);
if (lost_locks)
pr_warn("NFS: %s: lost %d locks\n",
clp->cl_hostname, lost_locks);
return 0; return 0;
} }