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 { |