Re: [PATCH] various IDE patches/cleanups
From: Davin McCall
Date: Thu Feb 05 2004 - 00:19:14 EST
Damn, I found a problem with this. Needs to set hwgroup->expiry to NULL before releasing ide_lock; that prevents ide_timer_expiry() from running the expiry() handler and instead it will simulate an interrupt.
Otherwise, expiry() may return non-zero which will cause the timer to be reset. The interrupt would effectively be lost. In some cases (abuses?) this would lock the whole hwgroup forever as the expiry() function always returns > 0 (ide-cd.c, cdrom_timer_expiry() for example).
Here's the revised patch.
diff -urN linux-2.6.0-patch2/drivers/ide/ide-io.c linux-2.6.0/drivers/ide/ide-io.c
--- linux-2.6.0-patch2/drivers/ide/ide-io.c Wed Jan 28 22:55:00 2004
+++ linux-2.6.0/drivers/ide/ide-io.c Wed Jan 28 23:49:17 2004
@@ -1303,8 +1303,12 @@
hwgroup->busy = 1; /* paranoia */
printk(KERN_ERR "%s: ide_intr: hwgroup->busy was 0 ??\n", drive->name);
}
+ if (!del_timer(&hwgroup->timer)) {
+ /* timer has expired, ide_timer_expiry is waiting to get lock */
+ hwgroup->expiry = NULL;
+ spin_unlock(&ide_lock);
+ return IRQ_HANDLED;
+ }
hwgroup->handler = NULL;
- del_timer(&hwgroup->timer);
spin_unlock(&ide_lock);
if (drive->unmask)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/