Commit 9e74e3e1 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Linus Torvalds

[PATCH] cleanup IDE multicount PIO write code

Noticed by Christophe Saout <christophe@saout.de>.

This code has been dead since kernel 2.4.2 and it is bogus too.
parent 39954714
...@@ -239,8 +239,6 @@ static ide_startstop_t write_intr (ide_drive_t *drive) ...@@ -239,8 +239,6 @@ static ide_startstop_t write_intr (ide_drive_t *drive)
* ide_multwrite() transfers a block of up to mcount sectors of data * ide_multwrite() transfers a block of up to mcount sectors of data
* to a drive as part of a disk multiple-sector write operation. * to a drive as part of a disk multiple-sector write operation.
* *
* Returns 0 on success.
*
* Note that we may be called from two contexts - __ide_do_rw_disk() context * Note that we may be called from two contexts - __ide_do_rw_disk() context
* and IRQ context. The IRQ can happen any time after we've output the * and IRQ context. The IRQ can happen any time after we've output the
* full "mcount" number of sectors, so we must make sure we update the * full "mcount" number of sectors, so we must make sure we update the
...@@ -251,7 +249,7 @@ static ide_startstop_t write_intr (ide_drive_t *drive) ...@@ -251,7 +249,7 @@ static ide_startstop_t write_intr (ide_drive_t *drive)
* is shorter or smaller than the BH segment then we should be OKAY. * is shorter or smaller than the BH segment then we should be OKAY.
* This is only valid if we can rewind the rq->current_nr_sectors counter. * This is only valid if we can rewind the rq->current_nr_sectors counter.
*/ */
int ide_multwrite (ide_drive_t *drive, unsigned int mcount) static void ide_multwrite(ide_drive_t *drive, unsigned int mcount)
{ {
ide_hwgroup_t *hwgroup = HWGROUP(drive); ide_hwgroup_t *hwgroup = HWGROUP(drive);
struct request *rq = &hwgroup->wrq; struct request *rq = &hwgroup->wrq;
...@@ -300,8 +298,6 @@ int ide_multwrite (ide_drive_t *drive, unsigned int mcount) ...@@ -300,8 +298,6 @@ int ide_multwrite (ide_drive_t *drive, unsigned int mcount)
taskfile_output_data(drive, buffer, nsect<<7); taskfile_output_data(drive, buffer, nsect<<7);
ide_unmap_buffer(rq, buffer, &flags); ide_unmap_buffer(rq, buffer, &flags);
} while (mcount); } while (mcount);
return 0;
} }
/* /*
...@@ -322,8 +318,7 @@ static ide_startstop_t multwrite_intr (ide_drive_t *drive) ...@@ -322,8 +318,7 @@ static ide_startstop_t multwrite_intr (ide_drive_t *drive)
* of the request * of the request
*/ */
if (rq->nr_sectors) { if (rq->nr_sectors) {
if (ide_multwrite(drive, drive->mult_count)) ide_multwrite(drive, drive->mult_count);
return ide_stopped;
ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL); ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL);
return ide_started; return ide_started;
} }
...@@ -506,27 +501,10 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector ...@@ -506,27 +501,10 @@ ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector
local_irq_disable(); local_irq_disable();
if (drive->mult_count) { if (drive->mult_count) {
ide_hwgroup_t *hwgroup = HWGROUP(drive); ide_hwgroup_t *hwgroup = HWGROUP(drive);
/*
* Ugh.. this part looks ugly because we MUST set up
* the interrupt handler before outputting the first block
* of data to be written. If we hit an error (corrupted buffer list)
* in ide_multwrite(), then we need to remove the handler/timer
* before returning. Fortunately, this NEVER happens (right?).
*
* Except when you get an error it seems...
*
* MAJOR DATA INTEGRITY BUG !!! only if we error
*/
hwgroup->wrq = *rq; /* scratchpad */ hwgroup->wrq = *rq; /* scratchpad */
ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL); ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL);
if (ide_multwrite(drive, drive->mult_count)) { ide_multwrite(drive, drive->mult_count);
unsigned long flags;
spin_lock_irqsave(&ide_lock, flags);
hwgroup->handler = NULL;
del_timer(&hwgroup->timer);
spin_unlock_irqrestore(&ide_lock, flags);
return ide_stopped;
}
} else { } else {
unsigned long flags; unsigned long flags;
char *to = ide_map_buffer(rq, &flags); char *to = ide_map_buffer(rq, &flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment