From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ted Ts'o Subject: Re: [PATCH] ext4: fall back to vmalloc() for large allocations Date: Sun, 17 Jul 2011 21:25:56 -0400 Message-ID: <20110718012556.GJ2717@thunk.org> References: <1310506846-25843-1-git-send-email-adilger@whamcloud.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-ext4@vger.kernel.org, Yu Jian To: Andreas Dilger Return-path: Received: from li9-11.members.linode.com ([67.18.176.11]:45700 "EHLO test.thunk.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752853Ab1GRBZ6 (ORCPT ); Sun, 17 Jul 2011 21:25:58 -0400 Content-Disposition: inline In-Reply-To: <1310506846-25843-1-git-send-email-adilger@whamcloud.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: On Tue, Jul 12, 2011 at 03:40:46PM -0600, Andreas Dilger wrote: > For very large ext4 filesystems (128TB and larger) kmalloc() of > some per-group structures can fail at mount time due to memory > fragmentation. If kmalloc() fails, fall back to vmalloc() for > the s_group_info and s_group_desc arrays. > > Signed-off-by: Yu Jian > Signed-off-by: Andreas Dilger Andras, was this patch authored by Yu Jian or by you? > sbi->s_buddy_cache = new_inode(sb); > if (sbi->s_buddy_cache == NULL) { > - printk(KERN_ERR "EXT4-fs: can't get new inode\n"); > + ext4_msg(sb, KERN_ERR, "can't get new inode\n"); > goto err_freesgi; > } Using ext4_msg instead of printk is good, but that really should be a separate patch. > - sbi->s_buddy_cache->i_ino = get_next_ino(); > + /* To avoid potentially colliding with an valid on-disk inode number, > + * use EXT4_BAD_INO for the buddy cache inode number. This inode is > + * not in the inode hash, so it should never be found by iget(), but > + * this will avoid confusion if it ever shows up during debugging. */ > + sbi->s_buddy_cache->i_ino = EXT4_BAD_INO; This should be a separate patch. > @@ -2457,12 +2472,6 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery) > i++; > } while (i <= sb->s_blocksize_bits + 1); > > - /* init file for buddy data */ > - ret = ext4_mb_init_backend(sb); > - if (ret != 0) { > - goto out; > - } > - > spin_lock_init(&sbi->s_md_lock); > spin_lock_init(&sbi->s_bal_lock); > > @@ -2487,6 +2496,11 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery) > spin_lock_init(&lg->lg_prealloc_lock); > } > > + /* init file for buddy data */ > + ret = ext4_mb_init_backend(sb); > + if (ret != 0) > + goto out; > + > if (sbi->s_proc) > proc_create_data("mb_groups", S_IRUGO, sbi->s_proc, > &ext4_mb_seq_groups_fops, sb); Why are you moving ext4_mb_init_backend()? This should be a separate patch, with an explanation of what is going on.... - Ted