|
@@ -697,6 +697,12 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
|
|
*/
|
|
*/
|
|
scsi_mq_uninit_cmd(cmd);
|
|
scsi_mq_uninit_cmd(cmd);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * queue is still alive, so grab the ref for preventing it
|
|
|
|
+ * from being cleaned up during running queue.
|
|
|
|
+ */
|
|
|
|
+ percpu_ref_get(&q->q_usage_counter);
|
|
|
|
+
|
|
__blk_mq_end_request(req, error);
|
|
__blk_mq_end_request(req, error);
|
|
|
|
|
|
if (scsi_target(sdev)->single_lun ||
|
|
if (scsi_target(sdev)->single_lun ||
|
|
@@ -704,6 +710,8 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
|
|
kblockd_schedule_work(&sdev->requeue_work);
|
|
kblockd_schedule_work(&sdev->requeue_work);
|
|
else
|
|
else
|
|
blk_mq_run_hw_queues(q, true);
|
|
blk_mq_run_hw_queues(q, true);
|
|
|
|
+
|
|
|
|
+ percpu_ref_put(&q->q_usage_counter);
|
|
} else {
|
|
} else {
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|