diff options
| author | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-05-29 11:45:57 -0400 | 
|---|---|---|
| committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-05-29 12:12:27 -0400 | 
| commit | f868089b09b51bd17ee41dedb96f98a1d0952fec (patch) | |
| tree | bb7b2c8503616cea06eba345d7b47cc479695d24 /fs/nfs/pagelist.c | |
| parent | c1109558ae0f07a3434357cd26203bfc7adfea75 (diff) | |
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: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/pagelist.c')
| -rw-r--r-- | fs/nfs/pagelist.c | 19 | 
1 files changed, 9 insertions, 10 deletions
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index 0b8446f1008d..a8759825ac76 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -138,6 +138,12 @@ nfs_iocounter_wait(struct nfs_io_counter *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   * @req - request in group that is to be locked @@ -148,13 +154,12 @@ void  nfs_page_group_lock(struct nfs_page *req)  {  	struct nfs_page *head = req->wb_head; -	int err = -EAGAIN;  	WARN_ON_ONCE(head != head->wb_head); -	while (err) -		err = wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, -			nfs_wait_bit_killable, TASK_KILLABLE); +	wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, +			nfs_wait_bit_uninterruptible, +			TASK_UNINTERRUPTIBLE);  }  /* @@ -410,12 +415,6 @@ void nfs_release_request(struct nfs_page *req)  	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.   * @req: request to wait upon.  | 
