nfsd: move blocked lock handling under a dedicated spinlock
Bruce was hitting some lockdep warnings in testing, showing that we could hit a deadlock with the new CB_NOTIFY_LOCK handling, involving a rather complex situation involving four different spinlocks. The crux of the matter is that we end up taking the nn->client_lock in the lm_notify handler. The simplest fix is to just declare a new per-nfsd_net spinlock to protect the new CB_NOTIFY_LOCK structures. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
committed by
J. Bruce Fields
parent
07d9a38068
commit
0cc11a61b8
@ -84,6 +84,8 @@ struct nfsd_net {
|
||||
struct list_head client_lru;
|
||||
struct list_head close_lru;
|
||||
struct list_head del_recall_lru;
|
||||
|
||||
/* protected by blocked_locks_lock */
|
||||
struct list_head blocked_locks_lru;
|
||||
|
||||
struct delayed_work laundromat_work;
|
||||
@ -91,6 +93,9 @@ struct nfsd_net {
|
||||
/* client_lock protects the client lru list and session hash table */
|
||||
spinlock_t client_lock;
|
||||
|
||||
/* protects blocked_locks_lru */
|
||||
spinlock_t blocked_locks_lock;
|
||||
|
||||
struct file *rec_file;
|
||||
bool in_grace;
|
||||
const struct nfsd4_client_tracking_ops *client_tracking_ops;
|
||||
|
Reference in New Issue
Block a user