Currently, scsi_dev_queue_ready() and scsi_host_queue_ready() decrease the
device_blocked or host_blocked counter respectively *before* they determine
the right return value. If the device can't accept a request for some
reason and max_host_blocked or max_device_blocked has been set to 1, this
may lead to scsi_request_fn() being called recursively without giving the
low level driver a chance to unjam the device.
This patch applies to 2.6.24. Please include it in the stable updates as
well.
Signed-off-by: Elias Oltmanns <[EMAIL PROTECTED]>
---
drivers/scsi/scsi_lib.c | 20 ++++++++------------
1 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index a9ac5b1..7513bed 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1357,14 +1357,12 @@ static inline int scsi_dev_queue_ready(s
/*
* unblock after device_blocked iterates to zero
*/
- if (--sdev->device_blocked == 0) {
+ if (sdev->device_blocked-- == 1)
SCSI_LOG_MLQUEUE(3,
sdev_printk(KERN_INFO, sdev,
- "unblocking device at zero depth\n"));
- } else {
- blk_plug_device(q);
- return 0;
- }
+ "device will be unblocked next time\n"));
+ blk_plug_device(q);
+ return 0;
}
if (sdev->device_blocked)
return 0;
@@ -1389,14 +1387,12 @@ static inline int scsi_host_queue_ready(
/*
* unblock after host_blocked iterates to zero
*/
- if (--shost->host_blocked == 0) {
+ if (shost->host_blocked-- == 1)
SCSI_LOG_MLQUEUE(3,
- printk("scsi%d unblocking host at zero depth\n",
+ printk("scsi%d host will be unblocked next
time\n",
shost->host_no));
- } else {
- blk_plug_device(q);
- return 0;
- }
+ blk_plug_device(q);
+ return 0;
}
if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
shost->host_blocked || shost->host_self_blocked) {
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html