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.
Unified · Split
| @@ -53,6 +53,14 @@ Description: · 52 unmodified lines | ||
| 53 | 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 | 64 | What: /sys/block/<disk>/integrity/write_generate |
| 57 | 65 | Date: June 2008 |
| 58 | 66 | Contact: Martin K. Petersen <martin.petersen@oracle.com> |
| @@ -307,6 +307,12 @@ static ssize_t integrity_generate_show(struct blk_integrity *bi, char *page) · 306 unmodified lines | ||
| 307 | 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 | 316 | static struct integrity_sysfs_entry integrity_format_entry = { |
| 311 | 317 | .attr = { .name = "format", .mode = S_IRUGO }, |
| 312 | 318 | .show = integrity_format_show, |
| @@ -329,11 +335,17 @@ static struct integrity_sysfs_entry integrity_generate_entry = { · 16 unmodified lines | ||
| 329 | 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 | 343 | static struct attribute *integrity_attrs[] = { |
| 333 | 344 | &integrity_format_entry.attr, |
| 334 | 345 | &integrity_tag_size_entry.attr, |
| 335 | 346 | &integrity_verify_entry.attr, |
| 336 | 347 | &integrity_generate_entry.attr, |
| 348 | + &integrity_device_entry.attr, | |
| 337 | 349 | NULL, |
| 338 | 350 | }; |
| 339 | 351 | |
| @@ -270,7 +270,13 @@ void sd_dif_config_host(struct scsi_disk *sdkp) · 269 unmodified lines | ||
| 270 | 270 | "Enabling DIX %s protection\n", disk->integrity->name); |
| 271 | 271 | |
| 272 | 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 | 280 | if (type == SD_DIF_TYPE3_PROTECTION) |
| 275 | 281 | disk->integrity->tag_size = sizeof(u16) + sizeof(u32); |
| 276 | 282 | else |
| @@ -1461,6 +1461,7 @@ static inline uint64_t rq_io_start_time_ns(struct request *req) · 1460 unmodified lines | ||
| 1461 | 1461 | enum blk_integrity_flags { |
| 1462 | 1462 | BLK_INTEGRITY_VERIFY = 1 << 0, |
| 1463 | 1463 | BLK_INTEGRITY_GENERATE = 1 << 1, |
| 1464 | + BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2, | |
| 1464 | 1465 | }; |
| 1465 | 1466 | |
| 1466 | 1467 | struct blk_integrity_iter { |