public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
From: Bart Van Assche <bart.vanassche@sandisk.com>
To: "Martin K . Petersen" <martin.petersen@oracle.com>,
	James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org,
	Bart Van Assche <bart.vanassche@sandisk.com>,
	Israel Rukshin <israelr@mellanox.com>,
	Max Gurtovoy <maxg@mellanox.com>, Hannes Reinecke <hare@suse.de>,
	Benjamin Block <bblock@linux.vnet.ibm.com>
Subject: [PATCH 05/31] Make __scsi_remove_device go straight from BLOCKED to DEL
Date: Tue, 23 May 2017 17:33:54 -0700	[thread overview]
Message-ID: <20170524003420.5381-6-bart.vanassche@sandisk.com> (raw)
In-Reply-To: <20170524003420.5381-1-bart.vanassche@sandisk.com>

If a device is blocked, make __scsi_remove_device() cause it to
transition to the DEL state. This means that all the commands
issued in .shutdown() will error in the mid-layer, thus making
the removal proceed without being stopped.

This patch is a slightly modified version of a patch from James
Bottomley. This patch avoids that the following lockup occurs:

Call Trace:
 schedule+0x35/0x80
 schedule_timeout+0x237/0x2d0
 io_schedule_timeout+0xa6/0x110
 wait_for_completion_io+0xa3/0x110
 blk_execute_rq+0xdf/0x120
 scsi_execute+0xce/0x150 [scsi_mod]
 scsi_execute_req_flags+0x8f/0xf0 [scsi_mod]
 sd_sync_cache+0xa9/0x190 [sd_mod]
 sd_shutdown+0x6a/0x100 [sd_mod]
 sd_remove+0x64/0xc0 [sd_mod]
 __device_release_driver+0x8d/0x120
 device_release_driver+0x1e/0x30
 bus_remove_device+0xf9/0x170
 device_del+0x127/0x240
 __scsi_remove_device+0xc1/0xd0 [scsi_mod]
 scsi_forget_host+0x57/0x60 [scsi_mod]
 scsi_remove_host+0x72/0x110 [scsi_mod]
 srp_remove_work+0x8b/0x200 [ib_srp]

Reported-by: Israel Rukshin <israelr@mellanox.com>
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Israel Rukshin <israelr@mellanox.com>
Cc: Max Gurtovoy <maxg@mellanox.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Benjamin Block <bblock@linux.vnet.ibm.com>
---
 drivers/scsi/scsi_lib.c   |  2 +-
 drivers/scsi/scsi_sysfs.c | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 0ee5c2133e4c..5c6874cf4388 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2613,7 +2613,6 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
 		case SDEV_QUIESCE:
 		case SDEV_OFFLINE:
 		case SDEV_TRANSPORT_OFFLINE:
-		case SDEV_BLOCK:
 			break;
 		default:
 			goto illegal;
@@ -2627,6 +2626,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)
 		case SDEV_OFFLINE:
 		case SDEV_TRANSPORT_OFFLINE:
 		case SDEV_CANCEL:
+		case SDEV_BLOCK:
 		case SDEV_CREATED_BLOCK:
 			break;
 		default:
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index a91537a3abbf..1f243ac16010 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1290,7 +1290,20 @@ void __scsi_remove_device(struct scsi_device *sdev)
 		 * wait until it has finished before changing the device state.
 		 */
 		mutex_lock(&sdev->state_mutex);
+		/*
+		 * If blocked, we go straight to DEL and restart the queue so
+		 * any commands issued during driver shutdown (like sync
+		 * cache) are errored immediately.
+		 */
 		res = scsi_device_set_state(sdev, SDEV_CANCEL);
+		if (res != 0) {
+			res = scsi_device_set_state(sdev, SDEV_DEL);
+			if (res == 0) {
+				scsi_start_queue(sdev);
+				sdev_printk(KERN_DEBUG, sdev,
+				    "Changed state from BLOCKED to DEL\n");
+			}
+		}
 		mutex_unlock(&sdev->state_mutex);
 
 		if (res != 0)
-- 
2.12.2

  parent reply	other threads:[~2017-05-24  0:33 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-24  0:33 [PATCH 00/31] SCSI patches for kernel v4.13 Bart Van Assche
2017-05-24  0:33 ` [PATCH 01/31] Split scsi_internal_device_block() Bart Van Assche
2017-05-24  5:48   ` Hannes Reinecke
2017-05-24  7:36   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 02/31] Create two versions of scsi_internal_device_unblock() Bart Van Assche
2017-05-24  5:48   ` Hannes Reinecke
2017-05-24  7:38   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 03/31] Protect SCSI device state changes with a mutex Bart Van Assche
2017-05-24  5:51   ` Hannes Reinecke
2017-05-24 15:10     ` Bart Van Assche
2017-05-24  0:33 ` [PATCH 04/31] Introduce scsi_start_queue() Bart Van Assche
2017-05-24  5:51   ` Hannes Reinecke
2017-05-24  0:33 ` Bart Van Assche [this message]
2017-05-24  5:52   ` [PATCH 05/31] Make __scsi_remove_device go straight from BLOCKED to DEL Hannes Reinecke
2017-05-24  0:33 ` [PATCH 06/31] scmd_eh_abort_handler(): Add a comment Bart Van Assche
2017-05-24  5:53   ` Hannes Reinecke
2017-05-24  0:33 ` [PATCH 07/31] scsi: Use blk_mq_rq_to_pdu() to convert a request to a SCSI command pointer Bart Van Assche
2017-05-24  5:54   ` Hannes Reinecke
2017-05-24  7:50   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 08/31] sd, sr: Convert two assignments into warning statements Bart Van Assche
2017-05-24  5:55   ` Hannes Reinecke
2017-05-24  7:52   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 09/31] block: Avoid that blk_exit_rl() triggers a use-after-free Bart Van Assche
2017-05-24  5:55   ` Hannes Reinecke
2017-05-24 15:09   ` Tejun Heo
2017-05-24  0:33 ` [PATCH 10/31] Avoid that scsi_exit_rq() " Bart Van Assche
2017-05-24  5:58   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 11/31] block: Introduce queue flag QUEUE_FLAG_SCSI_SUP Bart Van Assche
2017-05-24  6:01   ` Hannes Reinecke
2017-05-24 15:05     ` Bart Van Assche
2017-05-24  0:34 ` [PATCH 12/31] bsg: Check queue type before attaching to a queue Bart Van Assche
2017-05-24  6:01   ` Hannes Reinecke
2017-05-25  2:01   ` Martin K. Petersen
2017-05-24  0:34 ` [PATCH 13/31] pktcdvd: " Bart Van Assche
2017-05-24  6:02   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 14/31] cdrom: Check private request size " Bart Van Assche
2017-05-24  6:02   ` Hannes Reinecke
     [not found] ` <20170524003420.5381-1-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-05-24  0:34   ` [PATCH 15/31] nfsd: Check private request size before submitting a SCSI request Bart Van Assche
     [not found]     ` <20170524003420.5381-16-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-05-24  6:02       ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 16/31] scsi: Make scsi_ioctl_reset() pass the request queue pointer to blk_rq_init() Bart Van Assche
2017-05-24  6:03   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 17/31] block: Introduce request_queue.initialize_rq_fn() Bart Van Assche
2017-05-24  6:04   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 18/31] block: Make scsi_req_init() calls implicit Bart Van Assche
2017-05-24  6:05   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 19/31] scsi: Change argument type of scsi_req_init() Bart Van Assche
2017-05-24  6:06   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 20/31] scsi: Only add commands to the device command list if required by the LLD Bart Van Assche
2017-05-24  6:07   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 21/31] scsi: Move most of scsi_init_command() into scsi_initialize_rq() Bart Van Assche
2017-05-24  6:09   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 22/31] scsi: Inline scsi_init_command() Bart Van Assche
2017-05-24  6:09   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 23/31] scsi: Move sense buffer pointer initialization into scsi_initialize_rq() Bart Van Assche
2017-05-24  6:10   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 24/31] scsi: Make scsi_initialize_rq() zero the entire struct scsi_cmnd Bart Van Assche
2017-05-24  6:10   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 25/31] scsi-mq: Make behavior scsi_mq_prep_fn() closer to that of scsi_prep_fn() Bart Van Assche
2017-05-24  6:11   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 26/31] scsi: Move the code for clearing private command data into scsi_dispatch_cmd() Bart Van Assche
2017-05-24  6:12   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 27/31] scsi: Consolidate more initialization code Bart Van Assche
2017-05-24  6:13   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 28/31] scsi_setup_fs_cmnd(): Call scsi_req_init() instead of open-coding it Bart Van Assche
2017-05-24  6:13   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 29/31] scsi: snic: Remove code that zeroes driver-private command data Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 30/31] scsi: virtio: " Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 31/31] xen/scsifront: " Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  7:02   ` Juergen Gross
2017-05-24  2:31 ` [PATCH 00/31] SCSI patches for kernel v4.13 Martin K. Petersen
2017-05-24  3:55 ` Jens Axboe
2017-05-24  4:43   ` Bart Van Assche
2017-05-25  2:04 ` Martin K. Petersen
2017-06-01 14:08   ` Bart Van Assche
2017-06-01 14:09     ` 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=20170524003420.5381-6-bart.vanassche@sandisk.com \
    --to=bart.vanassche@sandisk.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=bblock@linux.vnet.ibm.com \
    --cc=hare@suse.de \
    --cc=israelr@mellanox.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=maxg@mellanox.com \
    /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