diff options
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 145 |
1 files changed, 106 insertions, 39 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 84044233b637..5616cd780ff3 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -384,9 +384,9 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
384 | struct scsi_device *sdp = q->queuedata; | 384 | struct scsi_device *sdp = q->queuedata; |
385 | struct gendisk *disk = rq->rq_disk; | 385 | struct gendisk *disk = rq->rq_disk; |
386 | struct scsi_disk *sdkp; | 386 | struct scsi_disk *sdkp; |
387 | sector_t block = rq->sector; | 387 | sector_t block = blk_rq_pos(rq); |
388 | sector_t threshold; | 388 | sector_t threshold; |
389 | unsigned int this_count = rq->nr_sectors; | 389 | unsigned int this_count = blk_rq_sectors(rq); |
390 | int ret, host_dif; | 390 | int ret, host_dif; |
391 | 391 | ||
392 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { | 392 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
@@ -413,10 +413,10 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
413 | this_count)); | 413 | this_count)); |
414 | 414 | ||
415 | if (!sdp || !scsi_device_online(sdp) || | 415 | if (!sdp || !scsi_device_online(sdp) || |
416 | block + rq->nr_sectors > get_capacity(disk)) { | 416 | block + blk_rq_sectors(rq) > get_capacity(disk)) { |
417 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, | 417 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, |
418 | "Finishing %ld sectors\n", | 418 | "Finishing %u sectors\n", |
419 | rq->nr_sectors)); | 419 | blk_rq_sectors(rq))); |
420 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, | 420 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, |
421 | "Retry with 0x%p\n", SCpnt)); | 421 | "Retry with 0x%p\n", SCpnt)); |
422 | goto out; | 422 | goto out; |
@@ -463,7 +463,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
463 | * for this. | 463 | * for this. |
464 | */ | 464 | */ |
465 | if (sdp->sector_size == 1024) { | 465 | if (sdp->sector_size == 1024) { |
466 | if ((block & 1) || (rq->nr_sectors & 1)) { | 466 | if ((block & 1) || (blk_rq_sectors(rq) & 1)) { |
467 | scmd_printk(KERN_ERR, SCpnt, | 467 | scmd_printk(KERN_ERR, SCpnt, |
468 | "Bad block number requested\n"); | 468 | "Bad block number requested\n"); |
469 | goto out; | 469 | goto out; |
@@ -473,7 +473,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
473 | } | 473 | } |
474 | } | 474 | } |
475 | if (sdp->sector_size == 2048) { | 475 | if (sdp->sector_size == 2048) { |
476 | if ((block & 3) || (rq->nr_sectors & 3)) { | 476 | if ((block & 3) || (blk_rq_sectors(rq) & 3)) { |
477 | scmd_printk(KERN_ERR, SCpnt, | 477 | scmd_printk(KERN_ERR, SCpnt, |
478 | "Bad block number requested\n"); | 478 | "Bad block number requested\n"); |
479 | goto out; | 479 | goto out; |
@@ -483,7 +483,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
483 | } | 483 | } |
484 | } | 484 | } |
485 | if (sdp->sector_size == 4096) { | 485 | if (sdp->sector_size == 4096) { |
486 | if ((block & 7) || (rq->nr_sectors & 7)) { | 486 | if ((block & 7) || (blk_rq_sectors(rq) & 7)) { |
487 | scmd_printk(KERN_ERR, SCpnt, | 487 | scmd_printk(KERN_ERR, SCpnt, |
488 | "Bad block number requested\n"); | 488 | "Bad block number requested\n"); |
489 | goto out; | 489 | goto out; |
@@ -512,10 +512,10 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
512 | } | 512 | } |
513 | 513 | ||
514 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, | 514 | SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt, |
515 | "%s %d/%ld 512 byte blocks.\n", | 515 | "%s %d/%u 512 byte blocks.\n", |
516 | (rq_data_dir(rq) == WRITE) ? | 516 | (rq_data_dir(rq) == WRITE) ? |
517 | "writing" : "reading", this_count, | 517 | "writing" : "reading", this_count, |
518 | rq->nr_sectors)); | 518 | blk_rq_sectors(rq))); |
519 | 519 | ||
520 | /* Set RDPROTECT/WRPROTECT if disk is formatted with DIF */ | 520 | /* Set RDPROTECT/WRPROTECT if disk is formatted with DIF */ |
521 | host_dif = scsi_host_dif_capable(sdp->host, sdkp->protection_type); | 521 | host_dif = scsi_host_dif_capable(sdp->host, sdkp->protection_type); |
@@ -971,8 +971,8 @@ static struct block_device_operations sd_fops = { | |||
971 | 971 | ||
972 | static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) | 972 | static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) |
973 | { | 973 | { |
974 | u64 start_lba = scmd->request->sector; | 974 | u64 start_lba = blk_rq_pos(scmd->request); |
975 | u64 end_lba = scmd->request->sector + (scsi_bufflen(scmd) / 512); | 975 | u64 end_lba = blk_rq_pos(scmd->request) + (scsi_bufflen(scmd) / 512); |
976 | u64 bad_lba; | 976 | u64 bad_lba; |
977 | int info_valid; | 977 | int info_valid; |
978 | 978 | ||
@@ -1307,6 +1307,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1307 | int sense_valid = 0; | 1307 | int sense_valid = 0; |
1308 | int the_result; | 1308 | int the_result; |
1309 | int retries = 3; | 1309 | int retries = 3; |
1310 | unsigned int alignment; | ||
1310 | unsigned long long lba; | 1311 | unsigned long long lba; |
1311 | unsigned sector_size; | 1312 | unsigned sector_size; |
1312 | 1313 | ||
@@ -1358,6 +1359,16 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1358 | return -EOVERFLOW; | 1359 | return -EOVERFLOW; |
1359 | } | 1360 | } |
1360 | 1361 | ||
1362 | /* Logical blocks per physical block exponent */ | ||
1363 | sdkp->hw_sector_size = (1 << (buffer[13] & 0xf)) * sector_size; | ||
1364 | |||
1365 | /* Lowest aligned logical block */ | ||
1366 | alignment = ((buffer[14] & 0x3f) << 8 | buffer[15]) * sector_size; | ||
1367 | blk_queue_alignment_offset(sdp->request_queue, alignment); | ||
1368 | if (alignment && sdkp->first_scan) | ||
1369 | sd_printk(KERN_NOTICE, sdkp, | ||
1370 | "physical block alignment offset: %u\n", alignment); | ||
1371 | |||
1361 | sdkp->capacity = lba + 1; | 1372 | sdkp->capacity = lba + 1; |
1362 | return sector_size; | 1373 | return sector_size; |
1363 | } | 1374 | } |
@@ -1409,6 +1420,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
1409 | } | 1420 | } |
1410 | 1421 | ||
1411 | sdkp->capacity = lba + 1; | 1422 | sdkp->capacity = lba + 1; |
1423 | sdkp->hw_sector_size = sector_size; | ||
1412 | return sector_size; | 1424 | return sector_size; |
1413 | } | 1425 | } |
1414 | 1426 | ||
@@ -1510,7 +1522,7 @@ got_data: | |||
1510 | */ | 1522 | */ |
1511 | sector_size = 512; | 1523 | sector_size = 512; |
1512 | } | 1524 | } |
1513 | blk_queue_hardsect_size(sdp->request_queue, sector_size); | 1525 | blk_queue_logical_block_size(sdp->request_queue, sector_size); |
1514 | 1526 | ||
1515 | { | 1527 | { |
1516 | char cap_str_2[10], cap_str_10[10]; | 1528 | char cap_str_2[10], cap_str_10[10]; |
@@ -1521,11 +1533,17 @@ got_data: | |||
1521 | string_get_size(sz, STRING_UNITS_10, cap_str_10, | 1533 | string_get_size(sz, STRING_UNITS_10, cap_str_10, |
1522 | sizeof(cap_str_10)); | 1534 | sizeof(cap_str_10)); |
1523 | 1535 | ||
1524 | if (sdkp->first_scan || old_capacity != sdkp->capacity) | 1536 | if (sdkp->first_scan || old_capacity != sdkp->capacity) { |
1525 | sd_printk(KERN_NOTICE, sdkp, | 1537 | sd_printk(KERN_NOTICE, sdkp, |
1526 | "%llu %d-byte hardware sectors: (%s/%s)\n", | 1538 | "%llu %d-byte logical blocks: (%s/%s)\n", |
1527 | (unsigned long long)sdkp->capacity, | 1539 | (unsigned long long)sdkp->capacity, |
1528 | sector_size, cap_str_10, cap_str_2); | 1540 | sector_size, cap_str_10, cap_str_2); |
1541 | |||
1542 | if (sdkp->hw_sector_size != sector_size) | ||
1543 | sd_printk(KERN_NOTICE, sdkp, | ||
1544 | "%u-byte physical blocks\n", | ||
1545 | sdkp->hw_sector_size); | ||
1546 | } | ||
1529 | } | 1547 | } |
1530 | 1548 | ||
1531 | /* Rescale capacity to 512-byte units */ | 1549 | /* Rescale capacity to 512-byte units */ |
@@ -1538,6 +1556,7 @@ got_data: | |||
1538 | else if (sector_size == 256) | 1556 | else if (sector_size == 256) |
1539 | sdkp->capacity >>= 1; | 1557 | sdkp->capacity >>= 1; |
1540 | 1558 | ||
1559 | blk_queue_physical_block_size(sdp->request_queue, sdkp->hw_sector_size); | ||
1541 | sdkp->device->sector_size = sector_size; | 1560 | sdkp->device->sector_size = sector_size; |
1542 | } | 1561 | } |
1543 | 1562 | ||
@@ -1776,6 +1795,52 @@ void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer) | |||
1776 | } | 1795 | } |
1777 | 1796 | ||
1778 | /** | 1797 | /** |
1798 | * sd_read_block_limits - Query disk device for preferred I/O sizes. | ||
1799 | * @disk: disk to query | ||
1800 | */ | ||
1801 | static void sd_read_block_limits(struct scsi_disk *sdkp) | ||
1802 | { | ||
1803 | unsigned int sector_sz = sdkp->device->sector_size; | ||
1804 | char *buffer; | ||
1805 | |||
1806 | /* Block Limits VPD */ | ||
1807 | buffer = scsi_get_vpd_page(sdkp->device, 0xb0); | ||
1808 | |||
1809 | if (buffer == NULL) | ||
1810 | return; | ||
1811 | |||
1812 | blk_queue_io_min(sdkp->disk->queue, | ||
1813 | get_unaligned_be16(&buffer[6]) * sector_sz); | ||
1814 | blk_queue_io_opt(sdkp->disk->queue, | ||
1815 | get_unaligned_be32(&buffer[12]) * sector_sz); | ||
1816 | |||
1817 | kfree(buffer); | ||
1818 | } | ||
1819 | |||
1820 | /** | ||
1821 | * sd_read_block_characteristics - Query block dev. characteristics | ||
1822 | * @disk: disk to query | ||
1823 | */ | ||
1824 | static void sd_read_block_characteristics(struct scsi_disk *sdkp) | ||
1825 | { | ||
1826 | char *buffer; | ||
1827 | u16 rot; | ||
1828 | |||
1829 | /* Block Device Characteristics VPD */ | ||
1830 | buffer = scsi_get_vpd_page(sdkp->device, 0xb1); | ||
1831 | |||
1832 | if (buffer == NULL) | ||
1833 | return; | ||
1834 | |||
1835 | rot = get_unaligned_be16(&buffer[4]); | ||
1836 | |||
1837 | if (rot == 1) | ||
1838 | queue_flag_set_unlocked(QUEUE_FLAG_NONROT, sdkp->disk->queue); | ||
1839 | |||
1840 | kfree(buffer); | ||
1841 | } | ||
1842 | |||
1843 | /** | ||
1779 | * sd_revalidate_disk - called the first time a new disk is seen, | 1844 | * sd_revalidate_disk - called the first time a new disk is seen, |
1780 | * performs disk spin up, read_capacity, etc. | 1845 | * performs disk spin up, read_capacity, etc. |
1781 | * @disk: struct gendisk we care about | 1846 | * @disk: struct gendisk we care about |
@@ -1812,6 +1877,8 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
1812 | */ | 1877 | */ |
1813 | if (sdkp->media_present) { | 1878 | if (sdkp->media_present) { |
1814 | sd_read_capacity(sdkp, buffer); | 1879 | sd_read_capacity(sdkp, buffer); |
1880 | sd_read_block_limits(sdkp); | ||
1881 | sd_read_block_characteristics(sdkp); | ||
1815 | sd_read_write_protect_flag(sdkp, buffer); | 1882 | sd_read_write_protect_flag(sdkp, buffer); |
1816 | sd_read_cache_type(sdkp, buffer); | 1883 | sd_read_cache_type(sdkp, buffer); |
1817 | sd_read_app_tag_own(sdkp, buffer); | 1884 | sd_read_app_tag_own(sdkp, buffer); |
@@ -1902,24 +1969,6 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
1902 | index = sdkp->index; | 1969 | index = sdkp->index; |
1903 | dev = &sdp->sdev_gendev; | 1970 | dev = &sdp->sdev_gendev; |
1904 | 1971 | ||
1905 | if (!sdp->request_queue->rq_timeout) { | ||
1906 | if (sdp->type != TYPE_MOD) | ||
1907 | blk_queue_rq_timeout(sdp->request_queue, SD_TIMEOUT); | ||
1908 | else | ||
1909 | blk_queue_rq_timeout(sdp->request_queue, | ||
1910 | SD_MOD_TIMEOUT); | ||
1911 | } | ||
1912 | |||
1913 | device_initialize(&sdkp->dev); | ||
1914 | sdkp->dev.parent = &sdp->sdev_gendev; | ||
1915 | sdkp->dev.class = &sd_disk_class; | ||
1916 | dev_set_name(&sdkp->dev, dev_name(&sdp->sdev_gendev)); | ||
1917 | |||
1918 | if (device_add(&sdkp->dev)) | ||
1919 | goto out_free_index; | ||
1920 | |||
1921 | get_device(&sdp->sdev_gendev); | ||
1922 | |||
1923 | if (index < SD_MAX_DISKS) { | 1972 | if (index < SD_MAX_DISKS) { |
1924 | gd->major = sd_major((index & 0xf0) >> 4); | 1973 | gd->major = sd_major((index & 0xf0) >> 4); |
1925 | gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); | 1974 | gd->first_minor = ((index & 0xf) << 4) | (index & 0xfff00); |
@@ -1952,13 +2001,10 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
1952 | add_disk(gd); | 2001 | add_disk(gd); |
1953 | sd_dif_config_host(sdkp); | 2002 | sd_dif_config_host(sdkp); |
1954 | 2003 | ||
2004 | sd_revalidate_disk(gd); | ||
2005 | |||
1955 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", | 2006 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", |
1956 | sdp->removable ? "removable " : ""); | 2007 | sdp->removable ? "removable " : ""); |
1957 | |||
1958 | return; | ||
1959 | |||
1960 | out_free_index: | ||
1961 | ida_remove(&sd_index_ida, index); | ||
1962 | } | 2008 | } |
1963 | 2009 | ||
1964 | /** | 2010 | /** |
@@ -2026,6 +2072,24 @@ static int sd_probe(struct device *dev) | |||
2026 | sdkp->openers = 0; | 2072 | sdkp->openers = 0; |
2027 | sdkp->previous_state = 1; | 2073 | sdkp->previous_state = 1; |
2028 | 2074 | ||
2075 | if (!sdp->request_queue->rq_timeout) { | ||
2076 | if (sdp->type != TYPE_MOD) | ||
2077 | blk_queue_rq_timeout(sdp->request_queue, SD_TIMEOUT); | ||
2078 | else | ||
2079 | blk_queue_rq_timeout(sdp->request_queue, | ||
2080 | SD_MOD_TIMEOUT); | ||
2081 | } | ||
2082 | |||
2083 | device_initialize(&sdkp->dev); | ||
2084 | sdkp->dev.parent = &sdp->sdev_gendev; | ||
2085 | sdkp->dev.class = &sd_disk_class; | ||
2086 | dev_set_name(&sdkp->dev, dev_name(&sdp->sdev_gendev)); | ||
2087 | |||
2088 | if (device_add(&sdkp->dev)) | ||
2089 | goto out_free_index; | ||
2090 | |||
2091 | get_device(&sdp->sdev_gendev); | ||
2092 | |||
2029 | async_schedule(sd_probe_async, sdkp); | 2093 | async_schedule(sd_probe_async, sdkp); |
2030 | 2094 | ||
2031 | return 0; | 2095 | return 0; |
@@ -2055,8 +2119,11 @@ static int sd_probe(struct device *dev) | |||
2055 | **/ | 2119 | **/ |
2056 | static int sd_remove(struct device *dev) | 2120 | static int sd_remove(struct device *dev) |
2057 | { | 2121 | { |
2058 | struct scsi_disk *sdkp = dev_get_drvdata(dev); | 2122 | struct scsi_disk *sdkp; |
2059 | 2123 | ||
2124 | async_synchronize_full(); | ||
2125 | sdkp = dev_get_drvdata(dev); | ||
2126 | blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn); | ||
2060 | device_del(&sdkp->dev); | 2127 | device_del(&sdkp->dev); |
2061 | del_gendisk(sdkp->disk); | 2128 | del_gendisk(sdkp->disk); |
2062 | sd_shutdown(dev); | 2129 | sd_shutdown(dev); |