@@ -3201,6 +3201,25 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
3201
3201
return ;
3202
3202
}
3203
3203
3204
+ static unsigned int sd_discard_mode (struct scsi_disk * sdkp )
3205
+ {
3206
+ if (!sdkp -> lbpvpd ) {
3207
+ /* LBP VPD page not provided */
3208
+ if (sdkp -> max_unmap_blocks )
3209
+ return SD_LBP_UNMAP ;
3210
+ return SD_LBP_WS16 ;
3211
+ }
3212
+
3213
+ /* LBP VPD page tells us what to use */
3214
+ if (sdkp -> lbpu && sdkp -> max_unmap_blocks )
3215
+ return SD_LBP_UNMAP ;
3216
+ if (sdkp -> lbpws )
3217
+ return SD_LBP_WS16 ;
3218
+ if (sdkp -> lbpws10 )
3219
+ return SD_LBP_WS10 ;
3220
+ return SD_LBP_DISABLE ;
3221
+ }
3222
+
3204
3223
/**
3205
3224
* sd_read_block_limits - Query disk device for preferred I/O sizes.
3206
3225
* @sdkp: disk to query
@@ -3239,23 +3258,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
3239
3258
sdkp -> unmap_alignment =
3240
3259
get_unaligned_be32 (& vpd -> data [32 ]) & ~(1 << 31 );
3241
3260
3242
- if (!sdkp -> lbpvpd ) { /* LBP VPD page not provided */
3243
-
3244
- if (sdkp -> max_unmap_blocks )
3245
- sd_config_discard (sdkp , SD_LBP_UNMAP );
3246
- else
3247
- sd_config_discard (sdkp , SD_LBP_WS16 );
3248
-
3249
- } else { /* LBP VPD page tells us what to use */
3250
- if (sdkp -> lbpu && sdkp -> max_unmap_blocks )
3251
- sd_config_discard (sdkp , SD_LBP_UNMAP );
3252
- else if (sdkp -> lbpws )
3253
- sd_config_discard (sdkp , SD_LBP_WS16 );
3254
- else if (sdkp -> lbpws10 )
3255
- sd_config_discard (sdkp , SD_LBP_WS10 );
3256
- else
3257
- sd_config_discard (sdkp , SD_LBP_DISABLE );
3258
- }
3261
+ sd_config_discard (sdkp , sd_discard_mode (sdkp ));
3259
3262
}
3260
3263
3261
3264
out :
0 commit comments