patch-2.2.18 linux/drivers/block/floppy.c
Next file: linux/drivers/block/gayle.c
Previous file: linux/drivers/block/falconide.c
Back to the patch index
Back to the overall index
- Lines: 48
- Date:
Sat Sep 23 13:24:12 2000
- Orig file:
v2.2.17/drivers/block/floppy.c
- Orig date:
Fri Apr 21 12:45:50 2000
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.17/drivers/block/floppy.c linux/drivers/block/floppy.c
@@ -2257,6 +2257,7 @@
static void request_done(int uptodate)
{
int block;
+ unsigned long flags;
probing = 0;
reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
@@ -2275,6 +2276,7 @@
DRS->maxtrack = 1;
/* unlock chained buffers */
+ spin_lock_irqsave(&io_request_lock, flags);
while (current_count_sectors && CURRENT &&
current_count_sectors >= CURRENT->current_nr_sectors){
current_count_sectors -= CURRENT->current_nr_sectors;
@@ -2282,6 +2284,7 @@
CURRENT->sector += CURRENT->current_nr_sectors;
end_request(1);
}
+ spin_unlock_irqrestore(&io_request_lock, flags);
if (current_count_sectors && CURRENT){
/* "unlock" last subsector */
CURRENT->buffer += current_count_sectors <<9;
@@ -2305,7 +2308,9 @@
DRWE->last_error_sector = CURRENT->sector;
DRWE->last_error_generation = DRS->generation;
}
+ spin_lock_irqsave(&io_request_lock, flags);
end_request(0);
+ spin_unlock_irqrestore(&io_request_lock, flags);
}
}
@@ -2313,6 +2318,13 @@
static void rw_interrupt(void)
{
int nr_sectors, ssize, eoc, heads;
+
+ if (R_HEAD >= 2) {
+ /* some Toshiba floppy controllers occasionnally seem to
+ * return bogus interrupts after read/write operations, which
+ * can be recognized by a bad head number (>= 2) */
+ return;
+ }
if (!DRS->first_read_date)
DRS->first_read_date = jiffies;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)