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); } }