提交 448bb22e 编写于 作者: Z zhengbin 提交者: Xie XiuQi

blk-mq: fix a hung issue when set device state to blocked and restore running

euler inclusion
category: bugfix
bugzilla: 12808
CVE: NA

---------------------------

When I use dd test a SCSI device which use blk-mq in the following steps:
1.echo "blocked" >/sys/block/sda/device/state
2.dd if=/dev/sda of=/mnt/t.log bs=1M count=10
3.echo "running" >/sys/block/sda/device/state
dd should finish this work after step 3, unfortunately, still hung.

After step2, the key code process is like this:
blk_mq_dispatch_rq_list-->scsi_queue_rq-->prep_to_mq

prep_to_mq will return BLK_STS_RESOURCE, and scsi_queue_rq will transter
it to BLK_STS_DEV_RESOURCE, which means that driver can guarantee that
IO dispatch will be triggered in future when the resource is available.
Need to follow the rule if we set the device state to running.
Signed-off-by: Nzhengbin <zhengbin13@huawei.com>
Reviewed-by: NJason Yan <yanaijie@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 3331a01b
...@@ -765,9 +765,21 @@ store_state_field(struct device *dev, struct device_attribute *attr, ...@@ -765,9 +765,21 @@ store_state_field(struct device *dev, struct device_attribute *attr,
mutex_lock(&sdev->state_mutex); mutex_lock(&sdev->state_mutex);
ret = scsi_device_set_state(sdev, state); ret = scsi_device_set_state(sdev, state);
/* If device use blk-mq, the device state changes to
* SDEV_RUNNING, we need to run hw queue to avoid io hung.
*/
if ((ret == 0) && (state == SDEV_RUNNING) &&
(sdev->request_queue->mq_ops != NULL))
goto out_run_hw_queue;
mutex_unlock(&sdev->state_mutex); mutex_unlock(&sdev->state_mutex);
return ret == 0 ? count : -EINVAL; return ret == 0 ? count : -EINVAL;
out_run_hw_queue:
mutex_unlock(&sdev->state_mutex);
blk_mq_run_hw_queues(sdev->request_queue, true);
return count;
} }
static ssize_t static ssize_t
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册