Commit 72ec24bd authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

SCSI: implement sd_unlock_native_capacity()

Implement sd_unlock_native_capacity() method which calls into
hostt->unlock_native_capacity() if implemented.  This will be invoked
by block layer if partitions extend beyond the end of the device and
can be used to implement, for example, on-demand ATA host protected
area unlocking.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent ed4e2f80
...@@ -97,6 +97,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC); ...@@ -97,6 +97,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC);
#endif #endif
static int sd_revalidate_disk(struct gendisk *); static int sd_revalidate_disk(struct gendisk *);
static void sd_unlock_native_capacity(struct gendisk *disk);
static int sd_probe(struct device *); static int sd_probe(struct device *);
static int sd_remove(struct device *); static int sd_remove(struct device *);
static void sd_shutdown(struct device *); static void sd_shutdown(struct device *);
...@@ -1101,6 +1102,7 @@ static const struct block_device_operations sd_fops = { ...@@ -1101,6 +1102,7 @@ static const struct block_device_operations sd_fops = {
#endif #endif
.media_changed = sd_media_changed, .media_changed = sd_media_changed,
.revalidate_disk = sd_revalidate_disk, .revalidate_disk = sd_revalidate_disk,
.unlock_native_capacity = sd_unlock_native_capacity,
}; };
static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
...@@ -2120,6 +2122,26 @@ static int sd_revalidate_disk(struct gendisk *disk) ...@@ -2120,6 +2122,26 @@ static int sd_revalidate_disk(struct gendisk *disk)
return 0; return 0;
} }
/**
* sd_unlock_native_capacity - unlock native capacity
* @disk: struct gendisk to set capacity for
*
* Block layer calls this function if it detects that partitions
* on @disk reach beyond the end of the device. If the SCSI host
* implements ->unlock_native_capacity() method, it's invoked to
* give it a chance to adjust the device capacity.
*
* CONTEXT:
* Defined by block layer. Might sleep.
*/
static void sd_unlock_native_capacity(struct gendisk *disk)
{
struct scsi_device *sdev = scsi_disk(disk)->device;
if (sdev->host->hostt->unlock_native_capacity)
sdev->host->hostt->unlock_native_capacity(sdev);
}
/** /**
* sd_format_disk_name - format disk name * sd_format_disk_name - format disk name
* @prefix: name prefix - ie. "sd" for SCSI disks * @prefix: name prefix - ie. "sd" for SCSI disks
......
...@@ -326,6 +326,14 @@ struct scsi_host_template { ...@@ -326,6 +326,14 @@ struct scsi_host_template {
int (* bios_param)(struct scsi_device *, struct block_device *, int (* bios_param)(struct scsi_device *, struct block_device *,
sector_t, int []); sector_t, int []);
/*
* This function is called when one or more partitions on the
* device reach beyond the end of the device.
*
* Status: OPTIONAL
*/
void (*unlock_native_capacity)(struct scsi_device *);
/* /*
* Can be used to export driver statistics and other infos to the * Can be used to export driver statistics and other infos to the
* world outside the kernel ie. userspace and it also provides an * world outside the kernel ie. userspace and it also provides an
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment