diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 12:26:40 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-09 12:26:40 -0500 |
| commit | e2688f00dc0ceb9d9867434dffbd080411fc23b0 (patch) | |
| tree | 433549c6a655ac879654ba82d312911677650380 /drivers/ide/ide-io.c | |
| parent | 356cebea1123804e4aa85b43ab39bbd0ac8e667c (diff) | |
| parent | a9925a06ea52a44b4bf4a941342e8240eaf22417 (diff) | |
Merge branch 'blk-softirq' of git://brick.kernel.dk/data/git/linux-2.6-block
Manual merge for trivial #include changes
Diffstat (limited to 'drivers/ide/ide-io.c')
| -rw-r--r-- | drivers/ide/ide-io.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index b5dc6df8e67d..dea2d4dcc698 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
| @@ -55,9 +55,22 @@ | |||
| 55 | #include <asm/io.h> | 55 | #include <asm/io.h> |
| 56 | #include <asm/bitops.h> | 56 | #include <asm/bitops.h> |
| 57 | 57 | ||
| 58 | void ide_softirq_done(struct request *rq) | ||
| 59 | { | ||
| 60 | request_queue_t *q = rq->q; | ||
| 61 | |||
| 62 | add_disk_randomness(rq->rq_disk); | ||
| 63 | end_that_request_chunk(rq, rq->errors, rq->data_len); | ||
| 64 | |||
| 65 | spin_lock_irq(q->queue_lock); | ||
| 66 | end_that_request_last(rq, rq->errors); | ||
| 67 | spin_unlock_irq(q->queue_lock); | ||
| 68 | } | ||
| 69 | |||
| 58 | int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, | 70 | int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, |
| 59 | int nr_sectors) | 71 | int nr_sectors) |
| 60 | { | 72 | { |
| 73 | unsigned int nbytes; | ||
| 61 | int ret = 1; | 74 | int ret = 1; |
| 62 | 75 | ||
| 63 | BUG_ON(!(rq->flags & REQ_STARTED)); | 76 | BUG_ON(!(rq->flags & REQ_STARTED)); |
| @@ -81,17 +94,28 @@ int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, | |||
| 81 | HWGROUP(drive)->hwif->ide_dma_on(drive); | 94 | HWGROUP(drive)->hwif->ide_dma_on(drive); |
| 82 | } | 95 | } |
| 83 | 96 | ||
| 84 | if (!end_that_request_first(rq, uptodate, nr_sectors)) { | 97 | /* |
| 85 | add_disk_randomness(rq->rq_disk); | 98 | * For partial completions (or non fs/pc requests), use the regular |
| 86 | 99 | * direct completion path. | |
| 87 | if (blk_rq_tagged(rq)) | 100 | */ |
| 88 | blk_queue_end_tag(drive->queue, rq); | 101 | nbytes = nr_sectors << 9; |
| 89 | 102 | if (rq_all_done(rq, nbytes)) { | |
| 103 | rq->errors = uptodate; | ||
| 104 | rq->data_len = nbytes; | ||
| 90 | blkdev_dequeue_request(rq); | 105 | blkdev_dequeue_request(rq); |
| 91 | HWGROUP(drive)->rq = NULL; | 106 | HWGROUP(drive)->rq = NULL; |
| 92 | end_that_request_last(rq, uptodate); | 107 | blk_complete_request(rq); |
| 93 | ret = 0; | 108 | ret = 0; |
| 109 | } else { | ||
| 110 | if (!end_that_request_first(rq, uptodate, nr_sectors)) { | ||
| 111 | add_disk_randomness(rq->rq_disk); | ||
| 112 | blkdev_dequeue_request(rq); | ||
| 113 | HWGROUP(drive)->rq = NULL; | ||
| 114 | end_that_request_last(rq, uptodate); | ||
| 115 | ret = 0; | ||
| 116 | } | ||
| 94 | } | 117 | } |
| 118 | |||
| 95 | return ret; | 119 | return ret; |
| 96 | } | 120 | } |
| 97 | EXPORT_SYMBOL(__ide_end_request); | 121 | EXPORT_SYMBOL(__ide_end_request); |
| @@ -113,6 +137,10 @@ int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors) | |||
| 113 | unsigned long flags; | 137 | unsigned long flags; |
| 114 | int ret = 1; | 138 | int ret = 1; |
| 115 | 139 | ||
| 140 | /* | ||
| 141 | * room for locking improvements here, the calls below don't | ||
| 142 | * need the queue lock held at all | ||
| 143 | */ | ||
| 116 | spin_lock_irqsave(&ide_lock, flags); | 144 | spin_lock_irqsave(&ide_lock, flags); |
| 117 | rq = HWGROUP(drive)->rq; | 145 | rq = HWGROUP(drive)->rq; |
| 118 | 146 | ||
