@@ -2844,39 +2844,39 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
28442844static 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)
29082908static 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 */
29662966static 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
29882988static void sd_read_write_same (struct scsi_disk * sdkp , unsigned char * buffer )
0 commit comments