diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2018-07-03 14:13:31 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2018-07-27 15:24:25 -0400 |
commit | 1f9fc0b826119f8d76d33c3bf60b7426be6dc19e (patch) | |
tree | c7cee1a43a24f8dfb06f24ed3c5b6e4d45f6b1e4 | |
parent | 356d9d52e1221ba0c9f10b8b38652f78a5298329 (diff) |
dm integrity: use version 2 for separate metadata
Use version "2" in the superblock when data and metadata devices are
separate, so that the device is not accidentally read by older kernel
version.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r-- | drivers/md/dm-integrity.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index fb5c8ef5b519..1097d8c25577 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c | |||
@@ -44,7 +44,8 @@ | |||
44 | */ | 44 | */ |
45 | 45 | ||
46 | #define SB_MAGIC "integrt" | 46 | #define SB_MAGIC "integrt" |
47 | #define SB_VERSION 1 | 47 | #define SB_VERSION_1 1 |
48 | #define SB_VERSION_2 2 | ||
48 | #define SB_SECTORS 8 | 49 | #define SB_SECTORS 8 |
49 | #define MAX_SECTORS_PER_BLOCK 8 | 50 | #define MAX_SECTORS_PER_BLOCK 8 |
50 | 51 | ||
@@ -414,6 +415,14 @@ static void wraparound_section(struct dm_integrity_c *ic, unsigned *sec_ptr) | |||
414 | *sec_ptr -= ic->journal_sections; | 415 | *sec_ptr -= ic->journal_sections; |
415 | } | 416 | } |
416 | 417 | ||
418 | static void sb_set_version(struct dm_integrity_c *ic) | ||
419 | { | ||
420 | if (ic->meta_dev) | ||
421 | ic->sb->version = SB_VERSION_2; | ||
422 | else | ||
423 | ic->sb->version = SB_VERSION_1; | ||
424 | } | ||
425 | |||
417 | static int sync_rw_sb(struct dm_integrity_c *ic, int op, int op_flags) | 426 | static int sync_rw_sb(struct dm_integrity_c *ic, int op, int op_flags) |
418 | { | 427 | { |
419 | struct dm_io_request io_req; | 428 | struct dm_io_request io_req; |
@@ -2432,7 +2441,6 @@ static int initialize_superblock(struct dm_integrity_c *ic, unsigned journal_sec | |||
2432 | 2441 | ||
2433 | memset(ic->sb, 0, SB_SECTORS << SECTOR_SHIFT); | 2442 | memset(ic->sb, 0, SB_SECTORS << SECTOR_SHIFT); |
2434 | memcpy(ic->sb->magic, SB_MAGIC, 8); | 2443 | memcpy(ic->sb->magic, SB_MAGIC, 8); |
2435 | ic->sb->version = SB_VERSION; | ||
2436 | ic->sb->integrity_tag_size = cpu_to_le16(ic->tag_size); | 2444 | ic->sb->integrity_tag_size = cpu_to_le16(ic->tag_size); |
2437 | ic->sb->log2_sectors_per_block = __ffs(ic->sectors_per_block); | 2445 | ic->sb->log2_sectors_per_block = __ffs(ic->sectors_per_block); |
2438 | if (ic->journal_mac_alg.alg_string) | 2446 | if (ic->journal_mac_alg.alg_string) |
@@ -2489,6 +2497,8 @@ try_smaller_buffer: | |||
2489 | 2497 | ||
2490 | ic->sb->provided_data_sectors = cpu_to_le64(ic->provided_data_sectors); | 2498 | ic->sb->provided_data_sectors = cpu_to_le64(ic->provided_data_sectors); |
2491 | 2499 | ||
2500 | sb_set_version(ic); | ||
2501 | |||
2492 | return 0; | 2502 | return 0; |
2493 | } | 2503 | } |
2494 | 2504 | ||
@@ -3193,7 +3203,7 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
3193 | should_write_sb = true; | 3203 | should_write_sb = true; |
3194 | } | 3204 | } |
3195 | 3205 | ||
3196 | if (ic->sb->version != SB_VERSION) { | 3206 | if (!ic->sb->version || ic->sb->version > SB_VERSION_2) { |
3197 | r = -EINVAL; | 3207 | r = -EINVAL; |
3198 | ti->error = "Unknown version"; | 3208 | ti->error = "Unknown version"; |
3199 | goto bad; | 3209 | goto bad; |