All of lore.kernel.org
 help / color / mirror / Atom feed
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.


  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.