|
@@ -1507,6 +1507,12 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_
|
|
|
} else if (sb->bblog_offset != 0)
|
|
|
rdev->badblocks.shift = 0;
|
|
|
|
|
|
+ if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
|
|
|
+ rdev->ppl.offset = (__s16)le16_to_cpu(sb->ppl.offset);
|
|
|
+ rdev->ppl.size = le16_to_cpu(sb->ppl.size);
|
|
|
+ rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
|
|
|
+ }
|
|
|
+
|
|
|
if (!refdev) {
|
|
|
ret = 1;
|
|
|
} else {
|
|
@@ -1619,6 +1625,13 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
|
|
|
|
if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
|
|
|
set_bit(MD_HAS_JOURNAL, &mddev->flags);
|
|
|
+
|
|
|
+ if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
|
|
|
+ if (le32_to_cpu(sb->feature_map) &
|
|
|
+ (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_JOURNAL))
|
|
|
+ return -EINVAL;
|
|
|
+ set_bit(MD_HAS_PPL, &mddev->flags);
|
|
|
+ }
|
|
|
} else if (mddev->pers == NULL) {
|
|
|
/* Insist of good event counter while assembling, except for
|
|
|
* spares (which don't need an event count) */
|
|
@@ -1832,6 +1845,12 @@ retry:
|
|
|
if (test_bit(MD_HAS_JOURNAL, &mddev->flags))
|
|
|
sb->feature_map |= cpu_to_le32(MD_FEATURE_JOURNAL);
|
|
|
|
|
|
+ if (test_bit(MD_HAS_PPL, &mddev->flags)) {
|
|
|
+ sb->feature_map |= cpu_to_le32(MD_FEATURE_PPL);
|
|
|
+ sb->ppl.offset = cpu_to_le16(rdev->ppl.offset);
|
|
|
+ sb->ppl.size = cpu_to_le16(rdev->ppl.size);
|
|
|
+ }
|
|
|
+
|
|
|
rdev_for_each(rdev2, mddev) {
|
|
|
i = rdev2->desc_nr;
|
|
|
if (test_bit(Faulty, &rdev2->flags))
|