From: "tang.junhui" <tang.junhui@xxxxxxxxxx> Activate_complete fn() must be called in alua_activate() if alua_rtpg_queue() failed, otherwise, it would cause I/Os hang in DM devices. So this patch add return value and check for alua_rtpg_queue(). Signed-off-by: tang.junhui <tang.junhui@xxxxxxxxxx> --- drivers/scsi/device_handler/scsi_dh_alua.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index 7bb2068..62075c7 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c @@ -113,7 +113,7 @@ struct alua_queue_data { #define ALUA_POLICY_SWITCH_ALL 1 static void alua_rtpg_work(struct work_struct *work); -static void alua_rtpg_queue(struct alua_port_group *pg, +static int alua_rtpg_queue(struct alua_port_group *pg, struct scsi_device *sdev, struct alua_queue_data *qdata, bool force); static void alua_check(struct scsi_device *sdev, bool force); @@ -862,7 +862,7 @@ static void alua_rtpg_work(struct work_struct *work) kref_put(&pg->kref, release_port_group); } -static void alua_rtpg_queue(struct alua_port_group *pg, +static int alua_rtpg_queue(struct alua_port_group *pg, struct scsi_device *sdev, struct alua_queue_data *qdata, bool force) { @@ -871,7 +871,7 @@ static void alua_rtpg_queue(struct alua_port_group *pg, struct workqueue_struct *alua_wq = kaluad_wq; if (!pg) - return; + return SCSI_DH_IO; spin_lock_irqsave(&pg->lock, flags); if (qdata) { @@ -906,7 +906,10 @@ static void alua_rtpg_queue(struct alua_port_group *pg, if (sdev) scsi_device_put(sdev); kref_put(&pg->kref, release_port_group); + return SCSI_DH_IO; } + + return SCSI_DH_OK; } /* @@ -1007,11 +1010,12 @@ static int alua_activate(struct scsi_device *sdev, mutex_unlock(&h->init_mutex); goto out; } - fn = NULL; rcu_read_unlock(); mutex_unlock(&h->init_mutex); - alua_rtpg_queue(pg, sdev, qdata, true); + err = alua_rtpg_queue(pg, sdev, qdata, true); + if (!err) + fn = NULL; kref_put(&pg->kref, release_port_group); out: if (fn) -- 2.8.1.windows.1 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html