On 2021/7/27 16:48, John Garry wrote: > On 27/07/2021 04:44, lijinlin3@xxxxxxxxxx wrote: >> From: lijinlin <lijinlin3@xxxxxxxxxx> >> >> 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@xxxxxxxxxx> >> Signed-off-by: Wu Bo <wubo40@xxxxxxxxxx> >> --- >> 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; >> > > .