Commit f868089b authored by Trond Myklebust's avatar Trond Myklebust

NFS: Fix a potential busy wait in nfs_page_group_lock

We cannot allow nfs_page_group_lock to use TASK_KILLABLE here, since
the loop would cause a busy wait if somebody kills the task.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent c1109558
...@@ -138,6 +138,12 @@ nfs_iocounter_wait(struct nfs_io_counter *c) ...@@ -138,6 +138,12 @@ nfs_iocounter_wait(struct nfs_io_counter *c)
return __nfs_iocounter_wait(c); return __nfs_iocounter_wait(c);
} }
static int nfs_wait_bit_uninterruptible(void *word)
{
io_schedule();
return 0;
}
/* /*
* nfs_page_group_lock - lock the head of the page group * nfs_page_group_lock - lock the head of the page group
* @req - request in group that is to be locked * @req - request in group that is to be locked
...@@ -148,13 +154,12 @@ void ...@@ -148,13 +154,12 @@ void
nfs_page_group_lock(struct nfs_page *req) nfs_page_group_lock(struct nfs_page *req)
{ {
struct nfs_page *head = req->wb_head; struct nfs_page *head = req->wb_head;
int err = -EAGAIN;
WARN_ON_ONCE(head != head->wb_head); WARN_ON_ONCE(head != head->wb_head);
while (err) wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK,
err = wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, nfs_wait_bit_uninterruptible,
nfs_wait_bit_killable, TASK_KILLABLE); TASK_UNINTERRUPTIBLE);
} }
/* /*
...@@ -410,12 +415,6 @@ void nfs_release_request(struct nfs_page *req) ...@@ -410,12 +415,6 @@ void nfs_release_request(struct nfs_page *req)
kref_put(&req->wb_kref, nfs_page_group_destroy); kref_put(&req->wb_kref, nfs_page_group_destroy);
} }
static int nfs_wait_bit_uninterruptible(void *word)
{
io_schedule();
return 0;
}
/** /**
* nfs_wait_on_request - Wait for a request to complete. * nfs_wait_on_request - Wait for a request to complete.
* @req: request to wait upon. * @req: request to wait upon.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment