lkml.org 
[lkml]   [2017]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 88/95] md: forbid a RAID5 from having both a bitmap and a journal.
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: NeilBrown <neilb@suse.com>

    commit 230b55fa8d64007339319539f8f8e68114d08529 upstream.

    Having both a bitmap and a journal is pointless.
    Attempting to do so can corrupt the bitmap if the journal
    replay happens before the bitmap is initialized.
    Rather than try to avoid this corruption, simply
    refuse to allow arrays with both a bitmap and a journal.
    So:
    - if raid5_run sees both are present, fail.
    - if adding a bitmap finds a journal is present, fail
    - if adding a journal finds a bitmap is present, fail.

    Signed-off-by: NeilBrown <neilb@suse.com>
    Tested-by: Joshua Kinard <kumba@gentoo.org>
    Acked-by: Joshua Kinard <kumba@gentoo.org>
    Signed-off-by: Shaohua Li <shli@fb.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/md/bitmap.c | 6 ++++++
    drivers/md/md.c | 2 +-
    drivers/md/raid5.c | 7 +++++++
    3 files changed, 14 insertions(+), 1 deletion(-)

    --- a/drivers/md/bitmap.c
    +++ b/drivers/md/bitmap.c
    @@ -1816,6 +1816,12 @@ struct bitmap *bitmap_create(struct mdde

    BUG_ON(file && mddev->bitmap_info.offset);

    + if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {
    + pr_notice("md/raid:%s: array with journal cannot have bitmap\n",
    + mdname(mddev));
    + return ERR_PTR(-EBUSY);
    + }
    +
    bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL);
    if (!bitmap)
    return ERR_PTR(-ENOMEM);
    --- a/drivers/md/md.c
    +++ b/drivers/md/md.c
    @@ -6362,7 +6362,7 @@ static int add_new_disk(struct mddev *md
    break;
    }
    }
    - if (has_journal) {
    + if (has_journal || mddev->bitmap) {
    export_rdev(rdev);
    return -EBUSY;
    }
    --- a/drivers/md/raid5.c
    +++ b/drivers/md/raid5.c
    @@ -7156,6 +7156,13 @@ static int raid5_run(struct mddev *mddev
    min_offset_diff = diff;
    }

    + if ((test_bit(MD_HAS_JOURNAL, &mddev->flags) || journal_dev) &&
    + (mddev->bitmap_info.offset || mddev->bitmap_info.file)) {
    + pr_notice("md/raid:%s: array cannot have both journal and bitmap\n",
    + mdname(mddev));
    + return -EINVAL;
    + }
    +
    if (mddev->reshape_position != MaxSector) {
    /* Check that we can continue the reshape.
    * Difficulties arise if the stripe we would write to

    \
     
     \ /
      Last update: 2017-12-04 17:10    [W:4.259 / U:0.704 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site