From patchwork Thu Apr 19 13:39:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 901129 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="iXH9lXV2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40Rg7w398cz9s27 for ; Thu, 19 Apr 2018 23:39:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753352AbeDSNjW (ORCPT ); Thu, 19 Apr 2018 09:39:22 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:43075 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753040AbeDSNjR (ORCPT ); Thu, 19 Apr 2018 09:39:17 -0400 Received: by mail-pf0-f196.google.com with SMTP id j11so2650701pff.10 for ; Thu, 19 Apr 2018 06:39:17 -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=uIJSJzJ4Rwfo90uLVkeSX77DmBDu8e5rqZ2jPBlO4Cc=; b=iXH9lXV2D+l31KRu9qaWJqO2WCEK6jN5Tl27X3agaQ6g+lEkVrxfXdbO7ahseG1259 DcyMH4FR8NEhfMv32Tjy/zWfn4XmDccuyt4lknPYGVn1czTF++fQhjk/ec3iwxweinBt oFN557uh9/lYUc4E1UhrX3CnFkZow1bDFGgI3KFXtHgywjzNDbVIvfastgNiH6SaI4ly pCLb6vIrhecmX/aciwQGX7ijTNwvjKDCBigDGEL2fOMw5ijTJ+Tdday7fcq/9MYS+6Uy zh0zfnHAY7jvEbxy16bU8a57PcwyEHcM9CaqYG7gSIdvAVhmcK5BLolI4hNQuHPaZtYX Pk9Q== 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=uIJSJzJ4Rwfo90uLVkeSX77DmBDu8e5rqZ2jPBlO4Cc=; b=B9xbixYKnIffZkn6sLEKPxNHwUrZ+CTftyidHjDjdJR9LLpr8MqcGKL038XJn3YRbx hu1KHzZpWP97x2mIPJW0+coTn6i0aOgvWQx8GEjnBxG1gCilx1aB5pAWCod84ozYiL9k DmiYfN6IwOpzeUjzMsH/fdrRqMt4pbYVppIgWwVCc4VxjunzHXwpW+6FkvnJZlbGfl9c g/rPNADVEfEPRP5vV38TNyO0sCpV60QjLADhtVq6crUFhiSbqpODza2QMYqYFZNCsZxc SaGan0ZiiIw3tpmyMzOord7Crp3agJ0PGfA5pWkuA0o0LVnBRj6AVThIMuZcAm/5Xr9L C2Ng== X-Gm-Message-State: ALQs6tCfngsdwab4WNmEJ0ZMHEe3EBSaixHhqcx/Yi1e5CenHvhhmC/6 mkmx7qzQBLbNag63APAp5BPFCw== X-Google-Smtp-Source: AIpwx4/9UIz/RNBJESPoqEBQWXvJya2h28DqDd9kpQtazniPwF+4HjxKocxQfM5PJUMdaJxws3hzdA== X-Received: by 10.99.117.20 with SMTP id q20mr3832545pgc.88.1524145156688; Thu, 19 Apr 2018 06:39:16 -0700 (PDT) Received: from localhost.localdomain (fs276ec80e.tkyc203.ap.nuro.jp. [39.110.200.14]) by smtp.gmail.com with ESMTPSA id z16sm6711176pfn.101.2018.04.19.06.39.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 19 Apr 2018 06:39:15 -0700 (PDT) From: Wang Shilong X-Google-Original-From: Wang Shilong To: linux-ext4@vger.kernel.org Cc: wshilong@ddn.com, adilger@dilger.ca, sihara@ddn.com, tytso@mit.edu Subject: [PATCH 2/2] ext4: don't RO for bitmaps error in default Date: Thu, 19 Apr 2018 22:39:06 +0900 Message-Id: <1524145146-18356-2-git-send-email-wshilong1991@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1524145146-18356-1-git-send-email-wshilong1991@gmail.com> References: <1524145146-18356-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 Once we hit bitmaps errors, Set corruppted bitmaps error bit will prevent us further allocation. Don't RO in default will make filesystem still usable and error state is recorded in superblock, next time offline e2fsck will fix errors. Suggested-by: Andreas Dilger Signed-off-by: Wang Shilong --- fs/ext4/ext4.h | 13 +++++++++---- fs/ext4/mballoc.c | 28 ++++++++++------------------ fs/ext4/super.c | 6 +++--- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index ed5b988d3f8e..0fa16de96d8a 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2563,6 +2563,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) @@ -2596,9 +2598,10 @@ 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); \ + __ext4_warning(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + save_error_info(sb, __func__, __LINE__); \ } while (0) @@ -2648,9 +2651,11 @@ do { \ } 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); \ + no_printk(fmt, ##__VA_ARGS__); \ + __ext4_warning(sb, __func__, __LINE__, \ + fmt, ##__VA_ARGS__); \ + save_error_info(sb, __func__, __LINE__); \ } while (0) #endif diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 065bce671de4..39ce56d76dd4 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3908,8 +3908,6 @@ ext4_mb_discard_group_preallocations(struct super_block *sb, 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; } @@ -4076,16 +4074,15 @@ 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); + ext4_warning(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; } @@ -4339,8 +4336,9 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb, 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); + ext4_warning(sb, + "Error %d loading buddy information for %u", + err, group); continue; } ext4_lock_group(sb, group); @@ -4820,11 +4818,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; @@ -5002,11 +4997,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) { diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 96981df03385..3ceda68344ae 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,7 @@ __acquires(bitlock) if (flags) __ext4_mark_group_bitmap_corrupted(sb, grp, flags); - if (test_opt(sb, ERRORS_CONT)) { + if (test_opt(sb, ERRORS_CONT) || flags) { ext4_commit_super(sb, 0); return; }