aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2014-09-26 19:20:03 -0400
committerJens Axboe <axboe@fb.com>2014-09-27 11:14:51 -0400
commit3aec2f41a8baeb70aa77556a4e4dcec7d9d70b4d (patch)
tree2725a81cae556798bd3f363c4e8e5595c1ce1aaf
parent8288f496eb1b1905c425e92eaf1abbb29119217b (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-block8
-rw-r--r--block/blk-integrity.c12
-rw-r--r--drivers/scsi/sd_dif.c8
-rw-r--r--include/linux/blkdev.h1
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
56What: /sys/block/<disk>/integrity/device_is_integrity_capable
57Date: July 2014
58Contact: Martin K. Petersen <martin.petersen@oracle.com>
59Description:
60 Indicates whether a storage device is capable of storing
61 integrity metadata. Set if the device is T10 PI-capable.
62
63
56What: /sys/block/<disk>/integrity/write_generate 64What: /sys/block/<disk>/integrity/write_generate
57Date: June 2008 65Date: June 2008
58Contact: Martin K. Petersen <martin.petersen@oracle.com> 66Contact: 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
310static 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
310static struct integrity_sysfs_entry integrity_format_entry = { 316static 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
338static struct integrity_sysfs_entry integrity_device_entry = {
339 .attr = { .name = "device_is_integrity_capable", .mode = S_IRUGO },
340 .show = integrity_device_show,
341};
342
332static struct attribute *integrity_attrs[] = { 343static 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)
1461enum blk_integrity_flags { 1461enum 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
1466struct blk_integrity_iter { 1467struct blk_integrity_iter {