OSDN Git Service

[PATCH] ps2esdi: typo may cause premature timeout
authorWilly Tarreau <w@1wt.eu>
Sat, 25 Nov 2006 20:49:21 +0000 (21:49 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 25 Nov 2006 22:14:14 +0000 (23:14 +0100)
The stop condition in the following statement causes an immediate
break out of the loop because ESDI_TIMEOUT=0xf000 and the result
of the !(inb()) expression can only be either 0 or 1, which means
that i never gets counted down.

   for (i = ESDI_TIMEOUT;
        i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL);
        i--);

The obvious cause is the use of "i & !" instead of "i && !". This
was already fixed in 2.6.

Signed-off-by: Willy Tarreau <w@1wt.eu>
drivers/block/ps2esdi.c

index 291b9b9..08583c4 100644 (file)
@@ -741,7 +741,7 @@ static void ps2esdi_geometry_int_handler(u_int int_ret_code)
        drive_num = int_ret_code >> 5;
        switch (int_ret_code & 0xf) {
        case INT_CMD_COMPLETE:
-               for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
+               for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
                if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) {
                        printk("%s: timeout reading status word\n", DEVICE_NAME);
                        outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);
@@ -876,7 +876,7 @@ static void ps2esdi_normal_interrupt_handler(u_int int_ret_code)
                break;
 
        case INT_CMD_COMPLETE:
-               for (i = ESDI_TIMEOUT; i & !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
+               for (i = ESDI_TIMEOUT; i && !(inb(ESDI_STATUS) & STATUS_STAT_AVAIL); i--);
                if (!(inb(ESDI_STATUS) & STATUS_STAT_AVAIL)) {
                        printk("%s: timeout reading status word\n", DEVICE_NAME);
                        outb((int_ret_code & 0xe0) | ATT_EOI, ESDI_ATTN);