diff options
-rw-r--r-- | drivers/md/faulty.c | 6 | ||||
-rw-r--r-- | drivers/md/linear.c | 2 | ||||
-rw-r--r-- | drivers/md/md.c | 40 | ||||
-rw-r--r-- | drivers/md/md.h | 1 | ||||
-rw-r--r-- | drivers/md/multipath.c | 3 | ||||
-rw-r--r-- | drivers/md/raid0.c | 2 |
6 files changed, 31 insertions, 23 deletions
diff --git a/drivers/md/faulty.c b/drivers/md/faulty.c index 6e83b38d931d..87d88dbb667f 100644 --- a/drivers/md/faulty.c +++ b/drivers/md/faulty.c | |||
@@ -299,8 +299,12 @@ static int run(mddev_t *mddev) | |||
299 | { | 299 | { |
300 | mdk_rdev_t *rdev; | 300 | mdk_rdev_t *rdev; |
301 | int i; | 301 | int i; |
302 | conf_t *conf; | ||
302 | 303 | ||
303 | conf_t *conf = kmalloc(sizeof(*conf), GFP_KERNEL); | 304 | if (md_check_no_bitmap(mddev)) |
305 | return -EINVAL; | ||
306 | |||
307 | conf = kmalloc(sizeof(*conf), GFP_KERNEL); | ||
304 | if (!conf) | 308 | if (!conf) |
305 | return -ENOMEM; | 309 | return -ENOMEM; |
306 | 310 | ||
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index dda2f1b64a6d..564c390f8a1b 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -189,6 +189,8 @@ static int linear_run (mddev_t *mddev) | |||
189 | { | 189 | { |
190 | linear_conf_t *conf; | 190 | linear_conf_t *conf; |
191 | 191 | ||
192 | if (md_check_no_bitmap(mddev)) | ||
193 | return -EINVAL; | ||
192 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | 194 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; |
193 | conf = linear_conf(mddev, mddev->raid_disks); | 195 | conf = linear_conf(mddev, mddev->raid_disks); |
194 | 196 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 0f11fd1417ab..09be637d52cb 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -736,6 +736,24 @@ struct super_type { | |||
736 | }; | 736 | }; |
737 | 737 | ||
738 | /* | 738 | /* |
739 | * Check that the given mddev has no bitmap. | ||
740 | * | ||
741 | * This function is called from the run method of all personalities that do not | ||
742 | * support bitmaps. It prints an error message and returns non-zero if mddev | ||
743 | * has a bitmap. Otherwise, it returns 0. | ||
744 | * | ||
745 | */ | ||
746 | int md_check_no_bitmap(mddev_t *mddev) | ||
747 | { | ||
748 | if (!mddev->bitmap_file && !mddev->bitmap_offset) | ||
749 | return 0; | ||
750 | printk(KERN_ERR "%s: bitmaps are not supported for %s\n", | ||
751 | mdname(mddev), mddev->pers->name); | ||
752 | return 1; | ||
753 | } | ||
754 | EXPORT_SYMBOL(md_check_no_bitmap); | ||
755 | |||
756 | /* | ||
739 | * load_super for 0.90.0 | 757 | * load_super for 0.90.0 |
740 | */ | 758 | */ |
741 | static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | 759 | static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) |
@@ -788,17 +806,6 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version | |||
788 | rdev->data_offset = 0; | 806 | rdev->data_offset = 0; |
789 | rdev->sb_size = MD_SB_BYTES; | 807 | rdev->sb_size = MD_SB_BYTES; |
790 | 808 | ||
791 | if (sb->state & (1<<MD_SB_BITMAP_PRESENT)) { | ||
792 | if (sb->level != 1 && sb->level != 4 | ||
793 | && sb->level != 5 && sb->level != 6 | ||
794 | && sb->level != 10) { | ||
795 | /* FIXME use a better test */ | ||
796 | printk(KERN_WARNING | ||
797 | "md: bitmaps not supported for this level.\n"); | ||
798 | goto abort; | ||
799 | } | ||
800 | } | ||
801 | |||
802 | if (sb->level == LEVEL_MULTIPATH) | 809 | if (sb->level == LEVEL_MULTIPATH) |
803 | rdev->desc_nr = -1; | 810 | rdev->desc_nr = -1; |
804 | else | 811 | else |
@@ -1176,17 +1183,6 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1176 | bdevname(rdev->bdev,b)); | 1183 | bdevname(rdev->bdev,b)); |
1177 | return -EINVAL; | 1184 | return -EINVAL; |
1178 | } | 1185 | } |
1179 | if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)) { | ||
1180 | if (sb->level != cpu_to_le32(1) && | ||
1181 | sb->level != cpu_to_le32(4) && | ||
1182 | sb->level != cpu_to_le32(5) && | ||
1183 | sb->level != cpu_to_le32(6) && | ||
1184 | sb->level != cpu_to_le32(10)) { | ||
1185 | printk(KERN_WARNING | ||
1186 | "md: bitmaps not supported for this level.\n"); | ||
1187 | return -EINVAL; | ||
1188 | } | ||
1189 | } | ||
1190 | 1186 | ||
1191 | rdev->preferred_minor = 0xffff; | 1187 | rdev->preferred_minor = 0xffff; |
1192 | rdev->data_offset = le64_to_cpu(sb->data_offset); | 1188 | rdev->data_offset = le64_to_cpu(sb->data_offset); |
diff --git a/drivers/md/md.h b/drivers/md/md.h index ea2c441449d4..9430a110db93 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -430,5 +430,6 @@ extern void md_new_event(mddev_t *mddev); | |||
430 | extern int md_allow_write(mddev_t *mddev); | 430 | extern int md_allow_write(mddev_t *mddev); |
431 | extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); | 431 | extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev); |
432 | extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); | 432 | extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors); |
433 | extern int md_check_no_bitmap(mddev_t *mddev); | ||
433 | 434 | ||
434 | #endif /* _MD_MD_H */ | 435 | #endif /* _MD_MD_H */ |
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index c1ca63f278a9..cbe368fa6598 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -421,6 +421,9 @@ static int multipath_run (mddev_t *mddev) | |||
421 | struct multipath_info *disk; | 421 | struct multipath_info *disk; |
422 | mdk_rdev_t *rdev; | 422 | mdk_rdev_t *rdev; |
423 | 423 | ||
424 | if (md_check_no_bitmap(mddev)) | ||
425 | return -EINVAL; | ||
426 | |||
424 | if (mddev->level != LEVEL_MULTIPATH) { | 427 | if (mddev->level != LEVEL_MULTIPATH) { |
425 | printk("multipath: %s: raid level not set to multipath IO (%d)\n", | 428 | printk("multipath: %s: raid level not set to multipath IO (%d)\n", |
426 | mdname(mddev), mddev->level); | 429 | mdname(mddev), mddev->level); |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 717e64a4af9a..ab4a489d8695 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -314,6 +314,8 @@ static int raid0_run(mddev_t *mddev) | |||
314 | printk(KERN_ERR "md/raid0: chunk size must be set.\n"); | 314 | printk(KERN_ERR "md/raid0: chunk size must be set.\n"); |
315 | return -EINVAL; | 315 | return -EINVAL; |
316 | } | 316 | } |
317 | if (md_check_no_bitmap(mddev)) | ||
318 | return -EINVAL; | ||
317 | blk_queue_max_sectors(mddev->queue, mddev->chunk_sectors); | 319 | blk_queue_max_sectors(mddev->queue, mddev->chunk_sectors); |
318 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | 320 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; |
319 | 321 | ||