From: viro@parcelfarce.linux.theplanet.co.uk Equivalent transformation: Handling of bogus requests taken into do_pd_io_start() - we call next_request(0) as we would for any other error. We need to call pi_unclaim() before that - on other paths that would happen as a side effect of pi_disconnect(). Setting variables moved into do_pd_io_start() - they don't need pd_lock being held, so we can shift that outside. --- 25-akpm/drivers/block/paride/paride.c | 4 ++- 25-akpm/drivers/block/paride/paride.h | 2 + 25-akpm/drivers/block/paride/pd.c | 37 ++++++++++++++++------------------ 3 files changed, 23 insertions(+), 20 deletions(-) diff -puN drivers/block/paride/paride.c~PI6-bogus_requests-RC1 drivers/block/paride/paride.c --- 25/drivers/block/paride/paride.c~PI6-bogus_requests-RC1 Wed Jan 14 13:46:18 2004 +++ 25-akpm/drivers/block/paride/paride.c Wed Jan 14 13:46:18 2004 @@ -140,7 +140,7 @@ static void pi_claim(PIA * pi) #endif } -static void pi_unclaim(PIA * pi) +void pi_unclaim(PIA * pi) { pi->claimed = 0; #ifdef CONFIG_PARPORT @@ -149,6 +149,8 @@ static void pi_unclaim(PIA * pi) #endif } +EXPORT_SYMBOL(pi_unclaim); + void pi_connect(PIA * pi) { pi_claim(pi); diff -puN drivers/block/paride/paride.h~PI6-bogus_requests-RC1 drivers/block/paride/paride.h --- 25/drivers/block/paride/paride.h~PI6-bogus_requests-RC1 Wed Jan 14 13:46:18 2004 +++ 25-akpm/drivers/block/paride/paride.h Wed Jan 14 13:46:18 2004 @@ -88,6 +88,8 @@ extern void pi_write_block(PIA *pi, char extern void pi_read_block(PIA *pi, char * buf, int count); +extern void pi_unclaim(PIA *pi); + extern void pi_connect(PIA *pi); extern void pi_disconnect(PIA *pi); diff -puN drivers/block/paride/pd.c~PI6-bogus_requests-RC1 drivers/block/paride/pd.c --- 25/drivers/block/paride/pd.c~PI6-bogus_requests-RC1 Wed Jan 14 13:46:18 2004 +++ 25-akpm/drivers/block/paride/pd.c Wed Jan 14 13:46:18 2004 @@ -744,30 +744,13 @@ static int pd_ready(void) static void do_pd_request1(request_queue_t * q) { -repeat: pd_req = elv_next_request(q); if (!pd_req) return; - pd_block = pd_req->sector; - pd_run = pd_req->nr_sectors; - pd_count = pd_req->current_nr_sectors; pd_current = pd_req->rq_disk->private_data; - if (pd_block + pd_count > get_capacity(pd_req->rq_disk)) { - end_request(pd_req, 0); - goto repeat; - } - - pd_cmd = rq_data_dir(pd_req); - pd_buf = pd_req->buffer; - pd_retries = 0; - if (pd_cmd == READ || pd_cmd == WRITE) - pi_do_claimed(pd_current->pi, do_pd_io); - else { - end_request(pd_req, 0); - goto repeat; - } + pi_do_claimed(pd_current->pi, do_pd_io); } static void do_pd_request(request_queue_t * q) @@ -815,10 +798,26 @@ static void do_pd_io(void) static void do_pd_io_start(void) { + pd_block = pd_req->sector; + pd_run = pd_req->nr_sectors; + pd_count = pd_req->current_nr_sectors; + if (pd_block + pd_count > get_capacity(pd_req->rq_disk)) { + pi_unclaim(pd_current->pi); + next_request(0); + return; + } + + pd_cmd = rq_data_dir(pd_req); + pd_buf = pd_req->buffer; + pd_retries = 0; + if (pd_cmd == READ) { do_pd_read_start(); - } else { + } else if (pd_cmd == WRITE) { do_pd_write_start(); + } else { + pi_unclaim(pd_current->pi); + next_request(0); } } _