From: John Garry <[email protected]> When a scsi_device is unblocked, we need revalidate paths which means that we clear paths and requeue any queued bios.
Signed-off-by: John Garry <[email protected]> --- drivers/scsi/scsi_lib.c | 2 ++ drivers/scsi/scsi_multipath.c | 8 ++++++++ include/scsi/scsi_multipath.h | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index dafa781288046..1e13aefdb6d64 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -3100,6 +3100,8 @@ static int scsi_internal_device_unblock(struct scsi_device *sdev, mutex_lock(&sdev->state_mutex); ret = scsi_internal_device_unblock_nowait(sdev, new_state); + if ((ret == 0) && sdev->scsi_mpath_dev) + scsi_mpath_revalidate_paths(sdev->scsi_mpath_dev); mutex_unlock(&sdev->state_mutex); return ret; diff --git a/drivers/scsi/scsi_multipath.c b/drivers/scsi/scsi_multipath.c index 6a2b06c148c1a..b896d28a7dd9a 100644 --- a/drivers/scsi/scsi_multipath.c +++ b/drivers/scsi/scsi_multipath.c @@ -230,6 +230,14 @@ static int scsi_multipath_sdev_init(struct scsi_device *sdev) return 0; } +void scsi_mpath_revalidate_paths(struct scsi_mpath_device *scsi_mpath_dev) +{ + struct scsi_mpath_head *scsi_mpath_head = scsi_mpath_dev->scsi_mpath_head; + struct mpath_head *mpath_head = &scsi_mpath_head->mpath_head; + + mpath_revalidate_paths(mpath_head); +} + void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev) { struct mpath_device *mpath_device = &scsi_mpath_dev->mpath_device; diff --git a/include/scsi/scsi_multipath.h b/include/scsi/scsi_multipath.h index 8f58c44d96a77..cc77e63c43da3 100644 --- a/include/scsi/scsi_multipath.h +++ b/include/scsi/scsi_multipath.h @@ -55,6 +55,7 @@ void scsi_mpath_remove_sysfs_link(struct scsi_device *sdev); int scsi_mpath_get_head(struct scsi_mpath_head *scsi_mpath_head); void scsi_mpath_put_head(struct scsi_mpath_head *scsi_mpath_head); void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev); +void scsi_mpath_revalidate_paths(struct scsi_mpath_device *scsi_mpath_dev); #else /* CONFIG_SCSI_MULTIPATH */ struct scsi_mpath_head { @@ -93,6 +94,10 @@ static inline void scsi_mpath_dev_clear_path(struct scsi_mpath_device *scsi_mpath_dev) { } +static inline +void scsi_mpath_revalidate_paths(struct scsi_mpath_device *scsi_mpath_dev) +{ +} static inline void scsi_mpath_add_sysfs_link(struct scsi_device *sdev) { } -- 2.43.7

