diff options
| -rw-r--r-- | drivers/ata/libata-core.c | 1 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 29 | ||||
| -rw-r--r-- | include/linux/libata.h | 2 |
3 files changed, 32 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1e5d0a36a0a4..ddf8e4862787 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -6668,6 +6668,7 @@ EXPORT_SYMBOL_GPL(ata_dummy_port_info); | |||
| 6668 | EXPORT_SYMBOL_GPL(ata_link_next); | 6668 | EXPORT_SYMBOL_GPL(ata_link_next); |
| 6669 | EXPORT_SYMBOL_GPL(ata_dev_next); | 6669 | EXPORT_SYMBOL_GPL(ata_dev_next); |
| 6670 | EXPORT_SYMBOL_GPL(ata_std_bios_param); | 6670 | EXPORT_SYMBOL_GPL(ata_std_bios_param); |
| 6671 | EXPORT_SYMBOL_GPL(ata_scsi_unlock_native_capacity); | ||
| 6671 | EXPORT_SYMBOL_GPL(ata_host_init); | 6672 | EXPORT_SYMBOL_GPL(ata_host_init); |
| 6672 | EXPORT_SYMBOL_GPL(ata_host_alloc); | 6673 | EXPORT_SYMBOL_GPL(ata_host_alloc); |
| 6673 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); | 6674 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index cfa9dd3d7253..a54273d2c3c6 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -415,6 +415,35 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev, | |||
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | /** | 417 | /** |
| 418 | * ata_scsi_unlock_native_capacity - unlock native capacity | ||
| 419 | * @sdev: SCSI device to adjust device capacity for | ||
| 420 | * | ||
| 421 | * This function is called if a partition on @sdev extends beyond | ||
| 422 | * the end of the device. It requests EH to unlock HPA. | ||
| 423 | * | ||
| 424 | * LOCKING: | ||
| 425 | * Defined by the SCSI layer. Might sleep. | ||
| 426 | */ | ||
| 427 | void ata_scsi_unlock_native_capacity(struct scsi_device *sdev) | ||
| 428 | { | ||
| 429 | struct ata_port *ap = ata_shost_to_port(sdev->host); | ||
| 430 | struct ata_device *dev; | ||
| 431 | unsigned long flags; | ||
| 432 | |||
| 433 | spin_lock_irqsave(ap->lock, flags); | ||
| 434 | |||
| 435 | dev = ata_scsi_find_dev(ap, sdev); | ||
| 436 | if (dev && dev->n_sectors < dev->n_native_sectors) { | ||
| 437 | dev->flags |= ATA_DFLAG_UNLOCK_HPA; | ||
| 438 | dev->link->eh_info.action |= ATA_EH_RESET; | ||
| 439 | ata_port_schedule_eh(ap); | ||
| 440 | } | ||
| 441 | |||
| 442 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 443 | ata_port_wait_eh(ap); | ||
| 444 | } | ||
| 445 | |||
| 446 | /** | ||
| 418 | * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl | 447 | * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl |
| 419 | * @ap: target port | 448 | * @ap: target port |
| 420 | * @sdev: SCSI device to get identify data for | 449 | * @sdev: SCSI device to get identify data for |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 3bad2701bfa6..b85f3ff34d7d 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -1023,6 +1023,7 @@ extern void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd, | |||
| 1023 | extern int ata_std_bios_param(struct scsi_device *sdev, | 1023 | extern int ata_std_bios_param(struct scsi_device *sdev, |
| 1024 | struct block_device *bdev, | 1024 | struct block_device *bdev, |
| 1025 | sector_t capacity, int geom[]); | 1025 | sector_t capacity, int geom[]); |
| 1026 | extern void ata_scsi_unlock_native_capacity(struct scsi_device *sdev); | ||
| 1026 | extern int ata_scsi_slave_config(struct scsi_device *sdev); | 1027 | extern int ata_scsi_slave_config(struct scsi_device *sdev); |
| 1027 | extern void ata_scsi_slave_destroy(struct scsi_device *sdev); | 1028 | extern void ata_scsi_slave_destroy(struct scsi_device *sdev); |
| 1028 | extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, | 1029 | extern int ata_scsi_change_queue_depth(struct scsi_device *sdev, |
| @@ -1174,6 +1175,7 @@ extern struct device_attribute *ata_common_sdev_attrs[]; | |||
| 1174 | .slave_configure = ata_scsi_slave_config, \ | 1175 | .slave_configure = ata_scsi_slave_config, \ |
| 1175 | .slave_destroy = ata_scsi_slave_destroy, \ | 1176 | .slave_destroy = ata_scsi_slave_destroy, \ |
| 1176 | .bios_param = ata_std_bios_param, \ | 1177 | .bios_param = ata_std_bios_param, \ |
| 1178 | .unlock_native_capacity = ata_scsi_unlock_native_capacity, \ | ||
| 1177 | .sdev_attrs = ata_common_sdev_attrs | 1179 | .sdev_attrs = ata_common_sdev_attrs |
| 1178 | 1180 | ||
| 1179 | #define ATA_NCQ_SHT(drv_name) \ | 1181 | #define ATA_NCQ_SHT(drv_name) \ |
