All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@steeleye.com>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
	linux-ide@vger.kernel.org,
	SCSI Mailing List <linux-scsi@vger.kernel.org>
Subject: Re: [PATCH/RFT] libata "DMA timeout" fix
Date: 28 Feb 2004 14:49:15 -0600	[thread overview]
Message-ID: <1078001357.2020.90.camel@mulgrave> (raw)
In-Reply-To: <4040E7B5.4020709@pobox.com>

On Sat, 2004-02-28 at 13:10, Jeff Garzik wrote:
> ===== drivers/scsi/libata-core.c 1.19 vs edited =====
> --- 1.19/drivers/scsi/libata-core.c	Wed Feb 25 22:41:13 2004
> +++ edited/drivers/scsi/libata-core.c	Sat Feb 28 14:03:18 2004
> @@ -2130,6 +2130,14 @@
>  				cmd->result = SAM_STAT_CHECK_CONDITION;
>  			else
>  				ata_to_sense_error(qc);
> +
> +			/* hack alert! we need this to get past the
> +			 * first check in scsi_done().  libata is the
> +			 * -only- user of ->eh_strategy_handler() in
> +			 * any kernel tree, which exposes some incorrect
> +			 * assumptions in the SCSI layer.
> +			 */
> +			scsi_add_timer(cmd, 2000 * HZ, NULL);
>  		} else {
>  			cmd->result = SAM_STAT_GOOD;
>  		}

You can't do this.  Supposing there command's delayed, the timer fires
and then the command returns with a sense error?  The done will go
through automatically completing the command, but your strategy handler
will still think it has a failed command to handle.

The correct fix is this, I think (uncompiled, but you get the idea):

===== libata-core.c 1.19 vs edited =====
--- 1.19/drivers/scsi/libata-core.c	Wed Feb 25 21:41:13 2004
+++ edited/libata-core.c	Sat Feb 28 14:46:17 2004
@@ -1972,6 +1972,11 @@
 	/* FIXME */
 }
 
+static void ata_eng_timeout_done(struct scsi_cmnd *cmnd)
+{
+	scsi_finish_command(cmnd);
+}
+
 /**
  *	ata_eng_timeout - Handle timeout of queued command
  *	@ap: Port on which timed-out command is active
@@ -2005,6 +2010,7 @@
 		goto out;
 	}
 
+	qc->scsidone = ata_eng_timeout_done;
 	switch (qc->tf.protocol) {
 	case ATA_PROT_DMA_READ:
 	case ATA_PROT_DMA_WRITE:

James



  reply	other threads:[~2004-02-28 20:50 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-02-28 19:10 [PATCH/RFT] libata "DMA timeout" fix Jeff Garzik
2004-02-28 20:49 ` James Bottomley [this message]
2004-02-28 21:23   ` Jeff Garzik
2004-02-28 21:28     ` James Bottomley
2004-02-29 17:26     ` Justin Cormack
2004-02-29 17:31       ` Jeff Garzik

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=1078001357.2020.90.camel@mulgrave \
    --to=james.bottomley@steeleye.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --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.