scsi_eh_flush_done_q return status
PATCH 1/1 scsi_eh_flush_done_q return status
This is a refresh of a patch for a previously reported problem with the scsi_eh_flush_done_q. The original thread is located here:
http://marc.theaimsgroup.com/?l=linux-scsi&m=107043398314649&w=2
This patch has a one line difference than the one previously posted in response to the thread. In the previous patch I was unconditionally setting result in the finish case.
I verified the patch using scsi_debug + gov, but could only cover the retry path of the patch. I ran out of time to tweak scsi_debug to give me the right failure signature. If Hironobu has some free time may be the patch could be verified on the original failing system.
-andmike
--
Michael Anderson
[email protected]
DESC
This patch fixes a bug in scsi_eh_flush_done_q when the allowed count has been exceeded and the command errored for a timeout. The bug is that the result will be left at zero and the command finished.
author: Mike Anderson <[email protected]>patch_version: Thu Jan 15 20:27:10 UTC 2004
EDESC
patched-scsi-misc-2.7-andmike/drivers/scsi/scsi_error.c | 28 +++++++--------- 1 files changed, 13 insertions(+), 15 deletions(-)
drivers/scsi/scsi_error.c renamed from drivers/scsi/scsi_error.c~scsi_error_retry +13 -15
@@ -1420,23 +1420,21 @@ static void scsi_eh_flush_done_q(structlist_for_each_safe (lh, lh_sf, done_q) { scmd = list_entry(lh, struct scsi_cmnd, eh_entry);list_del_init (lh); -if (!scmd->device->online) { - scmd->result |= (DRIVER_TIMEOUT <<24 ); - }else { -if (++scmd->retries < scmd->allowed) { -SCSI_LOG_ERROR_RECOVERY (3 , -printk ("%s: flush retry" -" cmd: %p\n" , - current->comm, - scmd)); +if (scmd->device->online && + (++scmd->retries < scmd->allowed)) { +SCSI_LOG_ERROR_RECOVERY (3 ,printk ("%s: flush" +" retry cmd: %p\n" , + current->comm, + scmd));scsi_queue_insert (scmd,SCSI_MLQUEUE_EH_RETRY ); -continue ; - } + }else { +if (!scmd->result) + scmd->result |= (DRIVER_TIMEOUT <<24 ); +SCSI_LOG_ERROR_RECOVERY (3 ,printk ("%s: flush finish" +" cmd: %p\n" , + current->comm, scmd)); +scsi_finish_command (scmd); } -SCSI_LOG_ERROR_RECOVERY (3 ,printk ("%s: flush finish" -" cmd: %p\n" , - current->comm, scmd)); -scsi_finish_command (scmd); } }
_
Hi Mike,
Sorry for my too late response.
I verified your patch on the original faling system. It was OK.
Thank you.
Hironobu Ishii
----- Original Message -----
From: "Mike Anderson" <[email protected]>
To: <[email protected]>
Cc: <[email protected]>
Sent: Saturday, January 17, 2004 5:11 AM
Subject: [PATCH] scsi_eh_flush_done_q return status
Quoted 75 lines
This is a refresh of a patch for a previously reported problem with the
scsi_eh_flush_done_q. The original thread is located here:http://marc.theaimsgroup.com/?l=linux-scsi&m=107043398314649&w=2
This patch has a one line difference than the one previously posted in response to the thread. In the previous patch I was unconditionally setting result in the finish case.
I verified the patch using
scsi_debug+ gov, but could only cover the retry path of the patch. I ran out of time to tweakscsi_debugto give me the right failure signature. If Hironobu has some free time may be the patch could be verified on the original failing system.-andmike
--
Michael Anderson
[email protected]DESC
This patch fixes a bug inscsi_eh_flush_done_qwhen the allowed count has been exceeded and the command errored for a timeout. The bug is that the result will be left at zero and the command finished.author: Mike Anderson <[email protected]>
patch_version: Thu Jan 15 20:27:10 UTC 2004
EDESCpatched-scsi-misc-2.7-andmike/drivers/scsi/scsi_error.c | 28 +++++++--------- 1 files changed, 13 insertions(+), 15 deletions(-)diff -puN
drivers/scsi/scsi_error.c~scsi_error_retrydrivers/scsi/scsi_error.cdrivers/scsi/scsi_error.c Thu Jan 15 22:14:40 2004 renamed from drivers/scsi/scsi_error.c~scsi_error_retry Thu Jan 15 22:14:40 2004 +13
-15@@ -1420,23 +1420,21 @@ static void scsi_eh_flush_done_q(struct list_for_each_safe(lh, lh_sf, done_q) { scmd = list_entry(lh, struct scsi_cmnd, eh_entry); list_del_init(lh); - if (!scmd->device->online) { - scmd->result |= (DRIVER_TIMEOUT << 24); - } else { - if (++scmd->retries < scmd->allowed) { - SCSI_LOG_ERROR_RECOVERY(3, - printk("%s: flush retry" - " cmd: %p\n", - current->comm, - scmd)); + if (scmd->device->online && + (++scmd->retries < scmd->allowed)) { + SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush" + " retry cmd: %p\n", + current->comm, + scmd)); scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY); - continue; - } + } else { + if (!scmd->result) + scmd->result |= (DRIVER_TIMEOUT << 24); + SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush finish" + " cmd: %p\n", + current->comm, scmd)); + scsi_finish_command(scmd); } - SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush finish" - " cmd: %p\n", - current->comm, scmd)); - scsi_finish_command(scmd); } }_
Quoted 6 lines · Hironobu Ishii [[email protected]] wrote:
Hi Mike,
Sorry for my too late response.
I verified your patch on the original faling system. It was OK.
Thanks for doing this.
-andmike
--
Michael Anderson
[email protected]