diff options
Diffstat (limited to 'drivers/block/paride/pcd.c')
-rw-r--r-- | drivers/block/paride/pcd.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index e91d4b4b014f..911dfd98d813 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c | |||
@@ -719,32 +719,37 @@ static void do_pcd_request(struct request_queue * q) | |||
719 | if (pcd_busy) | 719 | if (pcd_busy) |
720 | return; | 720 | return; |
721 | while (1) { | 721 | while (1) { |
722 | pcd_req = elv_next_request(q); | 722 | if (!pcd_req) { |
723 | if (!pcd_req) | 723 | pcd_req = blk_fetch_request(q); |
724 | return; | 724 | if (!pcd_req) |
725 | return; | ||
726 | } | ||
725 | 727 | ||
726 | if (rq_data_dir(pcd_req) == READ) { | 728 | if (rq_data_dir(pcd_req) == READ) { |
727 | struct pcd_unit *cd = pcd_req->rq_disk->private_data; | 729 | struct pcd_unit *cd = pcd_req->rq_disk->private_data; |
728 | if (cd != pcd_current) | 730 | if (cd != pcd_current) |
729 | pcd_bufblk = -1; | 731 | pcd_bufblk = -1; |
730 | pcd_current = cd; | 732 | pcd_current = cd; |
731 | pcd_sector = pcd_req->sector; | 733 | pcd_sector = blk_rq_pos(pcd_req); |
732 | pcd_count = pcd_req->current_nr_sectors; | 734 | pcd_count = blk_rq_cur_sectors(pcd_req); |
733 | pcd_buf = pcd_req->buffer; | 735 | pcd_buf = pcd_req->buffer; |
734 | pcd_busy = 1; | 736 | pcd_busy = 1; |
735 | ps_set_intr(do_pcd_read, NULL, 0, nice); | 737 | ps_set_intr(do_pcd_read, NULL, 0, nice); |
736 | return; | 738 | return; |
737 | } else | 739 | } else { |
738 | end_request(pcd_req, 0); | 740 | __blk_end_request_all(pcd_req, -EIO); |
741 | pcd_req = NULL; | ||
742 | } | ||
739 | } | 743 | } |
740 | } | 744 | } |
741 | 745 | ||
742 | static inline void next_request(int success) | 746 | static inline void next_request(int err) |
743 | { | 747 | { |
744 | unsigned long saved_flags; | 748 | unsigned long saved_flags; |
745 | 749 | ||
746 | spin_lock_irqsave(&pcd_lock, saved_flags); | 750 | spin_lock_irqsave(&pcd_lock, saved_flags); |
747 | end_request(pcd_req, success); | 751 | if (!__blk_end_request_cur(pcd_req, err)) |
752 | pcd_req = NULL; | ||
748 | pcd_busy = 0; | 753 | pcd_busy = 0; |
749 | do_pcd_request(pcd_queue); | 754 | do_pcd_request(pcd_queue); |
750 | spin_unlock_irqrestore(&pcd_lock, saved_flags); | 755 | spin_unlock_irqrestore(&pcd_lock, saved_flags); |
@@ -781,7 +786,7 @@ static void pcd_start(void) | |||
781 | 786 | ||
782 | if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) { | 787 | if (pcd_command(pcd_current, rd_cmd, 2048, "read block")) { |
783 | pcd_bufblk = -1; | 788 | pcd_bufblk = -1; |
784 | next_request(0); | 789 | next_request(-EIO); |
785 | return; | 790 | return; |
786 | } | 791 | } |
787 | 792 | ||
@@ -796,7 +801,7 @@ static void do_pcd_read(void) | |||
796 | pcd_retries = 0; | 801 | pcd_retries = 0; |
797 | pcd_transfer(); | 802 | pcd_transfer(); |
798 | if (!pcd_count) { | 803 | if (!pcd_count) { |
799 | next_request(1); | 804 | next_request(0); |
800 | return; | 805 | return; |
801 | } | 806 | } |
802 | 807 | ||
@@ -815,7 +820,7 @@ static void do_pcd_read_drq(void) | |||
815 | return; | 820 | return; |
816 | } | 821 | } |
817 | pcd_bufblk = -1; | 822 | pcd_bufblk = -1; |
818 | next_request(0); | 823 | next_request(-EIO); |
819 | return; | 824 | return; |
820 | } | 825 | } |
821 | 826 | ||