Add scsi_mpath_dev_clear_path() to clear a device path when it becomes blocked, and call from __scsi_internal_device_block_nowait().
Signed-off-by: John Garry <[email protected]> --- drivers/scsi/scsi_lib.c | 3 +++ drivers/scsi/scsi_multipath.c | 11 +++++++++++ include/scsi/scsi_multipath.h | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 22e2e3223440d..cc34253c467a2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -34,6 +34,7 @@ #include <scsi/scsi_eh.h> #include <scsi/scsi_host.h> #include <scsi/scsi_transport.h> /* scsi_init_limits() */ +#include <scsi/scsi_multipath.h> #include <scsi/scsi_dh.h> #include <trace/events/scsi.h> @@ -2931,6 +2932,8 @@ EXPORT_SYMBOL(scsi_target_resume); static int __scsi_internal_device_block_nowait(struct scsi_device *sdev) { + if (sdev->scsi_mpath_dev) + scsi_mpath_dev_clear_path(sdev->scsi_mpath_dev); if (scsi_device_set_state(sdev, SDEV_BLOCK)) return scsi_device_set_state(sdev, SDEV_CREATED_BLOCK); diff --git a/drivers/scsi/scsi_multipath.c b/drivers/scsi/scsi_multipath.c index ca4ab720c19af..0f3f3f9fa5fae 100644 --- a/drivers/scsi/scsi_multipath.c +++ b/drivers/scsi/scsi_multipath.c @@ -113,6 +113,17 @@ static ssize_t scsi_mpath_device_vpd_id_show(struct device *dev, } static DEVICE_ATTR(vpd_id, S_IRUGO, scsi_mpath_device_vpd_id_show, NULL); +void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev) +{ + struct mpath_device *mpath_device = &scsi_mpath_dev->mpath_device; + struct scsi_mpath_head *scsi_mpath_head = scsi_mpath_dev->scsi_mpath_head; + struct mpath_head *mpath_head = &scsi_mpath_head->mpath_head; + + if (mpath_clear_current_path(mpath_device)) + mpath_synchronize(mpath_head); +} +EXPORT_SYMBOL_GPL(scsi_mpath_dev_clear_path); + static ssize_t scsi_mpath_device_iopolicy_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { diff --git a/include/scsi/scsi_multipath.h b/include/scsi/scsi_multipath.h index 5cc37acaa664f..d8644d6261992 100644 --- a/include/scsi/scsi_multipath.h +++ b/include/scsi/scsi_multipath.h @@ -49,6 +49,7 @@ int scsi_mpath_dev_alloc(struct scsi_device *sdev); void scsi_mpath_dev_release(struct scsi_device *sdev); int scsi_multipath_init(void); void scsi_multipath_exit(void); +void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev); void scsi_mpath_remove_device(struct scsi_mpath_device *scsi_mpath_dev); void scsi_mpath_add_sysfs_link(struct scsi_device *sdev); void scsi_mpath_remove_sysfs_link(struct scsi_device *sdev); @@ -80,6 +81,10 @@ void scsi_mpath_remove_device(struct scsi_mpath_device *scsi_mpath_dev) { } static inline +void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev) +{ +} +static inline int scsi_mpath_get_head(struct scsi_mpath_head *scsi_mpath_head) { return 0; -- 2.43.7

