diff options
| author | Jens Axboe <axboe@suse.de> | 2005-09-16 19:28:15 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-17 11:50:03 -0700 | 
| commit | 9564df1ff3c61f41bdc54283715417ccdfb6782b (patch) | |
| tree | ac4e5f6ea3a5a7a7ae33063d3e9bd5604a79f423 | |
| parent | ef402268f7c9ab1872cafa1e638eb78a75b7c18f (diff) | |
[PATCH] fix pf request handling
Here's the patch from
http://bugzilla.kernel.org/show_bug.cgi?id=4853
It is a feeble attempt at fixing the request handling in pf, it is totally
foobar right now.
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | drivers/block/paride/pf.c | 22 | 
1 files changed, 16 insertions, 6 deletions
| diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index 711d2f314ac3..94af920465b5 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c @@ -750,6 +750,14 @@ static int pf_ready(void)  static struct request_queue *pf_queue; +static void pf_end_request(int uptodate) +{ +	if (pf_req) { +		end_request(pf_req, uptodate); +		pf_req = NULL; +	} +} +  static void do_pf_request(request_queue_t * q)  {  	if (pf_busy) @@ -765,7 +773,7 @@ repeat:  	pf_count = pf_req->current_nr_sectors;  	if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) { -		end_request(pf_req, 0); +		pf_end_request(0);  		goto repeat;  	} @@ -780,7 +788,7 @@ repeat:  		pi_do_claimed(pf_current->pi, do_pf_write);  	else {  		pf_busy = 0; -		end_request(pf_req, 0); +		pf_end_request(0);  		goto repeat;  	}  } @@ -798,9 +806,11 @@ static int pf_next_buf(void)  	if (!pf_count)  		return 1;  	spin_lock_irqsave(&pf_spin_lock, saved_flags); -	end_request(pf_req, 1); -	pf_count = pf_req->current_nr_sectors; -	pf_buf = pf_req->buffer; +	pf_end_request(1); +	if (pf_req) { +		pf_count = pf_req->current_nr_sectors; +		pf_buf = pf_req->buffer; +	}  	spin_unlock_irqrestore(&pf_spin_lock, saved_flags);  	return 1;  } @@ -810,7 +820,7 @@ static inline void next_request(int success)  	unsigned long saved_flags;  	spin_lock_irqsave(&pf_spin_lock, saved_flags); -	end_request(pf_req, success); +	pf_end_request(success);  	pf_busy = 0;  	do_pf_request(pf_queue);  	spin_unlock_irqrestore(&pf_spin_lock, saved_flags); | 
