From nobody Mon Dec 1 22:02:39 2025 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (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 A7A412FFDD5 for ; Mon, 1 Dec 2025 09:05:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764579911; cv=none; b=n4nhMLjgFR3WvErjqGM2R56Gm09UNoaiE6Fs6iH/8nXaQ/x1BAHiaBvo1j0d3Dn19VGCdDMuAsiEtY0E68z2NAVKJTzEYC63zTJ7FhUUSP9YnfYuZE6Z76nRj+gnDsnPxnLv9IMK2tL4dV/Qwx6FB9RpVYwGex/4hHixqRUNk3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764579911; c=relaxed/simple; bh=aYxMtN+DE9oP1VlQcVa69Tb9BdLadbrZwyizizgybXw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UcidXhqXJ6mcnDYMf6qXWTiVHJBhQbAe/rjLnkSjbhFgj/E2spio2XbNeLWJOvNBNkSr6ZsdTVG54RpXlEdD9RsOROIs5bd+nxzrcyIuAdiv0wDl9vnsg2kH7C/5SNp4/rXFnHc+ZpK7/rPbsYePIuaU4NXjm31JZ6/HEOM9Vtk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OpcWBsdP; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.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="OpcWBsdP" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-bc0e89640b9so2595229a12.1 for ; Mon, 01 Dec 2025 01:05:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764579908; x=1765184708; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kyEEQJEWsLRxIUx0Z9OWCeFI3uMaF2jR+E58v4Ivl7s=; b=OpcWBsdPV1blfQTxLrrgkv7mt972nHHZPujPQeiAmtBgaDD9lSffyrUFaL7H00erFY w6b8OEIFvGc5QeDB1cqZOxYQ0mEIl5W3OH4/kGrW+P/8WlPqCR2N2zLYVZnYp2rUPxo5 MbjaeieBdZzU3XQwOrtVQPunCD05y2jtFmVfQs9uru8kQQOpbP/xGJxLzRfDwBtV09TR fNt2zis8X7m5gqhODtdMm/Nk14kS6T/6t9jyWN7xg82dDql3k2Bj1CA4rfbq7SbXiKIL z/Z+AOSxx/SwbMtyJxx71gN5J5QnDMNr1fCabzBLsygp0waTCGyU28764Oc2uyLNhwzR teRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764579908; x=1765184708; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kyEEQJEWsLRxIUx0Z9OWCeFI3uMaF2jR+E58v4Ivl7s=; b=I69M/DsfSwMUG+UWIW0xpy9y1aVIxaQwAm0g8QEa2JnmQB2aMAZCFyctbJHVaMQq9k TYfRF/0/f3hPVDTPdrNCW+XbBbgUyFc73dQfZBUpmuUFGvS4peUgGjYuJyQeyKL8VTh6 HIuqD7nWAqsnIb0vhDJ6RnyX8ZgBhIoyWh6FsBgjMmh4rZ3+3tDFuNy+ru+oRXGFUF1w naNC84kU45MHLH/xOB8YTDx+9DKUq9ymz7b78sw5q5//Ec3dFrgfNjHHliZc0wMdB90s WCWUFr5l1e8ZrZRFqXaKnoQpjdSntnWfCKvZcehxzWPBC2Jqs1799Z8mXjBqvmv70x2Q t/fQ== X-Forwarded-Encrypted: i=1; AJvYcCWIL2EQWzmcoASP3IK2iONWlDVecnna9udsJcvQe9sYddVX55BCRCDvswwFX1oVFshvCw6zBR6hmHZ/aKU=@vger.kernel.org X-Gm-Message-State: AOJu0YzwGpJ1yOquis40p0gisclSkEQsLcnwbYZ6z3rfmBQmpWZulnxA CCS3pshs1o/BqxXds0rNN6pKQsQVTLb+bpXsnIYDy1+deTQdFlvBYdD7 X-Gm-Gg: ASbGnctiUN4M0oS8vl/c8TqgtIJcXcATqrjMa1KVFIDKgNV9Cav8XWU42VjL2cLhzxu wloT5C+6BR5CVig5yN+B9szCPIY1UKz5bso+hHKebdDfMvPm0HI0saDXVgfKC1D+kshT8CaZMjd oIO2z8vZov9ct9Zb9ugJSyJq7Y9Ms3YcUYSmkrwE+87KTjB8e4TupsGIbVha+ZSKPPtEVFfCwZo ZkptN6RLEenKnhFTVyyda1I4+TbL08v7gFsvZJZyK2GsFySwi6N/esvNwATH97HU0YDjCraCmXu vQtyBZUio/7jEKD+tMpPCUuHIN7pBV1S92RU5SaeLKINOzinwS+htt643Bm0+SLB4nNFWtbOlja Xx4WQ7W7cWRO9QsaxyPQ1iGTFR0PPzm01qxuxlfe9VBgBEUt1ojKKwa5DefTjqkSQ+W/QmkeYEF BwnxjyKO/UWIqrnZ5yW0AgWaMNCw== X-Google-Smtp-Source: AGHT+IERKCYKXvZ6dTL/bPTF2aHnk3Job6CGRSNu/ZdXHTkTIUuDU/0EXZprXpLJTdUnmnyIDS++sg== X-Received: by 2002:a05:7300:dc0d:b0:2a7:3eee:df10 with SMTP id 5a478bee46e88-2a73eef4cc5mr23118540eec.27.1764579907713; Mon, 01 Dec 2025 01:05:07 -0800 (PST) Received: from localhost.localdomain ([104.128.72.44]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-11dcae73bedsm54908307c88.0.2025.12.01.01.05.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:05:07 -0800 (PST) From: zhangshida X-Google-Original-From: zhangshida To: Johannes.Thumshirn@wdc.com, hch@infradead.org, agruenba@redhat.com, ming.lei@redhat.com, hsiangkao@linux.alibaba.com, csander@purestorage.com, colyli@fnnas.com Cc: linux-block@vger.kernel.org, linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org, zhangshida@kylinos.cn, starzhangzsd@gmail.com, Christoph Hellwig Subject: [PATCH v4 3/3] block: prevent race condition on bi_status in __bio_chain_endio Date: Mon, 1 Dec 2025 17:04:42 +0800 Message-Id: <20251201090442.2707362-4-zhangshida@kylinos.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20251201090442.2707362-1-zhangshida@kylinos.cn> References: <20251201090442.2707362-1-zhangshida@kylinos.cn> 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" From: Shida Zhang Andreas point out that multiple completions can race setting bi_status. The check (parent->bi_status) and the subsequent write are not an atomic operation. The value of parent->bi_status could have changed between the time you read it for the if check and the time you write to it. So we use cmpxchg to fix the race, as suggested by Christoph. Suggested-by: Andreas Gruenbacher Suggested-by: Christoph Hellwig Suggested-by: Caleb Sander Mateos Reviewed-by: Christoph Hellwig Signed-off-by: Shida Zhang --- block/bio.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/bio.c b/block/bio.c index 1b5e4577f4c..097c1cd2054 100644 --- a/block/bio.c +++ b/block/bio.c @@ -314,8 +314,9 @@ static struct bio *__bio_chain_endio(struct bio *bio) { struct bio *parent =3D bio->bi_private; =20 - if (bio->bi_status && !parent->bi_status) - parent->bi_status =3D bio->bi_status; + if (bio->bi_status) + cmpxchg(&parent->bi_status, 0, bio->bi_status); + bio_put(bio); return parent; } --=20 2.34.1