From nobody Sun Feb 8 21:26:24 2026 Received: from mail-qt1-f169.google.com (mail-qt1-f169.google.com [209.85.160.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75BE71FB5; Mon, 18 Mar 2024 13:58:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710770308; cv=none; b=j44jQo67WeGzfjAEy9Ns/zB/ntnlhY1/e40/Lfs6IZYiIv+EPQh88xGwG2Ry/5DtppQJyPjzj5f7UDBIGwMx5ZZ5Eaq4Tfv8OJGvnclBB0GgZdAi/liLLF/Isrf1AzO25IuwJOet/5MkeHf2/Abwj7xtTEgF7VHp/aGNFtwcLO4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710770308; c=relaxed/simple; bh=dMzvUM/Zbk0FRaGMA8aUc9LdTr/8ok38DpH/D1CcH7w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s/pp3IAz51l8lVMwCtQrzCwpdYYmCRskgLOKJ2Wjx5Hd8V+vWahJU1fw+69ZruEdScjo7hq2jWDwWLavL8G5J1wF4OrAVNv0sLGcBMe745h1bKSUH2hjDK93ctsve6hBDhpPGaIqzpzPmruronsHHJhlb+7fs1mJCPE8LYajCtg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tavianator.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=j62AnLKj; arc=none smtp.client-ip=209.85.160.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tavianator.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="j62AnLKj" Received: by mail-qt1-f169.google.com with SMTP id d75a77b69052e-430b74c17aaso20039691cf.3; Mon, 18 Mar 2024 06:58:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710770305; x=1711375105; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=OSQCQqKJBFx+iU5VU2VdeBmE+xqs6g28IL9eUgwBny0=; b=j62AnLKjHYuGGTsKsuqX843rh1fE8PyBjRZuvROItJbj1zfcQLVtp7NdUC0VufPiBz F6Xm8i5FWbtg+KiPTzGaMh80kKwLB4OZc7sgt6qjDk7K/qzdtkozvJIxjhjjcRDoXaha XIpgZ4JBuXiN3jbBERQcgyPtGqXGI6Tc637BGKXKEeeJgCXorss1AIDx/Ow5JDy4QS/W Ah2A2jBBmNnz8lOXbWwMImX/QCSl+tSauaGcjd41dL0AUP6vn63igf6ldYcV1tpSYFwm BvpApH8KEZd0Sio9zwfd1q0F6Czn3HxwevSP8N5lBXHJsCBofAMMboqNGZHtfOIeK3y+ w+pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710770305; x=1711375105; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=OSQCQqKJBFx+iU5VU2VdeBmE+xqs6g28IL9eUgwBny0=; b=QDyhHey2W6Qb4zTwx/BA1U6I6mandOj73783gnn3UMYLxB27ctq2ax7+ulhJb6Kj9C OYo/d7zv3LlQ9YkwRKWWnuOg7SadALWoxJXslxZqhw1bWkoSzHBUVBh5ugX6RkpWxHbL 2YZ9smvYhmsIEumX1L9ERbamfiUi7jGQ0a9zkAA+INM3YZ3Ja2zlyy46N0pPOSoMiEcT gEpRYNCr/PNTKIHRwH7/VMLMXlbtHCRiJ7xD+9aw9FH9pUbbnBEFUtF2l/3BoRi77iku 4j8KxjmOIK2K30vy9sTE7DLufrENZBNZsyKGqyq2RjAegLXrWutNKLjj5McGAvi2g0WA l57Q== X-Forwarded-Encrypted: i=1; AJvYcCXE776rH/mK6dqIsID4XmJ4yUAL9w/vHuJODX1D6g4xUxDGsOcvfxAVAsHhAK3s81rNDJlPjm1kMyLJ/FUZhWH/Iqq3aoLInoeO824v X-Gm-Message-State: AOJu0YxwceSp0wed0KBpneg4Ck8momfRBiMKDL4L83Ai1NWMRCZKFt+c C2E0lqnXyMQE7bDfSoKVeXtsbFRWOjIHkzCy6W1GrqiJfezDTXd59/eemZCCNPk= X-Google-Smtp-Source: AGHT+IFhF8g12nvXu9MYrIAAp0yqglL1lD+sx/8oN0Aj6o2yi5MBFlI3Rv/pmFmqrwTkXgYoVpcUZw== X-Received: by 2002:ac8:5d07:0:b0:42d:ff64:edf with SMTP id f7-20020ac85d07000000b0042dff640edfmr14931760qtx.7.1710770305122; Mon, 18 Mar 2024 06:58:25 -0700 (PDT) Received: from tachyon.tail92c87.ts.net ([192.159.180.233]) by smtp.gmail.com with ESMTPSA id fb19-20020a05622a481300b004309cf16815sm1284968qtb.39.2024.03.18.06.58.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Mar 2024 06:58:24 -0700 (PDT) Sender: Tavian Barnes From: Tavian Barnes To: linux-btrfs@vger.kernel.org Cc: Qu Wenruo , Tavian Barnes , Chris Mason , Josef Bacik , David Sterba , linux-kernel@vger.kernel.org Subject: [PATCH 1/2] btrfs: New helper to clear EXTENT_BUFFER_READING Date: Mon, 18 Mar 2024 09:56:53 -0400 Message-ID: <477327c2e21e253b56261f504a91603419bb167a.1710769876.git.tavianator@tavianator.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We are clearing the bit and waking up any waiters in two different places. Factor that code out into a static helper function. Signed-off-by: Tavian Barnes Reviewed-by: Qu Wenruo --- fs/btrfs/extent_io.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 61594eaf1f89..46173dcfde4f 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -4270,6 +4270,13 @@ void set_extent_buffer_uptodate(struct extent_buffer= *eb) } } =20 +static void clear_extent_buffer_reading(struct extent_buffer *eb) +{ + clear_bit(EXTENT_BUFFER_READING, &eb->bflags); + smp_mb__after_atomic(); + wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); +} + static void end_bbio_meta_read(struct btrfs_bio *bbio) { struct extent_buffer *eb =3D bbio->private; @@ -4304,9 +4311,7 @@ static void end_bbio_meta_read(struct btrfs_bio *bbio) bio_offset +=3D len; } =20 - clear_bit(EXTENT_BUFFER_READING, &eb->bflags); - smp_mb__after_atomic(); - wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); + clear_extent_buffer_reading(eb); free_extent_buffer(eb); =20 bio_put(&bbio->bio); @@ -4340,9 +4345,7 @@ int read_extent_buffer_pages(struct extent_buffer *eb= , int wait, int mirror_num, * will now be set, and we shouldn't read it in again. */ if (unlikely(test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))) { - clear_bit(EXTENT_BUFFER_READING, &eb->bflags); - smp_mb__after_atomic(); - wake_up_bit(&eb->bflags, EXTENT_BUFFER_READING); + clear_extent_buffer_reading(eb); return 0; } =20 --=20 2.44.0 From nobody Sun Feb 8 21:26:24 2026 Received: from mail-yw1-f173.google.com (mail-yw1-f173.google.com [209.85.128.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 997261FB5; Mon, 18 Mar 2024 13:58:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710770313; cv=none; b=ZdAd/lujRntp6MheGivVDpWjjgD3ydI4+MSlITcGVJpaooC+VuU16E84GAmMx2w4p7bD1Mxc7s7wT3El6TiOwNDDTpeCxYjAeE7E3IusaiKr503D/Mu0z1sRioDM6mRBa/rGv+g05TxoPLvOMRv/2pAD9qHmLZoI13f4PnPxqHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710770313; c=relaxed/simple; bh=eB04OzSDrJFDMctU4Yo/iuNMA5Z11xezlqp2LkCz0r8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uTaoC/y/MnKakZb6BHXfrkD3YwisAr3+lMImGdPhQttNFMtysjQeAvC9bi/4glWan9az7uvImE2CWpZLqfkhH4GpU8HMTvb/IPZ5uVaveT8lyUJhvZ0bCFArSFwcRIjMi8hcZ8qU7i3fCWGwVAwNiyk/9m4ZaY2h8YViZsGZsDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tavianator.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=O5TC5Ti+; arc=none smtp.client-ip=209.85.128.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tavianator.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O5TC5Ti+" Received: by mail-yw1-f173.google.com with SMTP id 00721157ae682-609ed7ca444so39234847b3.1; Mon, 18 Mar 2024 06:58:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710770310; x=1711375110; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=ZStTB8xWLWeRyPf5uT+m6Noea+dBMOeNlRQSdVaAxIQ=; b=O5TC5Ti+NPDwmY5WKxOqcwp3X87RhDcc9bDLRrjCPCAIZPO4UWFwXrO9AukmaN9pFa O2iSpDcln5YcZwVarNDm5wFUQmGPt2cL256nwcBHROFyJbfClF0AT5JJDKrdRnmM8awN xQy2ll9/wjegU9C6vQV/I9tHN89muClNpr3/2H/uC4FLKQwVB/MZIrK8z+j8mohuFuTP MLmbFnxehveDmjeqd1HWK/xQRZSNAORLdGrTiEo/89pQCriFH1N+5BkugR9P0ZSagGNz dzVXbog557jKEfQ7fR+7jgNImhFwg+U2MyNtEFpXPvV2mNfAPTGLVLxm/Vr3g5BcAiut lNgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710770310; x=1711375110; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZStTB8xWLWeRyPf5uT+m6Noea+dBMOeNlRQSdVaAxIQ=; b=k/HrJtnW9ZXJg/KzKBz8ULnEWHrdZr/JEc2iJ3vrK55R52mCkdESAR3EI9YOSoXCjI A04sWzOh7u3L5iXoMePDzORJTDpP0v1sYBdYcbY1678sEd7DlCKFXxsUPw7QeOTYWUk2 HrwKPIp5yobg3z4AOW0UXuORP0eH1TP76yWHb13F7OHiTz1zXxYC8lpP7pIviSmCzqTM CfgfrkNkQTjrbD/REdsdU3w3guygQEh2i7WoNA5t5uQRqw08pE7EBZ5b166vGbIePRQJ SEbVZCNyp9bdUnuaJqBEixgxauCQupnGozKtN2kQDafy/oCll/Ei/IJH8iB2LxtLSSb7 AsbA== X-Forwarded-Encrypted: i=1; AJvYcCVYwc2GPBcgItCWTmYiOuo/VGflFG/VVZ+evvGsEpMA073Pf+rCrswd25kF48AhF6KgNtaVvdyaD6+XOdLGxMk7MnTc6ot0a1jVo3rc X-Gm-Message-State: AOJu0YxlFgYpP0ZcX1prIfiKYx+0vU1IKIV3iafrgSZilEWy7g4/pN6C QbIJ2HC+odWQgvHxsVQ7p/smkmYW50VrceF+B0WO0dUIXn2jxz5qqv8cg7gUwko= X-Google-Smtp-Source: AGHT+IG5WAsd+Gw6up0vXetZbU01irGGgHkrT63t7bn2e3+IJ2qRDkfYSk1MKtWOFrzKyhKH1vWNTw== X-Received: by 2002:a81:9306:0:b0:609:fb70:2a96 with SMTP id k6-20020a819306000000b00609fb702a96mr12270162ywg.20.1710770310360; Mon, 18 Mar 2024 06:58:30 -0700 (PDT) Received: from tachyon.tail92c87.ts.net ([192.159.180.233]) by smtp.gmail.com with ESMTPSA id fb19-20020a05622a481300b004309cf16815sm1284968qtb.39.2024.03.18.06.58.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Mar 2024 06:58:30 -0700 (PDT) Sender: Tavian Barnes From: Tavian Barnes To: linux-btrfs@vger.kernel.org Cc: Qu Wenruo , Tavian Barnes , Chris Mason , Josef Bacik , David Sterba , linux-kernel@vger.kernel.org Subject: [PATCH 2/2] btrfs: WARN if EXTENT_BUFFER_UPTODATE is set while reading Date: Mon, 18 Mar 2024 09:56:54 -0400 Message-ID: X-Mailer: git-send-email 2.44.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We recently tracked down a race condition that triggered a read for an extent buffer with EXTENT_BUFFER_UPTODATE already set. While this read was in progress, other concurrent readers would see the UPTODATE bit and return early as if the read was already complete, making accesses to the extent buffer conflict with the read operation that was overwriting it. Add a WARN_ON() to end_bbio_meta_read() for this situation to make similar races easier to spot in the future. Signed-off-by: Tavian Barnes Reviewed-by: Qu Wenruo --- fs/btrfs/extent_io.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 46173dcfde4f..0024ea20bfc4 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -4285,6 +4285,13 @@ static void end_bbio_meta_read(struct btrfs_bio *bbi= o) struct folio_iter fi; u32 bio_offset =3D 0; =20 + /* + * If the extent buffer is marked UPTODATE before the read operation + * completes, other calls to read_extent_buffer_pages() will return + * early without waiting for the read to finish, causing data races. + */ + WARN_ON(test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags)); + eb->read_mirror =3D bbio->mirror_num; =20 if (uptodate && --=20 2.44.0