On 10/14/2010 09:04 AM, Hillf Danton wrote:
There seems that the id of the tgtr_scmd processed by scsi_try_target_reset() does not match the id in case that SUCCESS is returned by scsi_try_target_reset(). The mismatch is fixed, and the loop to find the next highest is also simplified. Signed-off-by: Hillf Danton<dhillf@xxxxxxxxx> --- --- a/drivers/scsi/scsi_error.c 2010-09-13 07:07:38.000000000 +0800 +++ b/drivers/scsi/scsi_error.c 2010-10-14 21:45:56.000000000 +0800 @@ -1173,14 +1173,19 @@ static int scsi_eh_target_reset(struct S list_for_each_entry(scmd, work_q, eh_entry) { if (scmd_id(scmd)> id&& (!tgtr_scmd || - scmd_id(tgtr_scmd)> scmd_id(scmd))) + scmd_id(tgtr_scmd)> scmd_id(scmd))) { tgtr_scmd = scmd; + if (1 + id == scmd_id(scmd)) + break; + } } } if (!tgtr_scmd) /* no more commands, that's it */ break; + id = scmd_id(tgtr_scmd); + SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending target reset " "to target %d\n", current->comm, id));
Thanks. Fixes the extra target resets I have been seeing and commands not getting cleaned up properly.
Reviewed-by: Mike Christie <michaelc@xxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html