From: Mike Christie <michaelc@cs.wisc.edu>
To: James Bottomley <James.Bottomley@suse.de>
Cc: Hillf Danton <dhillf@gmail.com>, linux-scsi@vger.kernel.org
Subject: Re: [PATCH] fix id computation in scsi_eh_target_reset()
Date: Tue, 26 Oct 2010 18:07:46 -0500 [thread overview]
Message-ID: <4CC75F42.9030603@cs.wisc.edu> (raw)
In-Reply-To: <1288040021.5487.826.camel@mulgrave.site>
On 10/25/2010 03:53 PM, James Bottomley wrote:
>
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index 1de30eb..484b128 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -1156,51 +1156,40 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,
> struct list_head *work_q,
> struct list_head *done_q)
> {
> - struct scsi_cmnd *scmd, *tgtr_scmd, *next;
> - unsigned int id = 0;
> - int rtn;
> + LIST_HEAD(tmp_list);
>
> - do {
> - tgtr_scmd = NULL;
> - list_for_each_entry(scmd, work_q, eh_entry) {
> - if (id == scmd_id(scmd)) {
> - tgtr_scmd = scmd;
> - break;
> - }
> - }
> - if (!tgtr_scmd) {
> - /* not one exactly equal; find the next highest */
> - list_for_each_entry(scmd, work_q, eh_entry) {
> - if (scmd_id(scmd)> id&&
> - (!tgtr_scmd ||
> - scmd_id(tgtr_scmd)> scmd_id(scmd)))
> - tgtr_scmd = scmd;
> - }
> - }
> - if (!tgtr_scmd)
> - /* no more commands, that's it */
> - break;
> + list_splice(work_q,&tmp_list);
I think I am hitting multiple bugs. One might be with this patch, but
strangely they both hit __list_add bugs in the scsi eh. I think this
needs to be list_splice_init().
> + list_for_each_entry_safe(scmd, next,&tmp_list, eh_entry) {
> + if (scmd_id(scmd) != id)
> + continue;
> +
> + if ((rtn == SUCCESS || rtn == FAST_IO_FAIL)
> + && (!scsi_device_online(scmd->device) ||
> + rtn == FAST_IO_FAIL || !scsi_eh_tur(scmd)))
> + scsi_eh_finish_cmd(scmd, done_q);
Because if the target resets work and move all the commands to the
done_q here.
> + else
> + /* push back on work queue for further processing */
> + list_move(&scmd->eh_entry, work_q);
> + }
>
> return list_empty(work_q);
> }
Then this work_q is showing garbage in it from the splice I think.
Without the list_splice_init I get that trace I cut and pasted in the
other mail when I just force the scsi eh to run the target reset code.
In the test, the target reset succeeds. The scsi_eh_finish_cmd call
above moves all the cmds to the done_q. But the work_q still has junk in
it, and so we return that we need to do more work and eventually we end
up running scsi_eh_offline_sdevs which calls scsi_eh_finish_cmd on a
command we already moved to the done_q.
next prev parent reply other threads:[~2010-10-26 23:00 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-14 14:04 [PATCH] fix id computation in scsi_eh_target_reset() Hillf Danton
2010-10-18 5:33 ` Mike Christie
2010-10-25 20:53 ` James Bottomley
2010-10-26 14:04 ` Hillf Danton
2010-10-26 20:13 ` Mike Christie
2010-10-26 20:10 ` James Bottomley
2010-10-27 13:12 ` Hillf Danton
2010-10-26 23:07 ` Mike Christie [this message]
2010-10-26 23:09 ` James Bottomley
2010-10-27 18:18 ` Mike Christie
2010-10-28 13:29 ` Hillf Danton
2010-12-14 20:57 ` Mike Christie
2010-12-15 2:31 ` James Bottomley
2010-12-16 15:10 ` Hillf Danton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4CC75F42.9030603@cs.wisc.edu \
--to=michaelc@cs.wisc.edu \
--cc=James.Bottomley@suse.de \
--cc=dhillf@gmail.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.