Message ID | 20210727034455.1494960-1-lijinlin3@huawei.com |
---|---|
State | New |
Headers | show |
Series | [v2] scsi: Fix the issue that the disk capacity set to zero | expand |
lijinlin, What changed in v2? Please make sure to include a change log after the "---" separator when you resubmit a patch. Thank you!
On 2021/7/27 16:48, John Garry wrote: > On 27/07/2021 04:44, lijinlin3@huawei.com wrote: >> From: lijinlin <lijinlin3@huawei.com> >> >> After add physical volumes to a volume group through vgextend, kernel >> will rescan partitions, which will read the capacity of the device. >> If the device status is set to offline through sysfs at this time, >> read capacity command will return a result which the host byte is >> DID_NO_CONNECT, the capacity of the device will be set to zero in >> read_capacity_error(). However, the capacity of the device can't be >> reread after reset the device status to running, is still zero. >> >> Fix this issue by rescan device when the device state changes to >> SDEV_RUNNING. >> >> Signed-off-by: lijinlin <lijinlin3@huawei.com> >> Signed-off-by: Wu Bo <wubo40@huawei.com> >> --- >> drivers/scsi/scsi_sysfs.c | 9 ++++++--- >> 1 file changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c >> index 32489d25158f..ae9bfc658203 100644 >> --- a/drivers/scsi/scsi_sysfs.c >> +++ b/drivers/scsi/scsi_sysfs.c >> @@ -807,11 +807,14 @@ store_state_field(struct device *dev, struct device_attribute *attr, >> mutex_lock(&sdev->state_mutex); >> ret = scsi_device_set_state(sdev, state); >> /* >> - * If the device state changes to SDEV_RUNNING, we need to run >> - * the queue to avoid I/O hang. >> + * If the device state changes to SDEV_RUNNING, we need to >> + * rescan the device to revalidate it, and run the queue to >> + * avoid I/O hang. >> */ >> - if (ret == 0 && state == SDEV_RUNNING) >> + if (ret == 0 && state == SDEV_RUNNING) { >> + scsi_rescan_device(dev); >> blk_mq_run_hw_queues(sdev->request_queue, true); > > I am wondering does any of this need to be done with the device state mutex held? > > Thanks, > John To ensure that the rescan is invoked only in the running state. Thanks. > >> + } >> mutex_unlock(&sdev->state_mutex); >> return ret == 0 ? count : -EINVAL; >> > > .
On Tue, 27 Jul 2021 11:44:55 +0800, lijinlin3@huawei.com wrote: > After add physical volumes to a volume group through vgextend, kernel > will rescan partitions, which will read the capacity of the device. > If the device status is set to offline through sysfs at this time, > read capacity command will return a result which the host byte is > DID_NO_CONNECT, the capacity of the device will be set to zero in > read_capacity_error(). However, the capacity of the device can't be > reread after reset the device status to running, is still zero. > > [...] Applied to 5.14/scsi-fixes, thanks! [1/1] scsi: Fix the issue that the disk capacity set to zero https://git.kernel.org/mkp/scsi/c/d5c8db0e5cd4 -- Martin K. Petersen Oracle Linux Engineering
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 32489d25158f..ae9bfc658203 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -807,11 +807,14 @@ store_state_field(struct device *dev, struct device_attribute *attr, mutex_lock(&sdev->state_mutex); ret = scsi_device_set_state(sdev, state); /* - * If the device state changes to SDEV_RUNNING, we need to run - * the queue to avoid I/O hang. + * If the device state changes to SDEV_RUNNING, we need to + * rescan the device to revalidate it, and run the queue to + * avoid I/O hang. */ - if (ret == 0 && state == SDEV_RUNNING) + if (ret == 0 && state == SDEV_RUNNING) { + scsi_rescan_device(dev); blk_mq_run_hw_queues(sdev->request_queue, true); + } mutex_unlock(&sdev->state_mutex); return ret == 0 ? count : -EINVAL;