From patchwork Tue Feb 11 14:24:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Azat Khuzhin X-Patchwork-Id: 319301 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 11D862C00B3 for ; Wed, 12 Feb 2014 01:24:49 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751487AbaBKOY3 (ORCPT ); Tue, 11 Feb 2014 09:24:29 -0500 Received: from mail-lb0-f174.google.com ([209.85.217.174]:51433 "EHLO mail-lb0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751014AbaBKOY2 (ORCPT ); Tue, 11 Feb 2014 09:24:28 -0500 Received: by mail-lb0-f174.google.com with SMTP id l4so5898090lbv.19 for ; Tue, 11 Feb 2014 06:24:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=FI8QhnxoHTWw/8fo4BGRvYrMujHYw9RmoD43XljcINs=; b=NljC/OwOLRYb7yG8+E5aqNCSczj5xCU80Z4VXFC1kyY76rFZNMyFthvcQ2Veo4SyeI qkJrl0HIZnMBc6n3sa4h5tyJeB5ycyA4EDF8PWq4dZUuHAmSX5av22verYSGEcUungL6 WbDxLOeM0i8eakM9Du5nBPJhuvuSyzkyubGFySSDXnP5p4x6lYUa9jO6YHtfOKoleI9f nMa8lTjMcC5wX4wGjpTYDzOEXIgX+axes8IW4mGTGGRA9Xrt0jfebce9aIYkldjkbcse TwJV3mG/w3dlkGLkyXFAan/FZO1Vwk4mp4jt3VQZsmakthxuHCdQo5pfWciGqKqQYk1l b+xw== X-Received: by 10.112.26.79 with SMTP id j15mr62094lbg.73.1392128665124; Tue, 11 Feb 2014 06:24:25 -0800 (PST) Received: from localhost ([188.134.22.24]) by mx.google.com with ESMTPSA id cu8sm19758997lbb.12.2014.02.11.06.24.23 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 11 Feb 2014 06:24:24 -0800 (PST) From: Azat Khuzhin To: linux-ext4@vger.kernel.org Cc: Azat Khuzhin , "Theodore Ts'o" , Andreas Dilger , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3] ext4: initialize multi-block allocator before checking block descriptors Date: Tue, 11 Feb 2014 18:24:12 +0400 Message-Id: <1392128652-6882-1-git-send-email-a3at.mail@gmail.com> X-Mailer: git-send-email 1.8.5.3 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org With EXT4FS_DEBUG ext4_count_free_clusters() will call ext4_read_block_bitmap() without s_group_info initialized, so we need to initialize multi-block allocator before. And we can't initialize multi-block allocator without group descriptors, since it use them. Also we need to install s_op before initializing multi-block allocator, because in ext4_mb_init_backend() new inode is created. Here is bt: (gdb) bt #0 ext4_get_group_info (group=0, sb=0xffff880079a10000) at ext4.h:2430 #1 ext4_validate_block_bitmap (sb=sb@entry=0xffff880079a10000, desc=desc@entry=0xffff880056510000, block_group=block_group@entry=0, bh=bh@entry=0xffff88007bf2b2d8) at balloc.c:358 #2 0xffffffff81232202 in ext4_wait_block_bitmap (sb=sb@entry=0xffff880079a10000, block_group=block_group@entry=0, bh=bh@entry=0xffff88007bf2b2d8) at balloc.c:476 #3 0xffffffff81232eaf in ext4_read_block_bitmap (sb=sb@entry=0xffff880079a10000, block_group=block_group@entry=0) at balloc.c:489 #4 0xffffffff81232fc0 in ext4_count_free_clusters (sb=sb@entry=0xffff880079a10000) at balloc.c:665 #5 0xffffffff81259ffa in ext4_check_descriptors (first_not_zeroed=, sb=0xffff880079a10000) at super.c:2143 #6 ext4_fill_super (sb=sb@entry=0xffff880079a10000, data=, data@entry=0x0 , silent=silent@entry=0) at super.c:3851 #7 0xffffffff811b8340 in mount_bdev (fs_type=, flags=0, dev_name=, data=0x0 , fill_super=fill_super@entry=0xffffffff812589c0 ) at super.c:987 #8 0xffffffff8124ec35 in ext4_mount (fs_type=, flags=, dev_name=, data=) at super.c:5365 #9 0xffffffff811b8cf9 in mount_fs (type=type@entry=0xffffffff81c71840 , flags=flags@entry=0, name=name@entry=0xffff880077a80c70 "/dev/loop4", data=data@entry=0x0 ) at super.c:1090 #10 0xffffffff811d2ff3 in vfs_kern_mount (type=type@entry=0xffffffff81c71840 , flags=0, name=name@entry=0xffff880077a80c70 "/dev/loop4", data=data@entry=0x0 ) at namespace.c:813 #11 0xffffffff811d55de in do_new_mount (data=0x0 , name=0xffff880077a80c70 "/dev/loop4", mnt_flags=32, flags=, fstype=0xffff880077a80ca0 "ext4-insane", path=0xffff88007a5b1ed0) at namespace.c:2068 #12 do_mount (dev_name=0xffff880077a80c70 "/dev/loop4", dir_name=, type_page=0xffff880077a80ca0 "ext4-insane", flags=, flags@entry=3236757504, data_page=0x0 ) at namespace.c:2392 #13 0xffffffff811d6183 in SYSC_mount (data=0x0 , flags=3236757504, type=, dir_name=, dev_name=0x7ffad9649c20 "/dev/loop4") at namespace.c:2586 #14 SyS_mount (dev_name=140715365800992, dir_name=, type=, flags=3236757504, data=0) at namespace.c:2559 Signed-off-by: Azat Khuzhin --- v2: ext4: initialize multi-block allocator after group descriptors loaded v3: ext4: set s_op before initializing multi-block allocator fs/ext4/super.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 1f7784d..fc42ee0 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -3848,16 +3848,34 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) goto failed_mount2; } } + + /* + * set up enough so that it can read an inode + */ + if (!test_opt(sb, NOLOAD) && + EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) + sb->s_op = &ext4_sops; + else + sb->s_op = &ext4_nojournal_sops; + + ext4_ext_init(sb); + err = ext4_mb_init(sb); + if (err) { + ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", + err); + goto failed_mount2; + } + if (!ext4_check_descriptors(sb, &first_not_zeroed)) { ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); - goto failed_mount2; + goto failed_mount2a; } if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) if (!ext4_fill_flex_info(sb)) { ext4_msg(sb, KERN_ERR, "unable to initialize " "flex_bg meta info!"); - goto failed_mount2; + goto failed_mount2a; } sbi->s_gdb_count = db_count; @@ -3895,14 +3913,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sbi->s_stripe = ext4_get_stripe_size(sbi); sbi->s_extent_max_zeroout_kb = 32; - /* - * set up enough so that it can read an inode - */ - if (!test_opt(sb, NOLOAD) && - EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) - sb->s_op = &ext4_sops; - else - sb->s_op = &ext4_nojournal_sops; sb->s_export_op = &ext4_export_ops; sb->s_xattr = ext4_xattr_handlers; #ifdef CONFIG_QUOTA @@ -4094,14 +4104,6 @@ no_journal: goto failed_mount4a; } - ext4_ext_init(sb); - err = ext4_mb_init(sb); - if (err) { - ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", - err); - goto failed_mount5; - } - err = ext4_register_li_request(sb, first_not_zeroed); if (err) goto failed_mount6; @@ -4175,9 +4177,6 @@ failed_mount8: failed_mount7: ext4_unregister_li_request(sb); failed_mount6: - ext4_mb_release(sb); -failed_mount5: - ext4_ext_release(sb); ext4_release_system_zone(sb); failed_mount4a: dput(sb->s_root); @@ -4203,11 +4202,14 @@ failed_mount3: percpu_counter_destroy(&sbi->s_extent_cache_cnt); if (sbi->s_mmp_tsk) kthread_stop(sbi->s_mmp_tsk); +failed_mount2a: + ext4_mb_release(sb); failed_mount2: for (i = 0; i < db_count; i++) brelse(sbi->s_group_desc[i]); ext4_kvfree(sbi->s_group_desc); failed_mount: + ext4_ext_release(sb); if (sbi->s_chksum_driver) crypto_free_shash(sbi->s_chksum_driver); if (sbi->s_proc) {