Skip to content

Commit

Permalink
md: forbid a RAID5 from having both a bitmap and a journal.
Browse files Browse the repository at this point in the history
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.

Cc: stable@vger.kernel.org (4.10+)
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>
  • Loading branch information
NeilBrown authored and Shaohua Li committed Nov 2, 2017
1 parent 235b600 commit 230b55f
Showing 3 changed files with 14 additions and 1 deletion.
6 changes: 6 additions & 0 deletions drivers/md/md-bitmap.c
Original file line number Diff line number Diff line change
@@ -1816,6 +1816,12 @@ struct bitmap *bitmap_create(struct mddev *mddev, int slot)

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);
2 changes: 1 addition & 1 deletion drivers/md/md.c
Original file line number Diff line number Diff line change
@@ -6362,7 +6362,7 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
break;
}
}
if (has_journal) {
if (has_journal || mddev->bitmap) {
export_rdev(rdev);
return -EBUSY;
}
7 changes: 7 additions & 0 deletions drivers/md/raid5.c
Original file line number Diff line number Diff line change
@@ -7159,6 +7159,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

0 comments on commit 230b55f

Please sign in to comment.