From patchwork Mon Apr 12 11:48:10 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Monakhov X-Patchwork-Id: 49963 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 74D8BB7D1F for ; Mon, 12 Apr 2010 21:48:28 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753582Ab0DLLs0 (ORCPT ); Mon, 12 Apr 2010 07:48:26 -0400 Received: from mail-bw0-f219.google.com ([209.85.218.219]:53596 "EHLO mail-bw0-f219.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753030Ab0DLLs0 (ORCPT ); Mon, 12 Apr 2010 07:48:26 -0400 Received: by bwz19 with SMTP id 19so1413bwz.21 for ; Mon, 12 Apr 2010 04:48:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=61jYxBvTeQucvyxH8D0y9O3R8hNyiqNPX/1wSpvI8GQ=; b=AbYeoFn+WNeNxx8e/D3Qo8J/QjzSbirUH9xaIE+rs7DvZj4iXUYRFsjAG/6Flrvig+ t/ugQRVBaC+EmPQA/AKjPpVXe0GqbC/7n6EvL2BR0jC7K61YeU8COllaQ/yX1eM099Qf z95ow0dam5GX/ZAqwk7K2ozzbsK2jRaoQ6ezI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=ZS95zDItcTNMiD/mO0i2mseNXPpF9DLiTFaTeEYSItR3trupMbAUMcMR5KcywjOdUP S65GzbvCa2paJZPpJaHVZPxt2FUIxKZhgBIrS6ahw1GL7ie14O2icwUlD0L5bw+2Bf2I 05LNef7+sm2DCYaJSioUDa9BFNdYL4UZJGIc8= Received: by 10.204.9.152 with SMTP id l24mr4665559bkl.193.1271072903649; Mon, 12 Apr 2010 04:48:23 -0700 (PDT) Received: from localhost.localdomain (swsoft-msk-nat.sw.ru [195.214.232.10]) by mx.google.com with ESMTPS id 14sm1712901bwz.14.2010.04.12.04.48.22 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 12 Apr 2010 04:48:23 -0700 (PDT) From: Dmitry Monakhov To: linux-ext4@vger.kernel.org Cc: tytso@mit.edu, Dmitry Monakhov Subject: [PATCH 2/2] ext4: init statistics after journal recovery Date: Mon, 12 Apr 2010 15:48:10 +0400 Message-Id: <1271072890-5404-2-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.6.3.3 In-Reply-To: <1271072890-5404-1-git-send-email-dmonakhov@openvz.org> References: <1271072890-5404-1-git-send-email-dmonakhov@openvz.org> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Currently block/inode/dir counters initialized before journal was recovered. In fact after journal recovery this info will probably change. And freeblocks it critical for correct delalloc mode accounting. BUG:#15768 Signed-off-by: Dmitry Monakhov --- fs/ext4/super.c | 44 ++++++++++++++++++++++---------------------- 1 files changed, 22 insertions(+), 22 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 29c6875..17cb785 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -2793,24 +2793,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) get_random_bytes(&sbi->s_next_generation, sizeof(u32)); spin_lock_init(&sbi->s_next_gen_lock); - err = percpu_counter_init(&sbi->s_freeblocks_counter, - ext4_count_free_blocks(sb)); - if (!err) { - err = percpu_counter_init(&sbi->s_freeinodes_counter, - ext4_count_free_inodes(sb)); - } - if (!err) { - err = percpu_counter_init(&sbi->s_dirs_counter, - ext4_count_dirs(sb)); - } - if (!err) { - err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0); - } - if (err) { - ext4_msg(sb, KERN_ERR, "insufficient memory"); - goto failed_mount3; - } - sbi->s_stripe = ext4_get_stripe_size(sbi); sbi->s_max_writeback_mb_bump = 128; @@ -2859,6 +2841,24 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) goto no_journal; } + err = percpu_counter_init(&sbi->s_freeblocks_counter, + ext4_count_free_blocks(sb)); + if (!err) { + err = percpu_counter_init(&sbi->s_freeinodes_counter, + ext4_count_free_inodes(sb)); + } + if (!err) { + err = percpu_counter_init(&sbi->s_dirs_counter, + ext4_count_dirs(sb)); + } + if (!err) { + err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0); + } + if (err) { + ext4_msg(sb, KERN_ERR, "insufficient memory"); + goto failed_mount_wq; + } + if (ext4_blocks_count(es) > 0xffffffffULL && !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_64BIT)) { @@ -3059,6 +3059,10 @@ failed_mount_wq: jbd2_journal_destroy(sbi->s_journal); sbi->s_journal = NULL; } + percpu_counter_destroy(&sbi->s_freeblocks_counter); + percpu_counter_destroy(&sbi->s_freeinodes_counter); + percpu_counter_destroy(&sbi->s_dirs_counter); + percpu_counter_destroy(&sbi->s_dirtyblocks_counter); failed_mount3: if (sbi->s_flex_groups) { if (is_vmalloc_addr(sbi->s_flex_groups)) @@ -3066,10 +3070,6 @@ failed_mount3: else kfree(sbi->s_flex_groups); } - percpu_counter_destroy(&sbi->s_freeblocks_counter); - percpu_counter_destroy(&sbi->s_freeinodes_counter); - percpu_counter_destroy(&sbi->s_dirs_counter); - percpu_counter_destroy(&sbi->s_dirtyblocks_counter); failed_mount2: for (i = 0; i < db_count; i++) brelse(sbi->s_group_desc[i]);