mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
sd: Fix max transfer length for 4k disks
The following patch fixes an issue observed with 4k sector disks where the max_hw_sectors attribute was getting set too large in sd_revalidate_disk. Since sdkp->max_xfer_blocks is in units of SCSI logical blocks and queue_max_hw_sectors is in units of 512 byte blocks, on a 4k sector disk, every time we went through sd_revalidate_disk, we were taking the current value of queue_max_hw_sectors and increasing it by a factor of 8. Fix this by only shifting sdkp->max_xfer_blocks. Cc: stable@vger.kernel.org Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
28072ad50c
commit
3a9794d329
@ -2800,9 +2800,11 @@ static int sd_revalidate_disk(struct gendisk *disk)
|
|||||||
*/
|
*/
|
||||||
sd_set_flush_flag(sdkp);
|
sd_set_flush_flag(sdkp);
|
||||||
|
|
||||||
max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue),
|
max_xfer = sdkp->max_xfer_blocks;
|
||||||
sdkp->max_xfer_blocks);
|
|
||||||
max_xfer <<= ilog2(sdp->sector_size) - 9;
|
max_xfer <<= ilog2(sdp->sector_size) - 9;
|
||||||
|
|
||||||
|
max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue),
|
||||||
|
max_xfer);
|
||||||
blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer);
|
blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer);
|
||||||
set_capacity(disk, sdkp->capacity);
|
set_capacity(disk, sdkp->capacity);
|
||||||
sd_config_write_same(sdkp);
|
sd_config_write_same(sdkp);
|
||||||
|
Loading…
Reference in New Issue
Block a user