diff options
author | Mike Snitzer <snitzer@redhat.com> | 2011-04-01 15:02:31 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-04-05 17:52:43 -0400 |
commit | a63a5cf84dac7a23a57c800eea5734701e7d3c04 (patch) | |
tree | 965552b96d7eacc21206a4f28672efd24a04d913 /include/linux | |
parent | 7dcda1c96d7c643101d4a05579ef4512a4baa7ef (diff) |
dm: improve block integrity support
The current block integrity (DIF/DIX) support in DM is verifying that
all devices' integrity profiles match during DM device resume (which
is past the point of no return). To some degree that is unavoidable
(stacked DM devices force this late checking). But for most DM
devices (which aren't stacking on other DM devices) the ideal time to
verify all integrity profiles match is during table load.
Introduce the notion of an "initialized" integrity profile: a profile
that was blk_integrity_register()'d with a non-NULL 'blk_integrity'
template. Add blk_integrity_is_initialized() to allow checking if a
profile was initialized.
Update DM integrity support to:
- check all devices with _initialized_ integrity profiles match
during table load; uninitialized profiles (e.g. for underlying DM
device(s) of a stacked DM device) are ignored.
- disallow a table load that would result in an integrity profile that
conflicts with a DM device's existing (in-use) integrity profile
- avoid clearing an existing integrity profile
- validate all integrity profiles match during resume; but if they
don't all we can do is report the mismatch (during resume we're past
the point of no return)
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/blkdev.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 16a902f099ac..32176cc8e715 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -1206,6 +1206,7 @@ struct blk_integrity { | |||
1206 | struct kobject kobj; | 1206 | struct kobject kobj; |
1207 | }; | 1207 | }; |
1208 | 1208 | ||
1209 | extern bool blk_integrity_is_initialized(struct gendisk *); | ||
1209 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); | 1210 | extern int blk_integrity_register(struct gendisk *, struct blk_integrity *); |
1210 | extern void blk_integrity_unregister(struct gendisk *); | 1211 | extern void blk_integrity_unregister(struct gendisk *); |
1211 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); | 1212 | extern int blk_integrity_compare(struct gendisk *, struct gendisk *); |
@@ -1262,6 +1263,7 @@ queue_max_integrity_segments(struct request_queue *q) | |||
1262 | #define queue_max_integrity_segments(a) (0) | 1263 | #define queue_max_integrity_segments(a) (0) |
1263 | #define blk_integrity_merge_rq(a, b, c) (0) | 1264 | #define blk_integrity_merge_rq(a, b, c) (0) |
1264 | #define blk_integrity_merge_bio(a, b, c) (0) | 1265 | #define blk_integrity_merge_bio(a, b, c) (0) |
1266 | #define blk_integrity_is_initialized(a) (0) | ||
1265 | 1267 | ||
1266 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ | 1268 | #endif /* CONFIG_BLK_DEV_INTEGRITY */ |
1267 | 1269 | ||