scsi: sd: Move sd_read_cpr() out of the q->limits_lock region

Commit 804e498e0496 ("sd: convert to the atomic queue limits API")
introduced pairs of function calls to queue_limits_start_update() and
queue_limits_commit_update(). These two functions lock and unlock
q->limits_lock. In sd_revalidate_disk(), sd_read_cpr() is called after
queue_limits_start_update() call and before queue_limits_commit_update()
call. sd_read_cpr() locks q->sysfs_dir_lock and &q->sysfs_lock. Then new
lock dependencies were created between q->limits_lock, q->sysfs_dir_lock
and q->sysfs_lock, as follows:

sd_revalidate_disk
queue_limits_start_update
mutex_lock(&q->limits_lock)
sd_read_cpr
disk_set_independent_access_ranges
mutex_lock(&q->sysfs_dir_lock)
mutex_lock(&q->sysfs_lock)
mutex_unlock(&q->sysfs_lock)
mutex_unlock(&q->sysfs_dir_lock)
queue_limits_commit_update
mutex_unlock(&q->limits_lock)

However, the three locks already had reversed dependencies in other
places. Then the new dependencies triggered the lockdep WARN "possible
circular locking dependency detected" [1]. This WARN was observed by
running the blktests test case srp/002.

To avoid the WARN, move the sd_read_cpr() call in sd_revalidate_disk()
after the queue_limits_commit_update() call. In other words, move the
sd_read_cpr() call out of the q->limits_lock region.

[1] https://lore.kernel.org/linux-scsi/vlmv53ni3ltwxplig5qnw4xsl2h6ccxijfbqzekx76vxoim5a5@dekv7q3es3tx/

Fixes: 804e498e0496 ("sd: convert to the atomic queue limits API")
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Link: https://lore.kernel.org/r/20240801054234.540532-1-shinichiro.kawasaki@wdc.com
Tested-by: Luca Coelho <luciano.coelho@intel.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by Shin'ichiro Kawasaki and committed by Martin K. Petersen ffed586b ab9fd06c

+8 -1
+8 -1
drivers/scsi/sd.c
··· 3753 sd_read_block_limits_ext(sdkp); 3754 sd_read_block_characteristics(sdkp, &lim); 3755 sd_zbc_read_zones(sdkp, &lim, buffer); 3756 - sd_read_cpr(sdkp); 3757 } 3758 3759 sd_print_capacity(sdkp, old_capacity); ··· 3806 blk_mq_unfreeze_queue(sdkp->disk->queue); 3807 if (err) 3808 return err; 3809 3810 /* 3811 * For a zoned drive, revalidating the zones can be done only once
··· 3753 sd_read_block_limits_ext(sdkp); 3754 sd_read_block_characteristics(sdkp, &lim); 3755 sd_zbc_read_zones(sdkp, &lim, buffer); 3756 } 3757 3758 sd_print_capacity(sdkp, old_capacity); ··· 3807 blk_mq_unfreeze_queue(sdkp->disk->queue); 3808 if (err) 3809 return err; 3810 + 3811 + /* 3812 + * Query concurrent positioning ranges after 3813 + * queue_limits_commit_update() unlocked q->limits_lock to avoid 3814 + * deadlock with q->sysfs_dir_lock and q->sysfs_lock. 3815 + */ 3816 + if (sdkp->media_present && scsi_device_supports_vpd(sdp)) 3817 + sd_read_cpr(sdkp); 3818 3819 /* 3820 * For a zoned drive, revalidating the zones can be done only once