diff options
| author | Martin K. Petersen <martin.petersen@oracle.com> | 2014-09-26 19:20:03 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@fb.com> | 2014-09-27 11:14:51 -0400 |
| commit | 3aec2f41a8baeb70aa77556a4e4dcec7d9d70b4d (patch) | |
| tree | 2725a81cae556798bd3f363c4e8e5595c1ce1aaf | |
| parent | 8288f496eb1b1905c425e92eaf1abbb29119217b (diff) | |
block: Add a disk flag to block integrity profile
So far we have relied on the app tag size to determine whether a disk
has been formatted with T10 protection information or not. However, not
all target devices provide application tag storage.
Add a flag to the block integrity profile that indicates whether the
disk has been formatted with protection information.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Sagi Grimberg <sagig@dev.mellanox.co.il>
Signed-off-by: Jens Axboe <axboe@fb.com>
| -rw-r--r-- | Documentation/ABI/testing/sysfs-block | 8 | ||||
| -rw-r--r-- | block/blk-integrity.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/sd_dif.c | 8 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 1 |
4 files changed, 28 insertions, 1 deletions
diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block index 279da08f7541..8df003963d99 100644 --- a/Documentation/ABI/testing/sysfs-block +++ b/Documentation/ABI/testing/sysfs-block | |||
| @@ -53,6 +53,14 @@ Description: | |||
| 53 | 512 bytes of data. | 53 | 512 bytes of data. |
| 54 | 54 | ||
| 55 | 55 | ||
| 56 | What: /sys/block/<disk>/integrity/device_is_integrity_capable | ||
| 57 | Date: July 2014 | ||
| 58 | Contact: Martin K. Petersen <martin.petersen@oracle.com> | ||
| 59 | Description: | ||
| 60 | Indicates whether a storage device is capable of storing | ||
| 61 | integrity metadata. Set if the device is T10 PI-capable. | ||
| 62 | |||
| 63 | |||
| 56 | What: /sys/block/<disk>/integrity/write_generate | 64 | What: /sys/block/<disk>/integrity/write_generate |
| 57 | Date: June 2008 | 65 | Date: June 2008 |
| 58 | Contact: Martin K. Petersen <martin.petersen@oracle.com> | 66 | Contact: Martin K. Petersen <martin.petersen@oracle.com> |
diff --git a/block/blk-integrity.c b/block/blk-integrity.c index a7436ccc936b..1c6ba442cd91 100644 --- a/block/blk-integrity.c +++ b/block/blk-integrity.c | |||
| @@ -307,6 +307,12 @@ static ssize_t integrity_generate_show(struct blk_integrity *bi, char *page) | |||
| 307 | return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_GENERATE) != 0); | 307 | return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_GENERATE) != 0); |
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | static ssize_t integrity_device_show(struct blk_integrity *bi, char *page) | ||
| 311 | { | ||
| 312 | return sprintf(page, "%u\n", | ||
| 313 | (bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE) != 0); | ||
| 314 | } | ||
| 315 | |||
| 310 | static struct integrity_sysfs_entry integrity_format_entry = { | 316 | static struct integrity_sysfs_entry integrity_format_entry = { |
| 311 | .attr = { .name = "format", .mode = S_IRUGO }, | 317 | .attr = { .name = "format", .mode = S_IRUGO }, |
| 312 | .show = integrity_format_show, | 318 | .show = integrity_format_show, |
| @@ -329,11 +335,17 @@ static struct integrity_sysfs_entry integrity_generate_entry = { | |||
| 329 | .store = integrity_generate_store, | 335 | .store = integrity_generate_store, |
| 330 | }; | 336 | }; |
| 331 | 337 | ||
| 338 | static struct integrity_sysfs_entry integrity_device_entry = { | ||
| 339 | .attr = { .name = "device_is_integrity_capable", .mode = S_IRUGO }, | ||
| 340 | .show = integrity_device_show, | ||
| 341 | }; | ||
| 342 | |||
| 332 | static struct attribute *integrity_attrs[] = { | 343 | static struct attribute *integrity_attrs[] = { |
| 333 | &integrity_format_entry.attr, | 344 | &integrity_format_entry.attr, |
| 334 | &integrity_tag_size_entry.attr, | 345 | &integrity_tag_size_entry.attr, |
| 335 | &integrity_verify_entry.attr, | 346 | &integrity_verify_entry.attr, |
| 336 | &integrity_generate_entry.attr, | 347 | &integrity_generate_entry.attr, |
| 348 | &integrity_device_entry.attr, | ||
| 337 | NULL, | 349 | NULL, |
| 338 | }; | 350 | }; |
| 339 | 351 | ||
diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 801c41851a01..1e971c6f8c2b 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c | |||
| @@ -270,7 +270,13 @@ void sd_dif_config_host(struct scsi_disk *sdkp) | |||
| 270 | "Enabling DIX %s protection\n", disk->integrity->name); | 270 | "Enabling DIX %s protection\n", disk->integrity->name); |
| 271 | 271 | ||
| 272 | /* Signal to block layer that we support sector tagging */ | 272 | /* Signal to block layer that we support sector tagging */ |
| 273 | if (dif && type && sdkp->ATO) { | 273 | if (dif && type) { |
| 274 | |||
| 275 | disk->integrity->flags |= BLK_INTEGRITY_DEVICE_CAPABLE; | ||
| 276 | |||
| 277 | if (!sdkp) | ||
| 278 | return; | ||
| 279 | |||
| 274 | if (type == SD_DIF_TYPE3_PROTECTION) | 280 | if (type == SD_DIF_TYPE3_PROTECTION) |
| 275 | disk->integrity->tag_size = sizeof(u16) + sizeof(u32); | 281 | disk->integrity->tag_size = sizeof(u16) + sizeof(u32); |
| 276 | else | 282 | else |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index cf92eb031ae9..4600fc63e3fc 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -1461,6 +1461,7 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) | |||
| 1461 | enum blk_integrity_flags { | 1461 | enum blk_integrity_flags { |
| 1462 | BLK_INTEGRITY_VERIFY = 1 << 0, | 1462 | BLK_INTEGRITY_VERIFY = 1 << 0, |
| 1463 | BLK_INTEGRITY_GENERATE = 1 << 1, | 1463 | BLK_INTEGRITY_GENERATE = 1 << 1, |
| 1464 | BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2, | ||
| 1464 | }; | 1465 | }; |
| 1465 | 1466 | ||
| 1466 | struct blk_integrity_iter { | 1467 | struct blk_integrity_iter { |
