Skip to content

Commit 7fb019c

Browse files
scsi: sd: Switch to using scsi_device VPD pages
Use the VPD pages already provided by the SCSI midlayer. No need to request them individually in the SCSI disk driver. Link: https://lore.kernel.org/r/20220302053559.32147-8-martin.petersen@oracle.com Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent e38d9e8 commit 7fb019c

File tree

1 file changed

+40
-40
lines changed

1 file changed

+40
-40
lines changed

drivers/scsi/sd.c

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2844,39 +2844,39 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
28442844
static void sd_read_block_limits(struct scsi_disk *sdkp)
28452845
{
28462846
unsigned int sector_sz = sdkp->device->sector_size;
2847-
const int vpd_len = 64;
2848-
unsigned char *buffer = kmalloc(vpd_len, GFP_KERNEL);
2847+
struct scsi_vpd *vpd;
28492848

2850-
if (!buffer ||
2851-
/* Block Limits VPD */
2852-
scsi_get_vpd_page(sdkp->device, 0xb0, buffer, vpd_len))
2849+
rcu_read_lock();
2850+
2851+
vpd = rcu_dereference(sdkp->device->vpd_pgb0);
2852+
if (!vpd || vpd->len < 16)
28532853
goto out;
28542854

28552855
blk_queue_io_min(sdkp->disk->queue,
2856-
get_unaligned_be16(&buffer[6]) * sector_sz);
2856+
get_unaligned_be16(&vpd->data[6]) * sector_sz);
28572857

2858-
sdkp->max_xfer_blocks = get_unaligned_be32(&buffer[8]);
2859-
sdkp->opt_xfer_blocks = get_unaligned_be32(&buffer[12]);
2858+
sdkp->max_xfer_blocks = get_unaligned_be32(&vpd->data[8]);
2859+
sdkp->opt_xfer_blocks = get_unaligned_be32(&vpd->data[12]);
28602860

2861-
if (buffer[3] == 0x3c) {
2861+
if (vpd->len >= 64) {
28622862
unsigned int lba_count, desc_count;
28632863

2864-
sdkp->max_ws_blocks = (u32)get_unaligned_be64(&buffer[36]);
2864+
sdkp->max_ws_blocks = (u32)get_unaligned_be64(&vpd->data[36]);
28652865

28662866
if (!sdkp->lbpme)
28672867
goto out;
28682868

2869-
lba_count = get_unaligned_be32(&buffer[20]);
2870-
desc_count = get_unaligned_be32(&buffer[24]);
2869+
lba_count = get_unaligned_be32(&vpd->data[20]);
2870+
desc_count = get_unaligned_be32(&vpd->data[24]);
28712871

28722872
if (lba_count && desc_count)
28732873
sdkp->max_unmap_blocks = lba_count;
28742874

2875-
sdkp->unmap_granularity = get_unaligned_be32(&buffer[28]);
2875+
sdkp->unmap_granularity = get_unaligned_be32(&vpd->data[28]);
28762876

2877-
if (buffer[32] & 0x80)
2877+
if (vpd->data[32] & 0x80)
28782878
sdkp->unmap_alignment =
2879-
get_unaligned_be32(&buffer[32]) & ~(1 << 31);
2879+
get_unaligned_be32(&vpd->data[32]) & ~(1 << 31);
28802880

28812881
if (!sdkp->lbpvpd) { /* LBP VPD page not provided */
28822882

@@ -2898,7 +2898,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
28982898
}
28992899

29002900
out:
2901-
kfree(buffer);
2901+
rcu_read_unlock();
29022902
}
29032903

29042904
/**
@@ -2908,18 +2908,21 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
29082908
static void sd_read_block_characteristics(struct scsi_disk *sdkp)
29092909
{
29102910
struct request_queue *q = sdkp->disk->queue;
2911-
unsigned char *buffer;
2911+
struct scsi_vpd *vpd;
29122912
u16 rot;
2913-
const int vpd_len = 64;
2913+
u8 zoned;
29142914

2915-
buffer = kmalloc(vpd_len, GFP_KERNEL);
2915+
rcu_read_lock();
2916+
vpd = rcu_dereference(sdkp->device->vpd_pgb1);
29162917

2917-
if (!buffer ||
2918-
/* Block Device Characteristics VPD */
2919-
scsi_get_vpd_page(sdkp->device, 0xb1, buffer, vpd_len))
2920-
goto out;
2918+
if (!vpd || vpd->len < 8) {
2919+
rcu_read_unlock();
2920+
return;
2921+
}
29212922

2922-
rot = get_unaligned_be16(&buffer[4]);
2923+
rot = get_unaligned_be16(&vpd->data[4]);
2924+
zoned = (vpd->data[8] >> 4) & 3;
2925+
rcu_read_unlock();
29232926

29242927
if (rot == 1) {
29252928
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
@@ -2930,7 +2933,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
29302933
/* Host-managed */
29312934
blk_queue_set_zoned(sdkp->disk, BLK_ZONED_HM);
29322935
} else {
2933-
sdkp->zoned = (buffer[8] >> 4) & 3;
2936+
sdkp->zoned = zoned;
29342937
if (sdkp->zoned == 1) {
29352938
/* Host-aware */
29362939
blk_queue_set_zoned(sdkp->disk, BLK_ZONED_HA);
@@ -2941,7 +2944,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
29412944
}
29422945

29432946
if (!sdkp->first_scan)
2944-
goto out;
2947+
return;
29452948

29462949
if (blk_queue_is_zoned(q)) {
29472950
sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n",
@@ -2954,9 +2957,6 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
29542957
sd_printk(KERN_NOTICE, sdkp,
29552958
"Drive-managed SMR disk\n");
29562959
}
2957-
2958-
out:
2959-
kfree(buffer);
29602960
}
29612961

29622962
/**
@@ -2965,24 +2965,24 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
29652965
*/
29662966
static void sd_read_block_provisioning(struct scsi_disk *sdkp)
29672967
{
2968-
unsigned char *buffer;
2969-
const int vpd_len = 8;
2968+
struct scsi_vpd *vpd;
29702969

29712970
if (sdkp->lbpme == 0)
29722971
return;
29732972

2974-
buffer = kmalloc(vpd_len, GFP_KERNEL);
2973+
rcu_read_lock();
2974+
vpd = rcu_dereference(sdkp->device->vpd_pgb2);
29752975

2976-
if (!buffer || scsi_get_vpd_page(sdkp->device, 0xb2, buffer, vpd_len))
2977-
goto out;
2976+
if (!vpd || vpd->len < 8) {
2977+
rcu_read_unlock();
2978+
return;
2979+
}
29782980

29792981
sdkp->lbpvpd = 1;
2980-
sdkp->lbpu = (buffer[5] >> 7) & 1; /* UNMAP */
2981-
sdkp->lbpws = (buffer[5] >> 6) & 1; /* WRITE SAME(16) with UNMAP */
2982-
sdkp->lbpws10 = (buffer[5] >> 5) & 1; /* WRITE SAME(10) with UNMAP */
2983-
2984-
out:
2985-
kfree(buffer);
2982+
sdkp->lbpu = (vpd->data[5] >> 7) & 1; /* UNMAP */
2983+
sdkp->lbpws = (vpd->data[5] >> 6) & 1; /* WRITE SAME(16) w/ UNMAP */
2984+
sdkp->lbpws10 = (vpd->data[5] >> 5) & 1; /* WRITE SAME(10) w/ UNMAP */
2985+
rcu_read_unlock();
29862986
}
29872987

29882988
static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer)

0 commit comments

Comments
 (0)