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: Tejun Heo <tj@kernel.org> Cc: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
Родитель
ed4e2f801c
Коммит
72ec24bd77
|
@ -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 = {
|
||||||
#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)
|
||||||
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 {
|
||||||
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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче