nfs: don't sleep with inode lock in lock_and_join_requests
This handles the 'nonblock=false' case in nfs_lock_and_join_requests. If the group is already locked and blocking is allowed, drop the inode lock and wait for the group lock to be cleared before trying it all again. This should fix warnings found in peterz's tree (sched/wait branch), where might_sleep() checks are added to wait.[ch]. Reported-by: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Reviewed-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:

committed by
Trond Myklebust

parent
94970014c4
commit
7c3af97525
@@ -478,13 +478,23 @@ try_again:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* lock each request in the page group */
|
||||
/* holding inode lock, so always make a non-blocking call to try the
|
||||
* page group lock */
|
||||
ret = nfs_page_group_lock(head, true);
|
||||
if (ret < 0) {
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
if (!nonblock && ret == -EAGAIN) {
|
||||
nfs_page_group_lock_wait(head);
|
||||
nfs_release_request(head);
|
||||
goto try_again;
|
||||
}
|
||||
|
||||
nfs_release_request(head);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/* lock each request in the page group */
|
||||
subreq = head;
|
||||
do {
|
||||
/*
|
||||
|
Reference in New Issue
Block a user