From patchwork Mon Dec 1 10:21:54 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akira Fujita X-Patchwork-Id: 11545 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.176.167]) by ozlabs.org (Postfix) with ESMTP id 67B55DDD04 for ; Mon, 1 Dec 2008 21:22:26 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751039AbYLAKWY (ORCPT ); Mon, 1 Dec 2008 05:22:24 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751079AbYLAKWY (ORCPT ); Mon, 1 Dec 2008 05:22:24 -0500 Received: from TYO202.gate.nec.co.jp ([202.32.8.206]:62970 "EHLO tyo202.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751039AbYLAKWX (ORCPT ); Mon, 1 Dec 2008 05:22:23 -0500 Received: from mailgate3.nec.co.jp ([10.7.69.160]) by tyo202.gate.nec.co.jp (8.13.8/8.13.4) with ESMTP id mB1ALukD027457; Mon, 1 Dec 2008 19:21:56 +0900 (JST) Received: (from root@localhost) by mailgate3.nec.co.jp (8.11.7/3.7W-MAILGATE-NEC) id mB1ALuE07523; Mon, 1 Dec 2008 19:21:56 +0900 (JST) Received: from kaishu.jp.nec.com (kaishu.jp.nec.com [10.26.220.5]) by mailsv4.nec.co.jp (8.13.8/8.13.4) with ESMTP id mB1ALtoV020861; Mon, 1 Dec 2008 19:21:55 +0900 (JST) Received: from [10.64.168.93] ([10.64.168.93] [10.64.168.93]) by mail.jp.nec.com with ESMTP; Mon, 1 Dec 2008 19:21:55 +0900 Message-ID: <4933BAC2.6080004@rs.jp.nec.com> Date: Mon, 01 Dec 2008 19:21:54 +0900 From: Akira Fujita User-Agent: Thunderbird 2.0.0.18 (Windows/20081105) MIME-Version: 1.0 To: Theodore Tso CC: Li Zefan , linux-ext4@vger.kernel.org Subject: [PATCH]ext4: fix s_dirty_blocks_counter if block allocation failed with nodelalloc Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org ext4: Fix s_dirty_blocks_counter if block allocation failed with nodelalloc From: Akira Fujita If block allocation failed after marking claimed blocks as dirty blocks with nodelalloc, we have to subtract these blocks from s_dirty_blocks_counter in error handling. Otherwise s_dirty_blocks_counter goes wrong so that filesystem's free blocks decreases incorrectly. This issue was reported as ext4 online defrag's bug by Li Zefan. http://marc.info/?l=linux-ext4&m=122697235715170&w=2 Reported-by: Li Zefan Signed-off-by: Akira Fujita --- mballoc.c | 9 +++++++++ 1 file changed, 9 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff -X linux-2.6.28-rc6-ext4/Documentation/dontdiff -upNr linux-2.6.28-rc6-ext4/fs/ext4/mballoc.c linux-2.6.28-rc6-mballoc-fix/fs/ext4/mballoc.c --- linux-2.6.28-rc6-ext4/fs/ext4/mballoc.c 2008-12-01 11:44:28.000000000 +0900 +++ linux-2.6.28-rc6-mballoc-fix/fs/ext4/mballoc.c 2008-12-01 12:04:06.000000000 +0900 @@ -4495,12 +4495,18 @@ ext4_fsblk_t ext4_mb_new_blocks(handle_t if (!ac) { ar->len = 0; *errp = -ENOMEM; + if (!(ac->ac_flags & EXT4_MB_DELALLOC_RESERVED)) + percpu_counter_sub(&sbi->s_dirtyblocks_counter, + reserv_blks); goto out1; } *errp = ext4_mb_initialize_context(ac, ar); if (*errp) { ar->len = 0; + if (!(ac->ac_flags & EXT4_MB_DELALLOC_RESERVED)) + percpu_counter_sub(&sbi->s_dirtyblocks_counter, + reserv_blks); goto out2; } @@ -4541,6 +4547,9 @@ repeat: if (freed) goto repeat; *errp = -ENOSPC; + if (!(ac->ac_flags & EXT4_MB_DELALLOC_RESERVED)) + percpu_counter_sub(&sbi->s_dirtyblocks_counter, + reserv_blks); ac->ac_b_ex.fe_len = 0; ar->len = 0; ext4_mb_show_ac(ac);