| From 30bba430ddf737978e40561198693ba91386dac1 Mon Sep 17 00:00:00 2001 |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| Date: Tue, 7 May 2019 14:28:35 -0400 |
| Subject: dm integrity: correctly calculate the size of metadata area |
| |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| |
| commit 30bba430ddf737978e40561198693ba91386dac1 upstream. |
| |
| When we use separate devices for data and metadata, dm-integrity would |
| incorrectly calculate the size of the metadata device as if it had |
| 512-byte block size - and it would refuse activation with larger block |
| size and smaller metadata device. |
| |
| Fix this so that it takes actual block size into account, which fixes |
| the following reported issue: |
| https://gitlab.com/cryptsetup/cryptsetup/issues/450 |
| |
| Fixes: 356d9d52e122 ("dm integrity: allow separate metadata device") |
| Cc: stable@vger.kernel.org # v4.19+ |
| Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-integrity.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/md/dm-integrity.c |
| +++ b/drivers/md/dm-integrity.c |
| @@ -2557,7 +2557,7 @@ static int calculate_device_limits(struc |
| if (last_sector < ic->start || last_sector >= ic->meta_device_sectors) |
| return -EINVAL; |
| } else { |
| - __u64 meta_size = ic->provided_data_sectors * ic->tag_size; |
| + __u64 meta_size = (ic->provided_data_sectors >> ic->sb->log2_sectors_per_block) * ic->tag_size; |
| meta_size = (meta_size + ((1U << (ic->log2_buffer_sectors + SECTOR_SHIFT)) - 1)) |
| >> (ic->log2_buffer_sectors + SECTOR_SHIFT); |
| meta_size <<= ic->log2_buffer_sectors; |
| @@ -3428,7 +3428,7 @@ try_smaller_buffer: |
| DEBUG_print(" journal_sections %u\n", (unsigned)le32_to_cpu(ic->sb->journal_sections)); |
| DEBUG_print(" journal_entries %u\n", ic->journal_entries); |
| DEBUG_print(" log2_interleave_sectors %d\n", ic->sb->log2_interleave_sectors); |
| - DEBUG_print(" device_sectors 0x%llx\n", (unsigned long long)ic->device_sectors); |
| + DEBUG_print(" data_device_sectors 0x%llx\n", (unsigned long long)ic->data_device_sectors); |
| DEBUG_print(" initial_sectors 0x%x\n", ic->initial_sectors); |
| DEBUG_print(" metadata_run 0x%x\n", ic->metadata_run); |
| DEBUG_print(" log2_metadata_run %d\n", ic->log2_metadata_run); |