From patchwork Tue May 29 11:45:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 922015 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="W1wI+1nt"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40wBjy6nrlz9s0W for ; Tue, 29 May 2018 21:45:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933325AbeE2Lp0 (ORCPT ); Tue, 29 May 2018 07:45:26 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:41696 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933158AbeE2LpY (ORCPT ); Tue, 29 May 2018 07:45:24 -0400 Received: by mail-pg0-f68.google.com with SMTP id d14-v6so6479467pgv.8 for ; Tue, 29 May 2018 04:45:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=xJgh4ryMigpOgxSEJFS9Oe25G15/0J7Bd9OkKvx+J6U=; b=W1wI+1ntwfAdEpCMue13+CQvyZ78OTIWAjNGHLjZFYZ3tmD5IJ/M9S0sXlMrNO6s/o Ex2afNm+UiWx4ZOm+ViGQfJd9MoHL7sNzlTjVt1gfoned8qNy1MXogCVpdG8hMWm5Iam oMW/4NTF+x9qOpBXDHQXwBguD+C+3T9xPNZUS4TsTRCCf/vMZbry+2B2kP2LCHRMlPcL ztm4cdwb77wPib7ebPNYcZSQja1Ac8CFmBpbMG4VUCytQzO2fX969Es/Zj3L5vReLKth wlmlWAuKCkWlqJCxhn2ir2tVnoCR8h4BvFy2ptMGTf1+ZAP55XcgHj8Hs01yWVdh0FGC a3/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=xJgh4ryMigpOgxSEJFS9Oe25G15/0J7Bd9OkKvx+J6U=; b=QnQ5H9pVr0IiqcYJf9Yhg/RszCC86n60gafzHjobbB2Lzdo4xG9yZbjDeAaGZmPO09 xTYwti0F44ESAUAWjUvzIRct8P/Tu2FLt5ETvow2XTM546GLzP9yceRRUs/IdJ3YDa46 dcW4Mwfw04ZumwCjmyn94q1vc1oNDOcjN/zpKWRx4Km9HKOLwe1o57TlGbGDKaMWOFwU Unch+4n/Cm6HWGzO6b3g7wWUxO4KKLRUt3iQa1XhxmqjpPitUGUHD/bmQtcKCsxgEFwr GpetbdG0yrFvpkADzwY7DE4Lu9nBskwy9naZoUk2gvpzLlCaiH0egMF2Wtf7Ggze+MtH FJzA== X-Gm-Message-State: ALKqPwfLdZpNSEkv1mfMbJE/uGXivLyZHMYcR5gcCBfBRIurNVbFpP9r 4scVSjPfv0c4ftG5GnWMuAQFDA== X-Google-Smtp-Source: AB8JxZonIdvWjaSwGE5IezNfV/mWSurpOemtiWr51zzyiOFaYgIccdxXGK3Wrh9MTvmMPcnidh2Ykw== X-Received: by 2002:a63:3286:: with SMTP id y128-v6mr13922063pgy.419.1527594323970; Tue, 29 May 2018 04:45:23 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id s16-v6sm51226151pfm.114.2018.05.29.04.45.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 May 2018 04:45:23 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: andreas.dilger@intel.com, sihara@ddn.com, wshilong@ddn.com Subject: [PATCH 1/5] ext4: fix race with setting free_inode/clusters_counter Date: Tue, 29 May 2018 20:45:13 +0900 Message-Id: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong Whenever we hit block or inode bitmap corruptions we set bit and then reduce this block group free inode/clusters counter to expose right available space. However some of ext4_mark_group_bitmap_corrupted() is called inside group spinlock, some are not, this could make it happen that we double reduce one block group free counters from system. Always hold group spinlock for it could fix it, but it looks a little heavy, we could use test_and_set_bit() to fix race problems here. Signed-off-by: Wang Shilong Reviewed-by: Andreas Dilger Reviewed-by: Andreas Dilger <adilger@dilger.ca>
--- fs/ext4/super.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index c1c5c87..d6fa6cf 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -770,26 +770,26 @@ void ext4_mark_group_bitmap_corrupted(struct super_block *sb, struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_group_info *grp = ext4_get_group_info(sb, group); struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL); + int ret; - if ((flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) && - !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); + if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) { + ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, + &grp->bb_state); + if (!ret) + percpu_counter_sub(&sbi->s_freeclusters_counter, + grp->bb_free); } - if ((flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) && - !EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) { - if (gdp) { + if (flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) { + ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, + &grp->bb_state); + if (!ret && gdp) { int count; count = ext4_free_inodes_count(sb, gdp); percpu_counter_sub(&sbi->s_freeinodes_counter, count); } - set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, - &grp->bb_state); } } From patchwork Tue May 29 11:45:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 922016 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="A3oJp5w/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40wBk14R3nz9s0q for ; Tue, 29 May 2018 21:45:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933357AbeE2Lp3 (ORCPT ); Tue, 29 May 2018 07:45:29 -0400 Received: from mail-pg0-f65.google.com ([74.125.83.65]:40701 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933158AbeE2Lp1 (ORCPT ); Tue, 29 May 2018 07:45:27 -0400 Received: by mail-pg0-f65.google.com with SMTP id l2-v6so6476350pgc.7 for ; Tue, 29 May 2018 04:45:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0XsI3k0V+ojQUhMAvP6ANBRFbRzsmIvQJ/AK4ch5yCQ=; b=A3oJp5w/QxETdHkqkxM5DOU3mSUC4Qm7l8Xf42UYdntlTJKLLEmiERp/TYuZz/0DOi JPjzi731uuJTi+CW4SWCU7+trwaEoABMvIgaVBNJ9Qwoj3NQ9IHR2ssW50BxKzv4y+md l0iXLSCaiSVGhZMHjUY/Mh8plrNhABTFBtQQhr1A/DLKXbcGMVtVvbURsfj1xOi4sgXl /RhlfrKeTw/nhbAKEp8tBXr20iGP/v8aJCcDBet47OFxWIQ8Trt4r4MtdKvnqj6MMzxe NiFsFFyk8ccbBOJesdgvQiytP6V4SbQuTyTf3K8jWVIcIFP5syEZmuqb5iUIKjzxFG2N oIvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0XsI3k0V+ojQUhMAvP6ANBRFbRzsmIvQJ/AK4ch5yCQ=; b=bKCqGa7fFOWZ7jTpE4ZDBSYcqe/iakIuaK0K9fK0bU4WKrqiIuHK/mMsJ0d6fRHPym 3kWnEWOE2A0C9H7I7YKgdEuQM307OutLvPJBw7APrdW1EMM3Mhz+s8jvqsS/6FFe6Pz2 GJTVgHvFw2MFpcFPRXj1eKWvIkSC99hp42XuFagGNQ/SUq5Exi504m5bdwtCleJB2jFv UWR2q0nkX9IVdc6lxvjEIDjfvJKOUqoqmyjOYBrZX037eJUxENliezQfc7R97UfOFnV1 nzc6pGfwPHGL1MGclc4qKr5y8glgW6xqFL3PBkWDA1vx6lAJ3xCrqQebwnALNSXOgHaq PbYw== X-Gm-Message-State: ALKqPwejdm3MOPZ0Lxrt0JXJcKiCxIRnupx6Xzi6kH/wCuSx1D9gBPxk gCXN57Fr9LE2hTADQfR0Fb1QMQ== X-Google-Smtp-Source: ADUXVKKeydlJcKb+5qwNjJF5W8WaEEMZq3azAOdPwT5LLkeppbom9UlbHqcFytSErkyLA+Xdu2LPDQ== X-Received: by 2002:a63:bc0a:: with SMTP id q10-v6mr9313355pge.70.1527594326333; Tue, 29 May 2018 04:45:26 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id s16-v6sm51226151pfm.114.2018.05.29.04.45.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 May 2018 04:45:25 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: andreas.dilger@intel.com, sihara@ddn.com, wshilong@ddn.com Subject: [PATCH resend 2/5] ext4: wrap error handling and corrupted bitmaps setting Date: Tue, 29 May 2018 20:45:14 +0900 Message-Id: <1527594317-9214-2-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> References: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong Cleanup to handle ext4 error codes together with bitmaps corrupted bits setting. Signed-off-by: Wang Shilong Reviewed-by: Andreas Dilger --- fs/ext4/balloc.c | 28 +++++++++++++++------------- fs/ext4/ext4.h | 35 ++++++++++++++++++++++++----------- fs/ext4/ialloc.c | 37 +++++++++++++++++++------------------ fs/ext4/mballoc.c | 20 ++++++++------------ fs/ext4/super.c | 11 +++++++---- 5 files changed, 73 insertions(+), 58 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index b00481c..e3feeae 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -191,7 +191,7 @@ static int ext4_init_block_bitmap(struct super_block *sb, /* If checksum is bad mark all blocks used to prevent allocation * essentially implementing a per-group read-only flag. */ if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) { - ext4_mark_group_bitmap_corrupted(sb, block_group, + __ext4_mark_group_bitmap_corrupted(sb, block_group, EXT4_GROUP_INFO_BBITMAP_CORRUPT | EXT4_GROUP_INFO_IBITMAP_CORRUPT); return -EFSBADCRC; @@ -375,18 +375,19 @@ static int ext4_validate_block_bitmap(struct super_block *sb, 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); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); + EXT4_GROUP_INFO_BBITMAP_CORRUPT, + "bg %u: bad block bitmap checksum", + block_group); return -EFSBADCRC; } blk = ext4_valid_block_bitmap(sb, desc, block_group, bh); if (unlikely(blk != 0)) { ext4_unlock_group(sb, block_group); - ext4_error(sb, "bg %u: block %llu: invalid block bitmap", - block_group, blk); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); + EXT4_GROUP_INFO_BBITMAP_CORRUPT, + "bg %u: block %llu: invalid block bitmap", + block_group, blk); return -EFSCORRUPTED; } set_buffer_verified(bh); @@ -419,10 +420,10 @@ struct buffer_head * bitmap_blk = ext4_block_bitmap(sb, desc); if ((bitmap_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) || (bitmap_blk >= ext4_blocks_count(sbi->s_es))) { - ext4_error(sb, "Invalid block bitmap block %llu in " - "block_group %u", bitmap_blk, block_group); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); + EXT4_GROUP_INFO_BBITMAP_CORRUPT, + "Invalid block bitmap block %llu in " + "block_group %u", bitmap_blk, block_group); return ERR_PTR(-EFSCORRUPTED); } bh = sb_getblk(sb, bitmap_blk); @@ -498,11 +499,12 @@ int ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group, return -EFSCORRUPTED; wait_on_buffer(bh); if (!buffer_uptodate(bh)) { - ext4_error(sb, "Cannot read block bitmap - " - "block_group = %u, block_bitmap = %llu", - block_group, (unsigned long long) bh->b_blocknr); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); + EXT4_GROUP_INFO_BBITMAP_CORRUPT, + "Cannot read block bitmap - " + "block_group = %u, block_bitmap = %llu", + block_group, + (unsigned long long)bh->b_blocknr); return -EIO; } clear_buffer_new(bh); diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index fa52b7d..ed5b988 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2530,9 +2530,9 @@ extern int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup); extern const char *ext4_decode_error(struct super_block *sb, int errno, char nbuf[16]); -extern void ext4_mark_group_bitmap_corrupted(struct super_block *sb, - ext4_group_t block_group, - unsigned int flags); +extern void __ext4_mark_group_bitmap_corrupted(struct super_block *sb, + ext4_group_t block_group, + unsigned int flags); extern __printf(4, 5) void __ext4_error(struct super_block *, const char *, unsigned int, @@ -2558,10 +2558,10 @@ extern __printf(3, 4) void __ext4_msg(struct super_block *, const char *, const char *, ...); extern void __dump_mmp_msg(struct super_block *, struct mmp_struct *mmp, const char *, unsigned int, const char *); -extern __printf(7, 8) +extern __printf(8, 9) void __ext4_grp_locked_error(const char *, unsigned int, struct super_block *, ext4_group_t, - unsigned long, ext4_fsblk_t, + unsigned long, ext4_fsblk_t, unsigned int, const char *, ...); #define EXT4_ERROR_INODE(inode, fmt, a...) \ @@ -2591,9 +2591,16 @@ void __ext4_grp_locked_error(const char *, unsigned int, __ext4_msg(sb, level, fmt, ##__VA_ARGS__) #define dump_mmp_msg(sb, mmp, msg) \ __dump_mmp_msg(sb, mmp, __func__, __LINE__, msg) -#define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...) \ - __ext4_grp_locked_error(__func__, __LINE__, sb, grp, ino, block, \ - fmt, ##__VA_ARGS__) +#define ext4_grp_locked_error(sb, grp, ino, block, flags, fmt, ...) \ + __ext4_grp_locked_error(__func__, __LINE__, sb, grp, ino, block,\ + flags, fmt, ##__VA_ARGS__) +#define ext4_mark_group_bitmap_corrupted(sb, group, flags, fmt, ...) \ + do { \ + __ext4_error(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + __ext4_mark_group_bitmap_corrupted(sb, group, flags); \ + } while (0) + #else @@ -2634,11 +2641,17 @@ void __ext4_grp_locked_error(const char *, unsigned int, } while (0) #define dump_mmp_msg(sb, mmp, msg) \ __dump_mmp_msg(sb, mmp, "", 0, "") -#define ext4_grp_locked_error(sb, grp, ino, block, fmt, ...) \ +#define ext4_grp_locked_error(sb, grp, ino, block, flags, fmt, ...) \ do { \ - no_printk(fmt, ##__VA_ARGS__); \ - __ext4_grp_locked_error("", 0, sb, grp, ino, block, " "); \ + no_printk(fmt, ##__VA_ARGS__); \ + __ext4_grp_locked_error("", 0, sb, grp, ino, block, flags, " ");\ } while (0) +#define ext4_mark_group_bitmap_corrupted(sb, group, flags, fmt, ...) \ + do { \ + no_printk(fmt, ##__VA_ARGS__); \ + __ext4_error(sb, "", 0, " "); \ + __ext4_mark_group_bitmap_corrupted(sb, group, flags); \ + } while (0) #endif diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 4d6e007..b7f7299 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -94,10 +94,10 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, if (!ext4_inode_bitmap_csum_verify(sb, block_group, desc, bh, EXT4_INODES_PER_GROUP(sb) / 8)) { ext4_unlock_group(sb, block_group); - ext4_error(sb, "Corrupt inode bitmap - block_group = %u, " - "inode_bitmap = %llu", block_group, blk); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "Corrupt inode bitmap - block_group = %u, " + "inode_bitmap = %llu", block_group, blk); return -EFSBADCRC; } set_buffer_verified(bh); @@ -127,10 +127,10 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, bitmap_blk = ext4_inode_bitmap(sb, desc); if ((bitmap_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) || (bitmap_blk >= ext4_blocks_count(sbi->s_es))) { - ext4_error(sb, "Invalid inode bitmap blk %llu in " - "block_group %u", bitmap_blk, block_group); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "Invalid inode bitmap blk %llu in " + "block_group %u", bitmap_blk, block_group); return ERR_PTR(-EFSCORRUPTED); } bh = sb_getblk(sb, bitmap_blk); @@ -182,11 +182,11 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, wait_on_buffer(bh); if (!buffer_uptodate(bh)) { put_bh(bh); - ext4_error(sb, "Cannot read inode bitmap - " - "block_group = %u, inode_bitmap = %llu", - block_group, bitmap_blk); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "Cannot read inode bitmap - " + "block_group = %u, inode_bitmap = %llu", + block_group, bitmap_blk); return ERR_PTR(-EIO); } @@ -333,9 +333,10 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) if (!fatal) fatal = err; } else { - ext4_error(sb, "bit already cleared for inode %lu", ino); ext4_mark_group_bitmap_corrupted(sb, block_group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "bit already cleared for inode %lu", + ino); } error_return: @@ -904,10 +905,10 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir, goto next_group; if (group == 0 && (ino + 1) < EXT4_FIRST_INO(sb)) { - ext4_error(sb, "reserved inode found cleared - " - "inode=%lu", ino + 1); ext4_mark_group_bitmap_corrupted(sb, group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "reserved inode found cleared - " + "inode=%lu", ino + 1); goto next_group; } @@ -1097,10 +1098,10 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir, * twice. */ err = -EIO; - ext4_error(sb, "failed to insert inode %lu: doubly allocated?", - inode->i_ino); ext4_mark_group_bitmap_corrupted(sb, group, - EXT4_GROUP_INFO_IBITMAP_CORRUPT); + EXT4_GROUP_INFO_IBITMAP_CORRUPT, + "failed to insert inode %lu: doubly allocated?", + inode->i_ino); goto out; } inode->i_generation = prandom_u32(); diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 243c42f..3680623 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -467,11 +467,10 @@ static void mb_free_blocks_double(struct inode *inode, struct ext4_buddy *e4b, ext4_grp_locked_error(sb, e4b->bd_group, inode ? inode->i_ino : 0, blocknr, + EXT4_GROUP_INFO_BBITMAP_CORRUPT, "freeing block already freed " "(bit %u)", first + i); - ext4_mark_group_bitmap_corrupted(sb, e4b->bd_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); } mb_clear_bit(first + i, e4b->bd_info->bb_bitmap); } @@ -741,6 +740,7 @@ void ext4_mb_generate_buddy(struct super_block *sb, if (free != grp->bb_free) { ext4_grp_locked_error(sb, group, 0, 0, + EXT4_GROUP_INFO_BBITMAP_CORRUPT, "block bitmap and bg descriptor " "inconsistent: %u vs %u free clusters", free, grp->bb_free); @@ -749,8 +749,6 @@ void ext4_mb_generate_buddy(struct super_block *sb, * corrupt and update bb_free using bitmap value */ grp->bb_free = free; - ext4_mark_group_bitmap_corrupted(sb, group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); } mb_set_largest_free_order(sb, grp); @@ -1451,11 +1449,10 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b, ext4_grp_locked_error(sb, e4b->bd_group, inode ? inode->i_ino : 0, blocknr, + EXT4_GROUP_INFO_BBITMAP_CORRUPT, "freeing already freed block " "(bit %u); block bitmap corrupt.", block); - ext4_mark_group_bitmap_corrupted(sb, e4b->bd_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); mb_regenerate_buddy(e4b); goto done; } @@ -1949,11 +1946,10 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, * we have free blocks */ ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, + EXT4_GROUP_INFO_BBITMAP_CORRUPT, "%d free clusters as per " "group info. But bitmap says 0", free); - ext4_mark_group_bitmap_corrupted(sb, e4b->bd_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); break; } @@ -1961,11 +1957,10 @@ void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, BUG_ON(ex.fe_len <= 0); if (free < ex.fe_len) { ext4_grp_locked_error(sb, e4b->bd_group, 0, 0, + EXT4_GROUP_INFO_BBITMAP_CORRUPT, "%d free clusters as per " "group info. But got %d blocks", free, ex.fe_len); - ext4_mark_group_bitmap_corrupted(sb, e4b->bd_group, - EXT4_GROUP_INFO_BBITMAP_CORRUPT); /* * The number of free blocks differs. This mostly * indicate that the bitmap is corrupt. So exit @@ -3850,7 +3845,8 @@ static int ext4_mb_new_preallocation(struct ext4_allocation_context *ac) pa, (unsigned long) pa->pa_lstart, (unsigned long) pa->pa_pstart, (unsigned long) pa->pa_len); - ext4_grp_locked_error(sb, group, 0, 0, "free %u, pa_free %u", + ext4_grp_locked_error(sb, group, 0, 0, 0, + "free %u, pa_free %u", free, pa->pa_free); /* * pa is already deleted so we use the value obtained @@ -4678,7 +4674,7 @@ static void ext4_try_merge_freed_extent(struct ext4_sb_info *sbi, else { ext4_grp_locked_error(sb, group, 0, ext4_group_first_block_no(sb, group) + - EXT4_C2B(sbi, cluster), + EXT4_C2B(sbi, cluster), 0, "Block already on to-be-freed list"); return 0; } diff --git a/fs/ext4/super.c b/fs/ext4/super.c index d6fa6cf..554bceb 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -709,7 +709,7 @@ void __ext4_warning_inode(const struct inode *inode, const char *function, void __ext4_grp_locked_error(const char *function, unsigned int line, struct super_block *sb, ext4_group_t grp, unsigned long ino, ext4_fsblk_t block, - const char *fmt, ...) + unsigned int flags, const char *fmt, ...) __releases(bitlock) __acquires(bitlock) { @@ -740,6 +740,9 @@ void __ext4_grp_locked_error(const char *function, unsigned int line, va_end(args); } + if (flags) + __ext4_mark_group_bitmap_corrupted(sb, grp, flags); + if (test_opt(sb, ERRORS_CONT)) { ext4_commit_super(sb, 0); return; @@ -763,9 +766,9 @@ void __ext4_grp_locked_error(const char *function, unsigned int line, return; } -void ext4_mark_group_bitmap_corrupted(struct super_block *sb, - ext4_group_t group, - unsigned int flags) +void __ext4_mark_group_bitmap_corrupted(struct super_block *sb, + ext4_group_t group, + unsigned int flags) { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_group_info *grp = ext4_get_group_info(sb, group); From patchwork Tue May 29 11:45:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 922017 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mqAG0CUY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40wBk43Fmcz9s0q for ; Tue, 29 May 2018 21:45:32 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933366AbeE2Lpb (ORCPT ); Tue, 29 May 2018 07:45:31 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:33840 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933158AbeE2Lp3 (ORCPT ); Tue, 29 May 2018 07:45:29 -0400 Received: by mail-pl0-f68.google.com with SMTP id ay10-v6so8811657plb.1 for ; Tue, 29 May 2018 04:45:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Pcvq5Xk+gd+PfsqwcZXK/tiNSXYACW3h6qJBQ5jgVLM=; b=mqAG0CUYROiA9pf0tIlEuvQdpEh2UH82KLxA4pTUSU/c2K0jTizoR1sBfpQiUK9F/I bExz/3e4h2riL3zjvlcNe5esJDiLVmIBtOU9umXoHYHw9l3KQ2mrawqwgJXIJXK7EwOg 438kw2lDBFYuz/8Wvvlz9+wttsX4OziCpBWmOL+PvGX2QEx8e1s+C9soEqD1nC62EeAn Wugd/3KBL37xw3VW9CyWFNGjWTbKeMqrsZ8Hc6GjS/RCGuMkizIzi8cmd6JgMiStNOvr cuGmlXHypZ/tDjepd33McXEp2ijic7HyFYPmcFH3/Mfch2Ni6EpOrkqXZiAouu0PJOT5 +MRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Pcvq5Xk+gd+PfsqwcZXK/tiNSXYACW3h6qJBQ5jgVLM=; b=W9dTNTF2EYc4LucKp/jaoUzlLhhqFj/YdT3BlHbABCThH6A2pqMHgqObyupgE6Kwwm fi5ZXhum5Mrr/fFVifAn4FvdyMXSkJnvj7FXN3PZjUZlnyVCQ3FRnHjgoW+cWim1oFTp JBotNwuV1mr/uuNbyyoSBkBJgCIs0X1L9NuWwO8D4/mvXbADgZl1BAcHpWzLIRlqptx6 Lh4ZOX5LDRjDy9bGO3+3gh/baDwrndcs69zX+49uYWfs1L0I5RmX9jYrvFLcwVz6XxFb uTLEwWctSsIJiXBJdaAL/K2PRzDlZ/IKQuj+5LUfwoJvwuydRCtgnj94ZqvsVtmHK2CC enUQ== X-Gm-Message-State: ALKqPwf2AwsMBAqv7ps0+0jfv8RMGnOppMmmmQXQ1b6h3n9SLQYX8RoL moA6dZEMMUcvZ7gyDWezxDDnGA== X-Google-Smtp-Source: ADUXVKJzsJKE5jYoo2om1wk2Cvf+9HPhFifdaidv7PF4PzZDZzS3zooDPe5qgRpvu3Icoq8IrAwNZw== X-Received: by 2002:a17:902:b706:: with SMTP id d6-v6mr2027781pls.105.1527594328534; Tue, 29 May 2018 04:45:28 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id s16-v6sm51226151pfm.114.2018.05.29.04.45.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 May 2018 04:45:27 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: andreas.dilger@intel.com, sihara@ddn.com, wshilong@ddn.com Subject: [PATCH 3/5] ext4: optimize to reduce redundant ext4_error() Date: Tue, 29 May 2018 20:45:15 +0900 Message-Id: <1527594317-9214-3-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> References: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong only call ext4_error() if new corrupted bit set, this could save us repeated error messages and unecessary super block write. Suggested-by: Andreas Dilger Signed-off-by: Wang Shilong Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 25 ++++++++++++++++--------- fs/ext4/super.c | 14 ++++++++++---- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index ed5b988..26f8c12 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2530,9 +2530,9 @@ extern int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup); extern const char *ext4_decode_error(struct super_block *sb, int errno, char nbuf[16]); -extern void __ext4_mark_group_bitmap_corrupted(struct super_block *sb, - ext4_group_t block_group, - unsigned int flags); +extern int __ext4_mark_group_bitmap_corrupted(struct super_block *sb, + ext4_group_t block_group, + unsigned int flags); extern __printf(4, 5) void __ext4_error(struct super_block *, const char *, unsigned int, @@ -2596,9 +2596,12 @@ void __ext4_grp_locked_error(const char *, unsigned int, flags, fmt, ##__VA_ARGS__) #define ext4_mark_group_bitmap_corrupted(sb, group, flags, fmt, ...) \ do { \ - __ext4_error(sb, __func__, __LINE__, \ - fmt, ##__VA_ARGS__); \ - __ext4_mark_group_bitmap_corrupted(sb, group, flags); \ + int ret; \ + ret = __ext4_mark_group_bitmap_corrupted(sb, group, \ + flags); \ + if (ret) \ + __ext4_error(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ } while (0) @@ -2648,9 +2651,13 @@ void __ext4_grp_locked_error(const char *, unsigned int, } while (0) #define ext4_mark_group_bitmap_corrupted(sb, group, flags, fmt, ...) \ do { \ - no_printk(fmt, ##__VA_ARGS__); \ - __ext4_error(sb, "", 0, " "); \ - __ext4_mark_group_bitmap_corrupted(sb, group, flags); \ + int ret; \ + ret = __ext4_mark_group_bitmap_corrupted(sb, group, \ + flags); \ + if (ret) { \ + no_printk(fmt, ##__VA_ARGS__); \ + __ext4_error(sb, "", 0, " "); \ + } \ } while (0) #endif diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 554bceb..9f88991 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -766,21 +766,24 @@ void __ext4_grp_locked_error(const char *function, unsigned int line, return; } -void __ext4_mark_group_bitmap_corrupted(struct super_block *sb, - ext4_group_t group, - unsigned int flags) +int __ext4_mark_group_bitmap_corrupted(struct super_block *sb, + ext4_group_t group, + unsigned int flags) { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_group_info *grp = ext4_get_group_info(sb, group); struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL); int ret; + int set = 0; if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) { ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); - if (!ret) + if (!ret) { percpu_counter_sub(&sbi->s_freeclusters_counter, grp->bb_free); + set = 1; + } } if (flags & EXT4_GROUP_INFO_IBITMAP_CORRUPT) { @@ -792,8 +795,11 @@ void __ext4_mark_group_bitmap_corrupted(struct super_block *sb, count = ext4_free_inodes_count(sb, gdp); percpu_counter_sub(&sbi->s_freeinodes_counter, count); + set = 1; } } + + return set; } void ext4_update_dynamic_rev(struct super_block *sb) From patchwork Tue May 29 11:45:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 922018 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="TiYldbpg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40wBk56Qnxz9s0q for ; Tue, 29 May 2018 21:45:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933362AbeE2Lpd (ORCPT ); Tue, 29 May 2018 07:45:33 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:41705 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933363AbeE2Lpb (ORCPT ); Tue, 29 May 2018 07:45:31 -0400 Received: by mail-pg0-f68.google.com with SMTP id d14-v6so6479571pgv.8 for ; Tue, 29 May 2018 04:45:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7zDmcRcjTUQU+mL8pkRTkthvGoViR16CsGOg+3fYxxY=; b=TiYldbpgZsW7zvLU9MG9dH2wBfUB219WR4gICuFaQgT32sV58ipt5W/UXYhMlm7bvv UNBnUO2jqUqXb5vfzS+igNVcoKhENbRiqzUXbNZmjogZ/WeZP/zFkh88VUDNxykR6NOT IO194OW/6yu+zUUa6OUichLFmP3KNresP6uCf2i3s6xCVxjLzswo/a9pgLw67NLwu7U2 jA6T2Cs0EWYo8uEo58ySdGsR3M4lADm1+r/Int3aiyOzpMkuCzWWKSpyqBumHi/SetMo qRVlt4xcU8PnR+0jiLiE1dIUVfcVVhcAHgFhARG8E2GhIoPM0XBJlPG4Y4Otbry0lf5T KUdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7zDmcRcjTUQU+mL8pkRTkthvGoViR16CsGOg+3fYxxY=; b=BspVNWXKzGI62dz7eyFQm3/sAmexD5pRiU0hjU7BgM8S/CYMfGNDmJ2fRY0PcBc6WK aFYOI9KRcW8QKFKMggI/cRw2hIMSPZ7YHuAxZ4ycoVdne7M/GvzfaX/zMqdyR4GwI6Cf G6+IrXAD3aXl64mwB5DJ004HT+qcPG2+OlqfmGJYyS6UANgU2wCJSayHky/krKpmI1cb qJA+stuPBL7uF5T24hXCj3bMPMmQ4VsYWQG0wtRWy+7DLv0k7tUwGx8pfKdYVv15i4WX ePe14w/4D6RWNsu7BR+Ih/XnlJx5sufNnMCuWnCJGiNPjnjQQ03gI2ck3aKr4xEIKjgc zuyw== X-Gm-Message-State: ALKqPwdNsxx76eUJlPubGEjWpnsbpSfZ1AqE+4VUJgE65asijVAd8eZ/ k7TsZMzvwd0INQdGlN4adKdMNA== X-Google-Smtp-Source: ADUXVKIwJOScCYY4uiPDIGonTBYpzgN6Y1pT4eeQBM8P8dD6mJjWjXOmayE3ciHqm8ua4FEpzYGuLA== X-Received: by 2002:a62:c45a:: with SMTP id y87-v6mr8481546pff.190.1527594330696; Tue, 29 May 2018 04:45:30 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id s16-v6sm51226151pfm.114.2018.05.29.04.45.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 May 2018 04:45:29 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: andreas.dilger@intel.com, sihara@ddn.com, wshilong@ddn.com Subject: [PATCH 4/5] ext4: use ext4_warning() for sb_getblk failure Date: Tue, 29 May 2018 20:45:16 +0900 Message-Id: <1527594317-9214-4-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> References: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong out of memory should not be considered as critical errors, replace ext4_warnig() instead of ext4_error() for it. Signed-off-by: Wang Shilong Reviewed-by: Andreas Dilger --- fs/ext4/balloc.c | 6 +++--- fs/ext4/ialloc.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index e3feeae..5fe63ff 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -428,9 +428,9 @@ struct buffer_head * } bh = sb_getblk(sb, bitmap_blk); if (unlikely(!bh)) { - ext4_error(sb, "Cannot get buffer for block bitmap - " - "block_group = %u, block_bitmap = %llu", - block_group, bitmap_blk); + ext4_warning(sb, "Cannot get buffer for block bitmap - " + "block_group = %u, block_bitmap = %llu", + block_group, bitmap_blk); return ERR_PTR(-ENOMEM); } diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index b7f7299..787b613 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -135,9 +135,9 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, } bh = sb_getblk(sb, bitmap_blk); if (unlikely(!bh)) { - ext4_error(sb, "Cannot read inode bitmap - " - "block_group = %u, inode_bitmap = %llu", - block_group, bitmap_blk); + ext4_warning(sb, "Cannot read inode bitmap - " + "block_group = %u, inode_bitmap = %llu", + block_group, bitmap_blk); return ERR_PTR(-ENOMEM); } if (bitmap_uptodate(bh)) From patchwork Tue May 29 11:45:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 922019 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FJ9rfvJZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40wBkB0Fhcz9s0W for ; Tue, 29 May 2018 21:45:38 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933376AbeE2Lph (ORCPT ); Tue, 29 May 2018 07:45:37 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:44833 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933367AbeE2Lpd (ORCPT ); Tue, 29 May 2018 07:45:33 -0400 Received: by mail-pl0-f68.google.com with SMTP id z9-v6so5458374plk.11 for ; Tue, 29 May 2018 04:45:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/0D2w79GJqvY4Ra2pkgHzwDFFdnHkmVDA7omofo6dzA=; b=FJ9rfvJZXIru+GugiXMvICAgUMFV+cWcJ43I+h+JBUEcaUL4o1rqqaFK5RRGywFrhY B0300xbNPYGm36ubQEZZM7g/r3mMgrNJwpRGWxzYjp0tm/IK4ZAub5e2ff4fLixAerl5 AZSWM08ZdqRVo8fau9WYuzWWzoJzNljDPIJ7l6qIcDjOcUBOyBm8isbo1KbccN/7Mvl9 adhe6pxTm43JNvUu+xtk2JZoN11FMRCyJnJ5crEQRnOthoxWpNjn3PMC+xV+p4yzA3Kf vPkOa7l/q0TFV8JHUMuUMc9YU0fI859shTDYNuJUuw0n9MfxskJF/8lzTwD8zpvM4d+f FJyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/0D2w79GJqvY4Ra2pkgHzwDFFdnHkmVDA7omofo6dzA=; b=XgRkLNg2LBCB9HYY/V5CKmoJyRM/gDPqXWrF5AZgonm84+zUhD7qmX7X8gbXG4AEQt 0ZpMsK/PS1VBdT1i7BXuvXXsWnLaLOY9xBgwvVGIwqow6I/f1nTy3JIk3YRzoqOtsA5f fm/DKUyeUg7YJGilExw7/ybmBPmLyNyKU04NcqQe9iQ4uVcE7ic3/7gEtjtkivlepyu7 Lc13cl+Sq7S1mE4aai0ROH4exVGB9/midknN7w2yMqXNGwFGaQ/vTw/O20DgsNkcvhNH qurvn8Hz/TqFgtGxi74jjsoCVpcQKQr3TCwAJLCvmxOxa/HPDuLzD7RbHwBa3KMAkRw2 iu2g== X-Gm-Message-State: ALKqPwfOG2/CGG1D3fG9RgTteZL40h+AHcuU8EP9Z6UEcRVdNI0+7A3w wRyRU6BjDUvkyAaXpS4rBGmpLw== X-Google-Smtp-Source: AB8JxZpZs0t3aosQ8axIGXkBBOZD44QZa0QA5rf3P4K5k23mcku7z2e4cvDCmO2WTmF+Xf9c8tWKdw== X-Received: by 2002:a17:902:d882:: with SMTP id b2-v6mr16728007plz.220.1527594332922; Tue, 29 May 2018 04:45:32 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id s16-v6sm51226151pfm.114.2018.05.29.04.45.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 May 2018 04:45:32 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: andreas.dilger@intel.com, sihara@ddn.com, wshilong@ddn.com Subject: [PATCH v2 5/5] ext4: add suppport to make bitmaps corruptions nonfatal Date: Tue, 29 May 2018 20:45:17 +0900 Message-Id: <1527594317-9214-5-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> References: <1527594317-9214-1-git-send-email-wshilong1991@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Wang Shilong Originally, we saw bitmaps corruptions on Lustre server, which could be ext4 bugs or disk corruptions, but currently ext4 use ext4_error() for this which make filesystem RO in default. Ext4 have handled bitmaps corruptions very well, use corrupted bit to isolate erros and prevent us any further allocations to this block group, add an mount option 'bitmaps=warn' for this which will record error state to superblock, and next offline e2fsck will fix inconsitency problems, this gurantee our Clusters usable with minimal risk. Suggested-by: Andreas Dilger Signed-off-by: Wang Shilong Reviewed-by: Andreas Dilger --- v1->v2: add mount option to control, don't leak fatal error that is not related to bitmap corruptions --- fs/ext4/balloc.c | 6 ++++-- fs/ext4/ext4.h | 27 +++++++++++++++++++++------ fs/ext4/mballoc.c | 45 +++++++++++++++++++++++---------------------- fs/ext4/super.c | 20 ++++++++++++++------ 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 5fe63ff..bef6ae8 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c @@ -451,8 +451,10 @@ struct buffer_head * ext4_unlock_group(sb, block_group); unlock_buffer(bh); if (err) { - ext4_error(sb, "Failed to init block bitmap for group " - "%u: %d", block_group, err); + if (!EXT4_MB_GRP_BBITMAP_CORRUPT( + ext4_get_group_info(sb, block_group))) + ext4_error(sb, "Failed to init block bitmap for group " + "%u: %d", block_group, err); goto out; } goto verify; diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 26f8c12..96c5c1c 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1113,6 +1113,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_BLOCK_VALIDITY 0x20000000 /* Block validity checking */ #define EXT4_MOUNT_DISCARD 0x40000000 /* Issue DISCARD requests */ #define EXT4_MOUNT_INIT_INODE_TABLE 0x80000000 /* Initialize uninitialized itables */ +#define EXT4_MOUNT_BITMAPS_WARN 0x100000000 /* warn on bitmaps corruptions */ /* * Mount flags set either automatically (could not be set by mount option) @@ -1338,7 +1339,7 @@ struct ext4_sb_info { struct buffer_head * s_sbh; /* Buffer containing the super block */ struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */ struct buffer_head **s_group_desc; - unsigned int s_mount_opt; + unsigned long long s_mount_opt; unsigned int s_mount_opt2; unsigned int s_mount_flags; unsigned int s_def_mount_opt; @@ -2563,6 +2564,8 @@ void __ext4_grp_locked_error(const char *, unsigned int, struct super_block *, ext4_group_t, unsigned long, ext4_fsblk_t, unsigned int, const char *, ...); +void save_error_info(struct super_block *sb, const char *func, + unsigned int line); #define EXT4_ERROR_INODE(inode, fmt, a...) \ ext4_error_inode((inode), __func__, __LINE__, 0, (fmt), ## a) @@ -2598,10 +2601,17 @@ void __ext4_grp_locked_error(const char *, unsigned int, do { \ int ret; \ ret = __ext4_mark_group_bitmap_corrupted(sb, group, \ - flags); \ - if (ret) \ - __ext4_error(sb, __func__, __LINE__, \ - fmt, ##__VA_ARGS__); \ + flags); \ + if (ret) { \ + if (test_opt(sb, BITMAPS_WARN)) { \ + __ext4_warning(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + save_error_info(sb, __func__, __LINE__);\ + } else { \ + __ext4_error(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + } \ + } \ } while (0) @@ -2656,7 +2666,12 @@ void __ext4_grp_locked_error(const char *, unsigned int, flags); \ if (ret) { \ no_printk(fmt, ##__VA_ARGS__); \ - __ext4_error(sb, "", 0, " "); \ + if (test_opt(sb, BITMAPS_WARN) { \ + __ext4_warning(sb, "", 0, " "); \ + save_error_info(sb, __func__, __LINE__);\ + } else { \ + __ext4_error(sb, "", 0, " "); \ + } \ } \ } while (0) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 3680623..1ee3138 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3907,15 +3907,16 @@ static int ext4_mb_new_preallocation(struct ext4_allocation_context *ac) bitmap_bh = ext4_read_block_bitmap(sb, group); if (IS_ERR(bitmap_bh)) { err = PTR_ERR(bitmap_bh); - ext4_error(sb, "Error %d reading block bitmap for %u", - err, group); return 0; } err = ext4_mb_load_buddy(sb, group, &e4b); if (err) { - ext4_warning(sb, "Error %d loading buddy information for %u", - err, group); + if (!EXT4_MB_GRP_BBITMAP_CORRUPT( + ext4_get_group_info(sb, group))) + ext4_warning(sb, + "Error %d loading buddy information for %u", + err, group); put_bh(bitmap_bh); return 0; } @@ -4075,16 +4076,17 @@ void ext4_discard_preallocations(struct inode *inode) err = ext4_mb_load_buddy_gfp(sb, group, &e4b, GFP_NOFS|__GFP_NOFAIL); if (err) { - ext4_error(sb, "Error %d loading buddy information for %u", - err, group); + if (!EXT4_MB_GRP_BBITMAP_CORRUPT( + ext4_get_group_info(sb, group))) + ext4_error(sb, + "Error %d loading buddy information for %u", + err, group); continue; } bitmap_bh = ext4_read_block_bitmap(sb, group); if (IS_ERR(bitmap_bh)) { err = PTR_ERR(bitmap_bh); - ext4_error(sb, "Error %d reading block bitmap for %u", - err, group); ext4_mb_unload_buddy(&e4b); continue; } @@ -4338,8 +4340,10 @@ static void ext4_mb_group_or_file(struct ext4_allocation_context *ac) err = ext4_mb_load_buddy_gfp(sb, group, &e4b, GFP_NOFS|__GFP_NOFAIL); if (err) { - ext4_error(sb, "Error %d loading buddy information for %u", - err, group); + if (!EXT4_MB_GRP_BBITMAP_CORRUPT( + ext4_get_group_info(sb, group))) + ext4_error(sb, "Error %d loading buddy information for %u", + err, group); continue; } ext4_lock_group(sb, group); @@ -4819,11 +4823,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, } count_clusters = EXT4_NUM_B2C(sbi, count); bitmap_bh = ext4_read_block_bitmap(sb, block_group); - if (IS_ERR(bitmap_bh)) { - err = PTR_ERR(bitmap_bh); - bitmap_bh = NULL; - goto error_return; - } + if (IS_ERR(bitmap_bh)) + return; gdp = ext4_get_group_desc(sb, block_group, &gd_bh); if (!gdp) { err = -EIO; @@ -5001,11 +5002,8 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, } bitmap_bh = ext4_read_block_bitmap(sb, block_group); - if (IS_ERR(bitmap_bh)) { - err = PTR_ERR(bitmap_bh); - bitmap_bh = NULL; - goto error_return; - } + if (IS_ERR(bitmap_bh)) + return PTR_ERR(bitmap_bh); desc = ext4_get_group_desc(sb, block_group, &gd_bh); if (!desc) { @@ -5168,8 +5166,11 @@ static int ext4_trim_extent(struct super_block *sb, int start, int count, ret = ext4_mb_load_buddy(sb, group, &e4b); if (ret) { - ext4_warning(sb, "Error %d loading buddy information for %u", - ret, group); + if (!EXT4_MB_GRP_BBITMAP_CORRUPT( + ext4_get_group_info(sb, group))) + ext4_warning(sb, + "Error %d loading buddy information for %u", + ret, group); return ret; } bitmap = e4b.bd_bitmap; diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 9f88991..63f40ae 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -342,8 +342,8 @@ static void __save_error_info(struct super_block *sb, const char *func, le32_add_cpu(&es->s_error_count, 1); } -static void save_error_info(struct super_block *sb, const char *func, - unsigned int line) +void save_error_info(struct super_block *sb, const char *func, + unsigned int line) { __save_error_info(sb, func, line); ext4_commit_super(sb, 1); @@ -743,7 +743,8 @@ void __ext4_grp_locked_error(const char *function, unsigned int line, if (flags) __ext4_mark_group_bitmap_corrupted(sb, grp, flags); - if (test_opt(sb, ERRORS_CONT)) { + if (test_opt(sb, ERRORS_CONT) || + (flags && test_opt(sb, BITMAPS_WARN))) { ext4_commit_super(sb, 0); return; } @@ -1373,7 +1374,8 @@ static struct dquot **ext4_get_dquots(struct inode *inode) }; enum { - Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid, + Opt_bsd_df, Opt_minix_df, Opt_bitmaps_warn, + Opt_bitmaps_err, Opt_grpid, Opt_nogrpid, Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro, Opt_nouid32, Opt_debug, Opt_removed, Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, @@ -1398,6 +1400,8 @@ enum { static const match_table_t tokens = { {Opt_bsd_df, "bsddf"}, {Opt_minix_df, "minixdf"}, + {Opt_bitmaps_warn, "bitmaps=warn"}, + {Opt_bitmaps_err, "bitmaps=error"}, {Opt_grpid, "grpid"}, {Opt_grpid, "bsdgroups"}, {Opt_nogrpid, "nogrpid"}, @@ -1598,11 +1602,13 @@ static int clear_qf_name(struct super_block *sb, int qtype) static const struct mount_opts { int token; - int mount_opt; + unsigned long long mount_opt; int flags; } ext4_mount_opts[] = { {Opt_minix_df, EXT4_MOUNT_MINIX_DF, MOPT_SET}, {Opt_bsd_df, EXT4_MOUNT_MINIX_DF, MOPT_CLEAR}, + {Opt_bitmaps_warn, EXT4_MOUNT_BITMAPS_WARN, MOPT_SET}, + {Opt_bitmaps_err, EXT4_MOUNT_BITMAPS_WARN, MOPT_CLEAR}, {Opt_grpid, EXT4_MOUNT_GRPID, MOPT_SET}, {Opt_nogrpid, EXT4_MOUNT_GRPID, MOPT_CLEAR}, {Opt_block_validity, EXT4_MOUNT_BLOCK_VALIDITY, MOPT_SET}, @@ -2099,6 +2105,8 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb, SEQ_OPTS_PUTS("errors=continue"); if (test_opt(sb, ERRORS_PANIC) && def_errors != EXT4_ERRORS_PANIC) SEQ_OPTS_PUTS("errors=panic"); + if (test_opt(sb, BITMAPS_WARN)) + SEQ_OPTS_PUTS("bitmaps=warn"); if (nodefs || sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) SEQ_OPTS_PRINT("commit=%lu", sbi->s_commit_interval / HZ); if (nodefs || sbi->s_min_batch_time != EXT4_DEF_MIN_BATCH_TIME) @@ -2197,7 +2205,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, done: if (test_opt(sb, DEBUG)) printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " - "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", + "bpg=%lu, ipg=%lu, mo=%04llx, mo2=%04x]\n", sb->s_blocksize, sbi->s_groups_count, EXT4_BLOCKS_PER_GROUP(sb),