aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/pagelist.c
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@primarydata.com>2014-08-08 11:00:57 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-08-22 18:04:43 -0400
commit7c3af975257383ece54b83c0505d3e0656cb7daf (patch)
tree44688dff0d435b29531366be55e42f5f99928a9c /fs/nfs/pagelist.c
parent94970014c46223cbcdfbfc67b89596a412f9e3dd (diff)
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>
Diffstat (limited to 'fs/nfs/pagelist.c')
-rw-r--r--fs/nfs/pagelist.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 30c9626f96b0..4ec67f8d70aa 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -168,6 +168,23 @@ nfs_page_group_lock(struct nfs_page *req, bool nonblock)
168} 168}
169 169
170/* 170/*
171 * nfs_page_group_lock_wait - wait for the lock to clear, but don't grab it
172 * @req - a request in the group
173 *
174 * This is a blocking call to wait for the group lock to be cleared.
175 */
176void
177nfs_page_group_lock_wait(struct nfs_page *req)
178{
179 struct nfs_page *head = req->wb_head;
180
181 WARN_ON_ONCE(head != head->wb_head);
182
183 wait_on_bit(&head->wb_flags, PG_HEADLOCK,
184 TASK_UNINTERRUPTIBLE);
185}
186
187/*
171 * nfs_page_group_unlock - unlock the head of the page group 188 * nfs_page_group_unlock - unlock the head of the page group
172 * @req - request in group that is to be unlocked 189 * @req - request in group that is to be unlocked
173 */ 190 */