lkml.org 
[lkml]   [2019]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.0 097/139] dm integrity: correctly calculate the size of metadata area
    Date
    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
    @@ -2568,7 +2568,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;
    @@ -3439,7 +3439,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);

    \
     
     \ /
      Last update: 2019-05-23 21:39    [W:4.225 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site