diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index bae42331182d..36c05ba7855a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3176,13 +3176,33 @@ static int do_md_run(mddev_t * mddev) | |||
3176 | * Drop all container device buffers, from now on | 3176 | * Drop all container device buffers, from now on |
3177 | * the only valid external interface is through the md | 3177 | * the only valid external interface is through the md |
3178 | * device. | 3178 | * device. |
3179 | * Also find largest hardsector size | ||
3180 | */ | 3179 | */ |
3181 | ITERATE_RDEV(mddev,rdev,tmp) { | 3180 | ITERATE_RDEV(mddev,rdev,tmp) { |
3182 | if (test_bit(Faulty, &rdev->flags)) | 3181 | if (test_bit(Faulty, &rdev->flags)) |
3183 | continue; | 3182 | continue; |
3184 | sync_blockdev(rdev->bdev); | 3183 | sync_blockdev(rdev->bdev); |
3185 | invalidate_bdev(rdev->bdev); | 3184 | invalidate_bdev(rdev->bdev); |
3185 | |||
3186 | /* perform some consistency tests on the device. | ||
3187 | * We don't want the data to overlap the metadata, | ||
3188 | * Internal Bitmap issues has handled elsewhere. | ||
3189 | */ | ||
3190 | if (rdev->data_offset < rdev->sb_offset) { | ||
3191 | if (mddev->size && | ||
3192 | rdev->data_offset + mddev->size*2 | ||
3193 | > rdev->sb_offset*2) { | ||
3194 | printk("md: %s: data overlaps metadata\n", | ||
3195 | mdname(mddev)); | ||
3196 | return -EINVAL; | ||
3197 | } | ||
3198 | } else { | ||
3199 | if (rdev->sb_offset*2 + rdev->sb_size/512 | ||
3200 | > rdev->data_offset) { | ||
3201 | printk("md: %s: metadata overlaps data\n", | ||
3202 | mdname(mddev)); | ||
3203 | return -EINVAL; | ||
3204 | } | ||
3205 | } | ||
3186 | } | 3206 | } |
3187 | 3207 | ||
3188 | md_probe(mddev->unit, NULL, NULL); | 3208 | md_probe(mddev->unit, NULL, NULL); |