2010-06-02 17:50:53

by Jeff Garzik

[permalink] [raw]
Subject: Re: [PATCH 6/8] SCSI: implement sd_unlock_native_capacity()

On 05/15/2010 02:09 PM, Tejun Heo wrote:
> 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: Tejun Heo<[email protected]>
> Cc: Ben Hutchings<[email protected]>
> ---
> drivers/scsi/sd.c | 22 ++++++++++++++++++++++
> include/scsi/scsi_host.h | 8 ++++++++
> 2 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 8b827f3..b85906e 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -97,6 +97,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC);
> #endif
>
> 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_remove(struct device *);
> static void sd_shutdown(struct device *);
> @@ -1100,6 +1101,7 @@ static const struct block_device_operations sd_fops = {
> #endif
> .media_changed = sd_media_changed,
> .revalidate_disk = sd_revalidate_disk,
> + .unlock_native_capacity = sd_unlock_native_capacity,
> };
>
> static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
> @@ -2101,6 +2103,26 @@ static int sd_revalidate_disk(struct gendisk *disk)
> }
>
> /**
> + * 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
> * @prefix: name prefix - ie. "sd" for SCSI disks
> * @index: index of the disk to format name for
> diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
> index c50a97f..b7bdecb 100644
> --- a/include/scsi/scsi_host.h
> +++ b/include/scsi/scsi_host.h
> @@ -327,6 +327,14 @@ struct scsi_host_template {
> 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 *);
> +
> + /*

applied 6-8, including this SCSI patch