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:
parent
71342db057
commit
3e2910c7e2
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user