From patchwork Tue Jun 16 13:09:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Beata Michalska X-Patchwork-Id: 6617881 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 91F20C0020 for ; Tue, 16 Jun 2015 13:11:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9E10E20787 for ; Tue, 16 Jun 2015 13:11:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6740320786 for ; Tue, 16 Jun 2015 13:11:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756402AbbFPNKI (ORCPT ); Tue, 16 Jun 2015 09:10:08 -0400 Received: from mailout4.w1.samsung.com ([210.118.77.14]:13588 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753902AbbFPNJp (ORCPT ); Tue, 16 Jun 2015 09:09:45 -0400 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NQ1006PGGK65E80@mailout4.w1.samsung.com>; Tue, 16 Jun 2015 14:09:42 +0100 (BST) X-AuditID: cbfec7f4-f79c56d0000012ee-3e-55802016216c Received: from eusync3.samsung.com ( [203.254.199.213]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id F0.57.04846.61020855; Tue, 16 Jun 2015 14:09:42 +0100 (BST) Received: from AMDC2203.DIGITAL.local ([106.120.53.25]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NQ100DE5GJY0Z60@eusync3.samsung.com>; Tue, 16 Jun 2015 14:09:42 +0100 (BST) From: Beata Michalska To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Cc: greg@kroah.com, jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, hughd@google.com, lczerner@redhat.com, hch@infradead.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org, kyungmin.park@samsung.com, kmpark@infradead.org Subject: [RFC v3 2/4] ext4: Add helper function to mark group as corrupted Date: Tue, 16 Jun 2015 15:09:31 +0200 Message-id: <1434460173-18427-3-git-send-email-b.michalska@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1434460173-18427-1-git-send-email-b.michalska@samsung.com> References: <1434460173-18427-1-git-send-email-b.michalska@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFLMWRmVeSWpSXmKPExsVy+t/xq7piCg2hBpf+S1t8/dLBYnFuwQxG i9MTFjFZPP3Ux2Ixe3ozk8Wty6tYLM42vWG3WPZgM4vF5u8dbBYz591hs9iz9ySLxeVdc9gs 7q35z2rR2vOT3YHPo2VzuceCTaUem1doebx9GOCx6dMkdo+mM0eZPd7vu8rm0bdlFaPHmQVH 2D0+b5IL4IrisklJzcksSy3St0vgyti39CFLwT/liq3NF5gaGJvkuhg5OSQETCR+nGxihrDF JC7cW8/WxcjFISSwlFHi4L7nrBBOI5PEu85edpAqNgF9iVczVjKB2CICMRIHd/WwgBQxC7xi lPjzcDlYQljAS2LpsllACQ4OFgFViZdnzUDCvALuEu39d1hBwhICChJzJtmAhDkFPCS6H09j BwkLAZUc3OA5gZF3ASPDKkbR1NLkguKk9FxDveLE3OLSvHS95PzcTYyQEP6yg3HxMatDjAIc jEo8vBGfakOFWBPLiitzDzFKcDArifDOE2kIFeJNSaysSi3Kjy8qzUktPsQozcGiJM47d9f7 ECGB9MSS1OzU1ILUIpgsEwenVANjd9SEvBMKh84n5ss4/36qw7rOfbL7k1W9rlztr4qFOT13 dQuevvKhpiLn9bm2Bv6Nftl505Sullf+LHe803ht3mbJ67MK18U/bK26KfVyosRz67R7DM5i 5efvaveqbFHie1tZYvWp6ui3N928+lPNdiVdXCO1e/o0y82+Qlxc2tnhhm7OBn+VWIozEg21 mIuKEwGhN0VyXQIAAA== Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add ext4_mark_group_corrupted helper function to simplify the code and to keep the logic in one place. Signed-off-by: Beata Michalska --- fs/ext4/balloc.c | 15 +++------------ fs/ext4/ext4.h | 9 +++++++++ fs/ext4/ialloc.c | 5 +---- fs/ext4/mballoc.c | 11 ++--------- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 83a6f49..e95b27a 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -193,10 +193,7 @@ static int ext4_init_block_bitmap(struct super_block *sb, * essentially implementing a per-group read-only flag. */ if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) { grp = ext4_get_group_info(sb, block_group); - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - grp->bb_free); - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + ext4_mark_group_corrupted(sbi, grp); if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) { int count; count = ext4_free_inodes_count(sb, gdp); @@ -379,20 +376,14 @@ static void ext4_validate_block_bitmap(struct super_block *sb, ext4_unlock_group(sb, block_group); ext4_error(sb, "bg %u: block %llu: invalid block bitmap", block_group, blk); - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - grp->bb_free); - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + ext4_mark_group_corrupted(sbi, grp); return; } if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, desc, bh))) { ext4_unlock_group(sb, block_group); ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - grp->bb_free); - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + ext4_mark_group_corrupted(sbi, grp); return; } set_buffer_verified(bh); diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f63c3d5..163afe2 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2535,6 +2535,15 @@ static inline spinlock_t *ext4_group_lock_ptr(struct super_block *sb, return bgl_lock_ptr(EXT4_SB(sb)->s_blockgroup_lock, group); } +static inline +void ext4_mark_group_corrupted(struct ext4_sb_info *sbi, + struct ext4_group_info *grp) +{ + if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) + percpu_counter_sub(&sbi->s_freeclusters_counter, grp->bb_free); + set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); +} + /* * Returns true if the filesystem is busy enough that attempts to * access the block group locks has run into contention. diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index ac644c3..ebe0499 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -79,10 +79,7 @@ static unsigned ext4_init_inode_bitmap(struct super_block *sb, if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) { ext4_error(sb, "Checksum bad for group %u", block_group); grp = ext4_get_group_info(sb, block_group); - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - grp->bb_free); - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + ext4_mark_group_corrupted(sbi, grp); if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) { int count; count = ext4_free_inodes_count(sb, gdp); diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 8d1e602..24a4b6d 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -760,10 +760,7 @@ void ext4_mb_generate_buddy(struct super_block *sb, * corrupt and update bb_free using bitmap value */ grp->bb_free = free; - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - grp->bb_free); - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + ext4_mark_group_corrupted(sbi, grp); } mb_set_largest_free_order(sb, grp); @@ -1448,12 +1445,8 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b, "freeing already freed block " "(bit %u); block bitmap corrupt.", block); - if (!EXT4_MB_GRP_BBITMAP_CORRUPT(e4b->bd_info)) - percpu_counter_sub(&sbi->s_freeclusters_counter, - e4b->bd_info->bb_free); /* Mark the block group as corrupt. */ - set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, - &e4b->bd_info->bb_state); + ext4_mark_group_corrupted(sbi, e4b->bd_info); mb_regenerate_buddy(e4b); goto done; }