aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r--drivers/scsi/sd.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 6ee50742f6a5..8750c86f95f9 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1398,11 +1398,15 @@ static int media_not_present(struct scsi_disk *sdkp,
1398 **/ 1398 **/
1399static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) 1399static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
1400{ 1400{
1401 struct scsi_disk *sdkp = scsi_disk(disk); 1401 struct scsi_disk *sdkp = scsi_disk_get(disk);
1402 struct scsi_device *sdp = sdkp->device; 1402 struct scsi_device *sdp;
1403 struct scsi_sense_hdr *sshdr = NULL; 1403 struct scsi_sense_hdr *sshdr = NULL;
1404 int retval; 1404 int retval;
1405 1405
1406 if (!sdkp)
1407 return 0;
1408
1409 sdp = sdkp->device;
1406 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n")); 1410 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n"));
1407 1411
1408 /* 1412 /*
@@ -1459,6 +1463,7 @@ out:
1459 kfree(sshdr); 1463 kfree(sshdr);
1460 retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0; 1464 retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0;
1461 sdp->changed = 0; 1465 sdp->changed = 0;
1466 scsi_disk_put(sdkp);
1462 return retval; 1467 return retval;
1463} 1468}
1464 1469
@@ -2046,6 +2051,22 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
2046 2051
2047#define READ_CAPACITY_RETRIES_ON_RESET 10 2052#define READ_CAPACITY_RETRIES_ON_RESET 10
2048 2053
2054/*
2055 * Ensure that we don't overflow sector_t when CONFIG_LBDAF is not set
2056 * and the reported logical block size is bigger than 512 bytes. Note
2057 * that last_sector is a u64 and therefore logical_to_sectors() is not
2058 * applicable.
2059 */
2060static bool sd_addressable_capacity(u64 lba, unsigned int sector_size)
2061{
2062 u64 last_sector = (lba + 1ULL) << (ilog2(sector_size) - 9);
2063
2064 if (sizeof(sector_t) == 4 && last_sector > U32_MAX)
2065 return false;
2066
2067 return true;
2068}
2069
2049static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, 2070static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
2050 unsigned char *buffer) 2071 unsigned char *buffer)
2051{ 2072{
@@ -2111,7 +2132,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
2111 return -ENODEV; 2132 return -ENODEV;
2112 } 2133 }
2113 2134
2114 if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) { 2135 if (!sd_addressable_capacity(lba, sector_size)) {
2115 sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " 2136 sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
2116 "kernel compiled with support for large block " 2137 "kernel compiled with support for large block "
2117 "devices.\n"); 2138 "devices.\n");
@@ -2197,7 +2218,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
2197 return sector_size; 2218 return sector_size;
2198 } 2219 }
2199 2220
2200 if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { 2221 if (!sd_addressable_capacity(lba, sector_size)) {
2201 sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " 2222 sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
2202 "kernel compiled with support for large block " 2223 "kernel compiled with support for large block "
2203 "devices.\n"); 2224 "devices.\n");
@@ -2545,7 +2566,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
2545 if (sdp->broken_fua) { 2566 if (sdp->broken_fua) {
2546 sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n"); 2567 sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n");
2547 sdkp->DPOFUA = 0; 2568 sdkp->DPOFUA = 0;
2548 } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { 2569 } else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw &&
2570 !sdkp->device->use_16_for_rw) {
2549 sd_first_printk(KERN_NOTICE, sdkp, 2571 sd_first_printk(KERN_NOTICE, sdkp,
2550 "Uses READ/WRITE(6), disabling FUA\n"); 2572 "Uses READ/WRITE(6), disabling FUA\n");
2551 sdkp->DPOFUA = 0; 2573 sdkp->DPOFUA = 0;
@@ -2883,7 +2905,8 @@ static int sd_revalidate_disk(struct gendisk *disk)
2883 q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); 2905 q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
2884 rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); 2906 rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
2885 } else 2907 } else
2886 rw_max = BLK_DEF_MAX_SECTORS; 2908 rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
2909 (sector_t)BLK_DEF_MAX_SECTORS);
2887 2910
2888 /* Combine with controller limits */ 2911 /* Combine with controller limits */
2889 q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); 2912 q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q));