From: Bart Van Assche <bvanassche@acm.org>
To: James Bottomley <jbottomley@parallels.com>
Cc: Mike Christie <michaelc@cs.wisc.edu>,
Hannes Reinecke <hare@suse.de>,
David Milburn <dmilburn@redhat.com>,
linux-scsi <linux-scsi@vger.kernel.org>,
Roland Dreier <roland@kernel.org>
Subject: [PATCH 2/7] Rework scsi_internal_device_unblock()
Date: Tue, 20 Aug 2013 14:07:28 +0200 [thread overview]
Message-ID: <52135C00.8040706@acm.org> (raw)
In-Reply-To: <52135B99.2000102@acm.org>
Except for scsi_internal_device_unblock() all SCSI device state
changes happen via scsi_device_set_state(). Modify
scsi_internal_device_unblock() such that it uses
scsi_device_set_state() to change the device state. This requires
modifying scsi_device_set_state() such that it allows the
transition from SDEV_CREATED_BLOCK to the SDEV_OFFLINE and
SDEV_TRANSPORT_OFFLINE states.
Note: since the SDEV_CREATED_BLOCK to SDEV_{TRANSPORT_,}OFFLINE
transition is now allowed, direct scsi_device_set_state() calls
that change the device state from SDEV_CREATED_BLOCK into
SDEV_*OFFLINE will now proceed instead of being rejected. As far
as I have been able to verify this behavior change is fine for
all upstream SCSI transport drivers and SCSI LLDs.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: Mike Christie <michaelc@cs.wisc.edu>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Roland Dreier <roland@kernel.org>
---
drivers/scsi/scsi_lib.c | 29 +++++++++++------------------
1 file changed, 11 insertions(+), 18 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 124392f..9eb05a7 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2147,6 +2147,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
case SDEV_RUNNING:
case SDEV_QUIESCE:
case SDEV_BLOCK:
+ case SDEV_CREATED_BLOCK:
break;
default:
goto illegal;
@@ -2501,29 +2502,21 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
{
struct request_queue *q = sdev->request_queue;
unsigned long flags;
+ int res;
/*
* Try to transition the scsi device to SDEV_RUNNING or one of the
* offlined states and goose the device queue if successful.
*/
- if ((sdev->sdev_state == SDEV_BLOCK) ||
- (sdev->sdev_state == SDEV_TRANSPORT_OFFLINE))
- sdev->sdev_state = new_state;
- else if (sdev->sdev_state == SDEV_CREATED_BLOCK) {
- if (new_state == SDEV_TRANSPORT_OFFLINE ||
- new_state == SDEV_OFFLINE)
- sdev->sdev_state = new_state;
- else
- sdev->sdev_state = SDEV_CREATED;
- } else if (sdev->sdev_state != SDEV_CANCEL &&
- sdev->sdev_state != SDEV_OFFLINE)
- return -EINVAL;
-
- spin_lock_irqsave(q->queue_lock, flags);
- blk_start_queue(q);
- spin_unlock_irqrestore(q->queue_lock, flags);
-
- return 0;
+ if (sdev->sdev_state == SDEV_CREATED_BLOCK && new_state == SDEV_RUNNING)
+ new_state = SDEV_CREATED;
+ res = scsi_device_set_state(sdev, new_state);
+ if (!scsi_device_blocked(sdev)) {
+ spin_lock_irqsave(q->queue_lock, flags);
+ blk_start_queue(q);
+ spin_unlock_irqrestore(q->queue_lock, flags);
+ }
+ return res;
}
EXPORT_SYMBOL_GPL(scsi_internal_device_unblock);
--
1.7.10.4
next prev parent reply other threads:[~2013-08-20 12:07 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-20 12:05 SCSI core patches for kernel 3.12 Bart Van Assche
2013-08-20 12:06 ` [PATCH 1/7] Introduce scsi_device_being_removed() Bart Van Assche
2013-09-01 16:43 ` Christoph Hellwig
2013-08-20 12:07 ` Bart Van Assche [this message]
2013-09-01 16:44 ` [PATCH 2/7] Rework scsi_internal_device_unblock() Christoph Hellwig
2013-08-20 12:08 ` [PATCH 3/7] Avoid re-enabling I/O after the transport became offline Bart Van Assche
2013-09-01 16:46 ` Christoph Hellwig
2013-08-20 12:08 ` [PATCH 4/7] Disallow changing the device state via sysfs into "deleted" Bart Van Assche
2013-09-01 16:49 ` Christoph Hellwig
2013-09-02 18:59 ` Bart Van Assche
2013-09-02 19:06 ` Christoph Hellwig
2013-09-02 19:12 ` Bart Van Assche
2013-09-02 19:17 ` Christoph Hellwig
2013-08-20 12:09 ` [PATCH 5/7] Micro-optimize scsi_request_fn() Bart Van Assche
2013-09-01 16:50 ` Christoph Hellwig
2013-08-20 12:09 ` [PATCH 6/7] Rename scsi_get_command() and scsi_put_command() Bart Van Assche
2013-08-20 12:10 ` [PATCH 7/7] Micro-optimize scsi_next_command() Bart Van Assche
2013-09-01 17:06 ` Christoph Hellwig
2013-09-01 17:08 ` [PATCH 8/7] scsi: cleanup scsi_requeue_command Christoph Hellwig
2013-08-20 16:11 ` SCSI core patches for kernel 3.12 Nicholas A. Bellinger
2013-08-20 16:15 ` Bart Van Assche
2013-08-20 17:04 ` Nicholas A. Bellinger
2013-08-20 18:00 ` Bart Van Assche
2013-08-20 20:38 ` Nicholas A. Bellinger
2013-08-21 6:48 ` Christoph Hellwig
2013-08-21 7:35 ` Nicholas A. Bellinger
2013-10-02 7:40 ` Christoph Hellwig
2013-10-02 15:15 ` James Bottomley
2013-10-02 16:17 ` Christoph Hellwig
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=52135C00.8040706@acm.org \
--to=bvanassche@acm.org \
--cc=dmilburn@redhat.com \
--cc=hare@suse.de \
--cc=jbottomley@parallels.com \
--cc=linux-scsi@vger.kernel.org \
--cc=michaelc@cs.wisc.edu \
--cc=roland@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).