linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Aaron Lu <aaron.lu@intel.com>
To: Jeff Garzik <jgarzik@pobox.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	James Bottomley <James.Bottomley@hansenpartnership.com>,
	Alan Stern <stern@rowland.harvard.edu>, Tejun Heo <tj@kernel.org>,
	Oliver Neukum <oliver@neukum.org>
Cc: Jeff Wu <jeff.wu@amd.com>, Aaron Lu <aaron.lwe@gmail.com>,
	Shane Huang <shane.huang@amd.com>,
	linux-ide@vger.kernel.org, linux-pm@vger.kernel.org,
	linux-scsi@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: [PATCH v8 05/11] libata-eh: allow defer in ata_exec_internal
Date: Mon, 29 Oct 2012 17:01:32 +0800	[thread overview]
Message-ID: <1351501298-3716-6-git-send-email-aaron.lu@intel.com> (raw)
In-Reply-To: <1351501298-3716-1-git-send-email-aaron.lu@intel.com>

ata_exec_internal will preempt the ata link's active_tag and ata port's
qc_active flags, this is OK for error recovery, but if normal code path
wants to use ata_exec_internal, there is a problem: we need to check if
it is OK to issue a new command with the help of port_ops->defer.

In ZPODD, I'll need to find out the loading mechanism of the ODD by
issuing a GET_CONFIGURATION command. And this command may very well
race with commands issued from SCSI layer. So instead of preempt the
current command, defer the new command if it's not OK to issue it, as
it is always wrong to issue a non-NCQ command when there is command(s)
in processing.

So ata_exec_internal is modified to check if it is in eh recovery
environment, and if yes, act as before; if not, check if this command
should be defered with the help of port_ops->defer.

Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
 drivers/ata/libata-core.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 611050d..95fb7b8 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -1557,6 +1557,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
 	unsigned long flags;
 	unsigned int err_mask;
 	int rc;
+	bool eh_in_recover;
 
 	spin_lock_irqsave(ap->lock, flags);
 
@@ -1588,14 +1589,21 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
 	qc->dev = dev;
 	ata_qc_reinit(qc);
 
-	preempted_tag = link->active_tag;
-	preempted_sactive = link->sactive;
-	preempted_qc_active = ap->qc_active;
-	preempted_nr_active_links = ap->nr_active_links;
-	link->active_tag = ATA_TAG_POISON;
-	link->sactive = 0;
-	ap->qc_active = 0;
-	ap->nr_active_links = 0;
+	eh_in_recover = ap->pflags & ATA_PFLAG_EH_IN_PROGRESS;
+	if (eh_in_recover) {
+		preempted_tag = link->active_tag;
+		preempted_sactive = link->sactive;
+		preempted_qc_active = ap->qc_active;
+		preempted_nr_active_links = ap->nr_active_links;
+		link->active_tag = ATA_TAG_POISON;
+		link->sactive = 0;
+		ap->qc_active = 0;
+		ap->nr_active_links = 0;
+	} else if (ap->ops->qc_defer && ap->ops->qc_defer(qc)) {
+		ata_qc_free(qc);
+		spin_unlock_irqrestore(ap->lock, flags);
+		return -EBUSY;
+	}
 
 	/* prepare & issue qc */
 	qc->tf = *tf;
@@ -1687,10 +1695,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
 	err_mask = qc->err_mask;
 
 	ata_qc_free(qc);
-	link->active_tag = preempted_tag;
-	link->sactive = preempted_sactive;
-	ap->qc_active = preempted_qc_active;
-	ap->nr_active_links = preempted_nr_active_links;
+	if (eh_in_recover) {
+		link->active_tag = preempted_tag;
+		link->sactive = preempted_sactive;
+		ap->qc_active = preempted_qc_active;
+		ap->nr_active_links = preempted_nr_active_links;
+	}
 
 	spin_unlock_irqrestore(ap->lock, flags);
 
-- 
1.7.12.4


  parent reply	other threads:[~2012-10-29  9:01 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-29  9:01 [PATCH v8 00/11] ZPODD Patches Aaron Lu
2012-10-29  9:01 ` [PATCH v8 01/11] scsi: sr: support runtime pm Aaron Lu
2012-10-29  9:01 ` [PATCH v8 02/11] ata: zpodd: Add CONFIG_SATA_ZPODD Aaron Lu
2012-10-29 18:11   ` James Bottomley
2012-10-30  3:19     ` Aaron Lu
2012-10-29  9:01 ` [PATCH v8 03/11] ata: zpodd: identify and init ZPODD devices Aaron Lu
2012-10-29  9:01 ` [PATCH v8 04/11] libata: acpi: move acpi notification code to sata_zpodd Aaron Lu
2012-10-29  9:01 ` Aaron Lu [this message]
2012-10-29 15:20   ` [PATCH v8 05/11] libata-eh: allow defer in ata_exec_internal Tejun Heo
2012-10-30  3:00     ` Aaron Lu
2012-10-30  3:01       ` Tejun Heo
2012-10-30  3:09         ` Aaron Lu
2012-10-31 21:52           ` Tejun Heo
2012-11-01  2:35             ` Aaron Lu
2012-11-01 16:03               ` Tejun Heo
2012-11-02  0:43                 ` Aaron Lu
2012-10-29  9:01 ` [PATCH v8 06/11] ata: zpodd: check loading mechanism for ODD Aaron Lu
2012-10-29  9:01 ` [PATCH v8 07/11] libata: separate ATAPI code Aaron Lu
2012-10-29  9:01 ` [PATCH v8 08/11] ata: zpodd: check zero power ready status Aaron Lu
2012-10-29  9:01 ` [PATCH v8 09/11] block: add a new interface to block events Aaron Lu
2012-10-29 15:35   ` Tejun Heo
2012-10-30  7:04     ` Aaron Lu
2012-10-31 21:51       ` Tejun Heo
2012-11-01  6:30         ` Aaron Lu
2012-10-29  9:01 ` [PATCH v8 10/11] scsi: sr: support (un)block events Aaron Lu
2012-10-29 18:11   ` James Bottomley
2012-10-29 22:22     ` Alan Stern
2012-10-30  4:34       ` James Bottomley
2012-10-30  5:02     ` Aaron Lu
2012-10-29  9:01 ` [PATCH v8 11/11] ata: zpodd: handle power transition of ODD Aaron Lu

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=1351501298-3716-6-git-send-email-aaron.lu@intel.com \
    --to=aaron.lu@intel.com \
    --cc=James.Bottomley@hansenpartnership.com \
    --cc=aaron.lwe@gmail.com \
    --cc=jeff.wu@amd.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=oliver@neukum.org \
    --cc=rjw@sisk.pl \
    --cc=shane.huang@amd.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tj@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).