diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 35 |
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 | **/ |
1399 | static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) | 1399 | static 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 | */ | ||
2060 | static 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 | |||
2049 | static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | 2070 | static 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)); |