aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c22
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);