From mboxrd@z Thu Jan 1 00:00:00 1970 From: Neil Brown Subject: Re: mdadm: RUN_ARRAY failed: Cannot allocate memory Date: Thu, 29 Mar 2007 17:54:09 +1000 Message-ID: <17931.28833.443823.720207@notabene.brown> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: message from Mr. James W. Laferriere on Saturday March 24 Sender: linux-raid-owner@vger.kernel.org To: "Mr. James W. Laferriere" Cc: linux-raid maillist List-Id: linux-raid.ids On Saturday March 24, babydr@baby-dragons.com wrote: > Hello Neil , I found the problem that caused the 'cannot allcate > memory' , DON'T use '--bitmap=' . > But that said , Hmmmm , Shouldn't mdadm just stop & say ... > 'md: bitmaps not supported for this level.' > Like it puts out into dmesg . > > Also think this message in dmesg is interesting . > "raid0: bad disk number -1 - aborting!' > > Hth , JimL Yeah.... mdadm should be fixed too, but this kernel patch should make it behave a bit better. I'll queue it for 2.6.22. Thanks, NeilBrown Move test for whether level supports bitmap to correct place. We need to check for internal-consistency of superblock in load_super. validate_super is for inter-device consistency. Signed-off-by: Neil Brown ### Diffstat output ./drivers/md/md.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff .prev/drivers/md/md.c ./drivers/md/md.c --- .prev/drivers/md/md.c 2007-03-29 16:42:18.000000000 +1000 +++ ./drivers/md/md.c 2007-03-29 16:49:26.000000000 +1000 @@ -695,6 +695,17 @@ static int super_90_load(mdk_rdev_t *rde rdev->data_offset = 0; rdev->sb_size = MD_SB_BYTES; + if (sb->state & (1<level != 1 && sb->level != 4 + && sb->level != 5 && sb->level != 6 + && sb->level != 10) { + /* FIXME use a better test */ + printk(KERN_WARNING + "md: bitmaps not supported for this level.\n"); + goto abort; + } + } + if (sb->level == LEVEL_MULTIPATH) rdev->desc_nr = -1; else @@ -793,16 +804,8 @@ static int super_90_validate(mddev_t *md mddev->max_disks = MD_SB_DISKS; if (sb->state & (1<bitmap_file == NULL) { - if (mddev->level != 1 && mddev->level != 4 - && mddev->level != 5 && mddev->level != 6 - && mddev->level != 10) { - /* FIXME use a better test */ - printk(KERN_WARNING "md: bitmaps not supported for this level.\n"); - return -EINVAL; - } + mddev->bitmap_file == NULL) mddev->bitmap_offset = mddev->default_bitmap_offset; - } } else if (mddev->pers == NULL) { /* Insist on good event counter while assembling */ @@ -1059,6 +1062,18 @@ static int super_1_load(mdk_rdev_t *rdev bdevname(rdev->bdev,b)); return -EINVAL; } + if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)) { + if (sb->level != cpu_to_le32(1) && + sb->level != cpu_to_le32(4) && + sb->level != cpu_to_le32(5) && + sb->level != cpu_to_le32(6) && + sb->level != cpu_to_le32(10)) { + printk(KERN_WARNING + "md: bitmaps not supported for this level.\n"); + return -EINVAL; + } + } + rdev->preferred_minor = 0xffff; rdev->data_offset = le64_to_cpu(sb->data_offset); atomic_set(&rdev->corrected_errors, le32_to_cpu(sb->cnt_corrected_read)); @@ -1142,14 +1157,9 @@ static int super_1_validate(mddev_t *mdd mddev->max_disks = (4096-256)/2; if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) && - mddev->bitmap_file == NULL ) { - if (mddev->level != 1 && mddev->level != 5 && mddev->level != 6 - && mddev->level != 10) { - printk(KERN_WARNING "md: bitmaps not supported for this level.\n"); - return -EINVAL; - } + mddev->bitmap_file == NULL ) mddev->bitmap_offset = (__s32)le32_to_cpu(sb->bitmap_offset); - } + if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) { mddev->reshape_position = le64_to_cpu(sb->reshape_position); mddev->delta_disks = le32_to_cpu(sb->delta_disks);