From nobody Sat Jun 13 23:22:55 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 C4A3337188B for ; Sat, 13 Jun 2026 18:28:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375300; cv=none; b=WeYd3yDL11J1H5SXHi34dUZ8v8+6Dr4/jv6OaZNozSeTvekWgAeLwDVefNpSAt8vjKNvyaWfBtjZiSVyobwZScvA+L7qRkunPE1DJAxG0oJiKkv2ICWmMuhN54SIyjwKFI5ywj9/I80WKHWOrIRLFhDBrZ5pR+5zJMWNdXraVFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375300; c=relaxed/simple; bh=Iry98KyDyC8KtxJqUhaic9B099C5zsdRjaP3QxGmGC4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UVprsJwfIKfTvxaKUK8M7/ujbhZXs0oRBkNFidvl+7+JX7D1eqwCetcMtALXewFU95kn9soLKYLphuyGeY/CHP8Whoi5QTSQJiPc0Swx8Y69AfkPHyskfRkT777+EYhak5QXZLJTZo77+k0Ip6UoQlMiuTbi9/K4BsFK3kf54dI= 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=VeAZ1Npu; arc=none smtp.client-ip=209.85.128.49 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="VeAZ1Npu" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-490b915ded5so19600605e9.3 for ; Sat, 13 Jun 2026 11:28:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781375297; x=1781980097; 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=3eBIbA+kbrkR9TVIp2/xUakR3mx0QWB9AgGhOooTieo=; b=VeAZ1Npuh/slxhn3t4sej69qucprBg3Ola+/ABaGkfQ0njYGMze+0UNLeJUyz/qlcU 4G94TM3QbCCnC9YM+WoBk67Zj/zJXq9HJOgZRBIliFWh/vHsK3T8wCBrNqChZnlY+YFS QaB/chqgB7QEkzm6gRLRyZfC4dL63hKJ91yn1wWPSh4Qp/7KCXpzDLvPf6aMzYtiD9yw G89ZbZTkyxfBkjTyrio+4399kxOMuVqTnymP8VwKCf4Ri5su6/1nXfAPr3D6dIP/IuDz GxzVHK1yP7+o2VyEV1HA67yTe/bahw8Uk1otVxga/spnrQ6i1tIwLS3sY0oy2GKmehoG DI3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781375297; x=1781980097; 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=3eBIbA+kbrkR9TVIp2/xUakR3mx0QWB9AgGhOooTieo=; b=T+16OnENnlrLlzpYj4+saHrJyGHnpiR/Efx0h4atVL7b9QjTL/gaSTmlPSOdB5INEf xLq07l6qg1UNPZPAlOOP2A21qs1irWaRHA+fhC0x3dq1Cqmj+j9wcFFAP7uiIBS8lqnS MQ7Qldm7L6kzrpig4xvXWCRczfLZwVqUu9QU136z+7GOawTz0MdbWrlHKrZJUxxg7BAN MCZiop/v5aeJoTKccg43pKyz76lBFDPSYg7TgTYLn83maY70E5Kjap/A+CwW+7UgMJVV llPg7INekfq9CCwos8mcDYDmp+YCDqrhVMcoR/RBfrADZFtXe4QPx5UTEq6HbGsu5Gla j9Gw== X-Forwarded-Encrypted: i=1; AFNElJ+3WOiSKRgHBzGSfLS/gJ+qePximgWbPRZeMxMguZZyo0hhUURW+nFMul1mbJEGozwl/8JqKROAZz4BnOA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxst9wPhEwIjvOq826+A0EpJ1AFSCpQCbcNhROeVM6VQ6Gijx99 0/JiuSoJHXia3nkJtEMVPhsAS2cKaw8S+57MSDSy8XZmr86GK+IBSdpC X-Gm-Gg: Acq92OFZTHYgWOwrR3PBg2V14sWekkw84Sl4nXQIABA+HrzkJLOODSkgvJs5hT8KO/+ 3D1TxD/8NSb6gxE9zYchrSupkX6AzSPRBOKQRWzhYTLY9XoGwy7e6OiivClyr8usex4gHavLt3K rtWu166oBoLks+xwIsOKFHd5xIkIxue0+IoojA2ki95guQg1mWztm615Juzz046CgjE5uJG7xmy ewWUZ3xe8/3iZt9ocYJKVdT2JU4o3UkGam5YWUu3uWv5FJciG53muqbIEgXPa6r802h8qDLxI+O z7O41623LqBe3ZOySwb0ksZjMDMCVVdvQwhULbi+pQ52oVE+1UPsgVfiFsQXZ9Qr8U7vKELyTXj Q7oXYoW0qQYt4HWa19TO+YcSmKL5/awfsOKdBLXwiaZpzt7bW7x+xIc7wQl06nc2azjInj5Wtt7 0Cz44MAjJn0CES/cnm/rugCgfbuHQ6KSW1yYxdvdkPWt2U5dVialY3ViCtNGh9yEOBkT/Z4w8Pk jc= X-Received: by 2002:a05:600c:2282:b0:490:c2a2:e91d with SMTP id 5b1f17b1804b1-490ec522d94mr68217925e9.35.1781375297142; Sat, 13 Jun 2026 11:28:17 -0700 (PDT) Received: from yocto.. (dynamic-176-007-197-181.176.7.pool.telefonica.de. [176.7.197.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4606f2c3782sm15353944f8f.25.2026.06.13.11.28.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jun 2026 11:28:16 -0700 (PDT) From: Abd-Alrhman Masalkhi To: song@kernel.org, yukuai@fygo.io, magiclinan@didiglobal.com, xiao@kernel.org, axboe@kernel.dk, hare@suse.de, john.g.garry@oracle.com, martin.petersen@oracle.com, vverma@digitalocean.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Abd-Alrhman Masalkhi , sashiko-bot Subject: [PATCH v2 1/4] md/raid1: fix writes_pending and barrier reference leaks on write failures Date: Sat, 13 Jun 2026 18:28:07 +0000 Message-ID: <20260613182810.1317258-2-abd.masalkhi@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260613182810.1317258-1-abd.masalkhi@gmail.com> References: <20260613182810.1317258-1-abd.masalkhi@gmail.com> 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" raid1_make_request() acquires a writes_pending reference with md_write_start() before calling raid1_write_request(). Several failure paths in raid1_write_request() complete the bio and return without reaching the normal write completion path, causing the corresponding md_write_end() to be skipped. Make raid1_write_request() return a status indicating whether the write request was successfully queued. This allows raid1_make_request() to call md_write_end() when raid1_write_request() fails. Additionally, if wait_blocked_rdev() fails after wait_barrier() succeeds, the associated barrier reference is not released. Call allow_barrier() before returning from that path to keep the barrier accounting balanced. Fixes: b1a7ad8b5c4f ("md/raid1: Handle bio_split() errors") Fixes: f2a38abf5f1c ("md/raid1: Atomic write support") Fixes: 5aa705039c4f ("md: raid1 add nowait support") Reported-by: sashiko-bot Closes: https://sashiko.dev/#/patchset/20260611083514.754922-1-abd.masalkhi= @gmail.com?part=3D1 Closes: https://sashiko.dev/#/patchset/20260611132500.763528-1-abd.masalkhi= @gmail.com?part=3D1 Signed-off-by: Abd-Alrhman Masalkhi --- Changes in v2: - fix writes_pending leaks in addition to the barrier reference leak. - make raid1_write_request() return whether the write was successfully queued so raid1_make_request() can release writes_pending references on failure paths. - Link v1: https://lore.kernel.org/linux-raid/20260611132500.763528-1-abd.= masalkhi@gmail.com/ --- drivers/md/raid1.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index b1ed4cc6ade4..f0e1c7125972 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1501,7 +1501,7 @@ static void raid1_start_write_behind(struct mddev *md= dev, struct r1bio *r1_bio, =20 } =20 -static void raid1_write_request(struct mddev *mddev, struct bio *bio, +static bool raid1_write_request(struct mddev *mddev, struct bio *bio, int max_write_sectors) { struct r1conf *conf =3D mddev->private; @@ -1512,6 +1512,7 @@ static void raid1_write_request(struct mddev *mddev, = struct bio *bio, int max_sectors; bool write_behind =3D false; bool is_discard =3D (bio_op(bio) =3D=3D REQ_OP_DISCARD); + sector_t sector =3D bio->bi_iter.bi_sector; =20 if (mddev_is_clustered(mddev) && mddev->cluster_ops->area_resyncing(mddev, WRITE, @@ -1519,7 +1520,7 @@ static void raid1_write_request(struct mddev *mddev, = struct bio *bio, =20 if (bio->bi_opf & REQ_NOWAIT) { bio_wouldblock_error(bio); - return; + return false; } wait_event_idle(conf->wait_barrier, !mddev->cluster_ops->area_resyncing(mddev, WRITE, @@ -1535,12 +1536,13 @@ static void raid1_write_request(struct mddev *mddev= , struct bio *bio, if (!wait_barrier(conf, bio->bi_iter.bi_sector, bio->bi_opf & REQ_NOWAIT)) { bio_wouldblock_error(bio); - return; + return false; } =20 if (!wait_blocked_rdev(mddev, bio)) { bio_wouldblock_error(bio); - return; + allow_barrier(conf, sector); + return false; } =20 r1_bio =3D alloc_r1bio(mddev, bio); @@ -1699,7 +1701,8 @@ static void raid1_write_request(struct mddev *mddev, = struct bio *bio, =20 /* In case raid1d snuck in to freeze_array */ wake_up_barrier(conf); - return; + return true; + err_handle: for (k =3D 0; k < i; k++) { if (r1_bio->bios[k]) { @@ -1709,6 +1712,7 @@ static void raid1_write_request(struct mddev *mddev, = struct bio *bio, } =20 raid_end_bio_io(r1_bio); + return false; } =20 static bool raid1_make_request(struct mddev *mddev, struct bio *bio) @@ -1732,8 +1736,9 @@ static bool raid1_make_request(struct mddev *mddev, s= truct bio *bio) if (bio_data_dir(bio) =3D=3D READ) raid1_read_request(mddev, bio, sectors, NULL); else { - md_write_start(mddev,bio); - raid1_write_request(mddev, bio, sectors); + md_write_start(mddev, bio); + if (!raid1_write_request(mddev, bio, sectors)) + md_write_end(mddev); } return true; } --=20 2.43.0 From nobody Sat Jun 13 23:22:55 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (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 6BA233090F5 for ; Sat, 13 Jun 2026 18:28:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375303; cv=none; b=T56klfkyrRj+uvWTUtvIfzFd/jRfZuj0M3se1yx6oefHM6fNZu9UsodVGtBHoN9g/2M129X4Bv+Zomkrk0NACaQd9nLh+fiIPYdzJUe7l+AMiqV8iSQJsRAFitd9F72S6LbnZFipjMHJpv/9sxTAt8z/pbidzlf2lODyvLqoxkI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375303; c=relaxed/simple; bh=SkBF8YMNSuWV2lPKUoYHaA1suoI7RtOuAdp2YZ4iv/Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SO1VTK+I4NFu4VKuTiQ/kvP02EuSdpV3wnSdTqHh9gK7KYWFb+9u9Pvd+AAMoJqzOh41YUjoHdeAzhbxz/HRP6gZ58QB7hGfV9BaCSNhdELznKjv2g0eDnBb17QTbwehmeGT08wPslYAczeRXkgRarLv1g+eSGO9oCxOLwyrW40= 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=LlFpfjoX; arc=none smtp.client-ip=209.85.221.46 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="LlFpfjoX" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-46019b190b6so1648860f8f.3 for ; Sat, 13 Jun 2026 11:28:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781375301; x=1781980101; 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=h5Gnibv/1ZOPx5OXJ9JNWc4fAopb5F9Aknkg5S0qDho=; b=LlFpfjoXkoccEqOE4cg40U2Nfxacm37nZwMiAibrz/n8SRTxxhEaGiNlXag/fyXtMU 2BWI7BiNR4LUTdVNCDll+KyTjMaP6t5FsWfxWLZCBxhAlfwZlKgw2vw25y7tQ6jsdYFK JJ6fKWah4SpEEUKeVxrm276VsSZpyx+z9nmk6Sfpk4AiMHViwEWA/FV9tm4hO4Ey4Ds0 KjWO2WiXJkDkaCykITWKVpjOp40Cmxj9OLlIs9YPU0reqQQmvTOdDJcrWlUnAEyKx5Z6 Z/XfGxiQZSaVEr2+Y7ygTOEqV5egt9exa8Py/3OD8N2H0osSqEzlygM+B71f8WRAsR9Z vL+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781375301; x=1781980101; 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=h5Gnibv/1ZOPx5OXJ9JNWc4fAopb5F9Aknkg5S0qDho=; b=NsfqWX6pgwgepQkRlH0j1dBW5Xo1+IAmbMUeSKdgE/BAJ4qT8789a6uC0IUC5HYoJ1 A9hEVkBhqe6hwOlIF6iErJAaxe23slpI0ODMkkVxHOYB2o31MrR6GvlbS5BSUOa8wERt IqdeRW2Uqa7D6VP6rGvQibXDumqseB5E1OpdphQu1KV7c2KWm2prgNACFD8RvdmOViMC +XT1GtJT9rJHnsAWEdyPkRTol8NplXuglasz7bDDkT5zIcr9K+x60vNNKVobqiQeHFkD VyK3/n/LCbBjQjJ0hiwCIdNquMWRq1oJJ8wKs/3l4ZFJZGQbSzFYLaxelufXKiyiqwEs 3Yzg== X-Forwarded-Encrypted: i=1; AFNElJ8y9TLpB3oxWxhg+ZJ2Yz6jvw2Mmu70Gs3oLCGAAfZxAEcVwMHTjKRKIkhT0DIEsamsqosr3dgnF5DJomY=@vger.kernel.org X-Gm-Message-State: AOJu0YxDoVi+ar7Sn+IcRP/qB1VBTJZS0RkzGQ0XiPMS/QrdMsnflyE2 IvaoVcAXVvGP1+JwYlAgR7C61fnadtXNkt4SWnxRhodjTrXYRMPVwL1L X-Gm-Gg: Acq92OHSgezppJ4JvLh515mwgYcBtN6vBoXbEbKgKMR87hyn2ekNgJula3KqFGtq3lj psVVGgIp18oLaQdrvdxCc1nPz5u0dCTwXyfHDehO1pbiTTXCo+X/se1zYcj30SWPGuEW17xv9Gh gBHSyLepLkgH+70uMcgpZova/P+NSV5nzt3YSUfVHnQj6Lteh7QwH9R4ptli+smFp8ioCBssSs0 QukaEVXulojMdX9q8cy7z5Ou1Yo9GrtDY0ZEQLJ9vdRSBzcFI4L5/T2IIHmhbv8keyg7Jrp4lAB 7IcrUiJWp29gZltglwjNi+eLQZy/jg8+hwrVbHaaSv6P6AweLKXTYc7u3941p93mhQUtKgINQF1 zGuhcvItf62jBGh3XL/76S+oicRW8xG5YHM5Z4pZZ+ZsIitDxvHjBUyRoEnapDTSv0s49w2JF7O UZ+m49dXehrEziQAvM3IufoercXCoTc9R9jjfC2ZhOyGI48LFySij1WyaWYYbMi1T8pSjOAwTMv PI= X-Received: by 2002:a05:6000:420e:b0:43c:f66e:f24 with SMTP id ffacd0b85a97d-4607ebf8195mr4968631f8f.35.1781375300659; Sat, 13 Jun 2026 11:28:20 -0700 (PDT) Received: from yocto.. (dynamic-176-007-197-181.176.7.pool.telefonica.de. [176.7.197.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4606f2c3782sm15353944f8f.25.2026.06.13.11.28.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jun 2026 11:28:20 -0700 (PDT) From: Abd-Alrhman Masalkhi To: song@kernel.org, yukuai@fygo.io, magiclinan@didiglobal.com, xiao@kernel.org, axboe@kernel.dk, hare@suse.de, john.g.garry@oracle.com, martin.petersen@oracle.com, vverma@digitalocean.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Abd-Alrhman Masalkhi Subject: [PATCH v2 2/4] md/raid10: fix writes_pending leak on write request failures Date: Sat, 13 Jun 2026 18:28:08 +0000 Message-ID: <20260613182810.1317258-3-abd.masalkhi@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260613182810.1317258-1-abd.masalkhi@gmail.com> References: <20260613182810.1317258-1-abd.masalkhi@gmail.com> 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" raid10_make_request() acquires a writes_pending reference with md_write_start() before dispatching write requests. Several failure paths in raid10_write_request() complete the bio and return without reaching the normal write completion path, causing the corresponding md_write_end() to be skipped. Make raid10_write_request() return a status indicating whether the write request was successfully queued. This allows raid10_make_request() to release the writes_pending reference with md_write_end() when a write request fails. Fixes: 4cf58d952909 ("md/raid10: Handle bio_split() errors") Fixes: c9aa889b035f ("md: raid10 add nowait support") Signed-off-by: Abd-Alrhman Masalkhi --- Changes in v2: - new patch. --- drivers/md/raid10.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 5bd7698e0a1b..5ad1b0c6207a 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1349,7 +1349,7 @@ static void wait_blocked_dev(struct mddev *mddev, str= uct r10bio *r10_bio) } } =20 -static void raid10_write_request(struct mddev *mddev, struct bio *bio, +static bool raid10_write_request(struct mddev *mddev, struct bio *bio, struct r10bio *r10_bio) { struct r10conf *conf =3D mddev->private; @@ -1365,7 +1365,7 @@ static void raid10_write_request(struct mddev *mddev,= struct bio *bio, /* Bail out if REQ_NOWAIT is set for the bio */ if (bio->bi_opf & REQ_NOWAIT) { bio_wouldblock_error(bio); - return; + return false; } for (;;) { prepare_to_wait(&conf->wait_barrier, @@ -1381,7 +1381,7 @@ static void raid10_write_request(struct mddev *mddev,= struct bio *bio, sectors =3D r10_bio->sectors; if (!regular_request_wait(mddev, conf, bio, sectors)) { free_r10bio(r10_bio); - return; + return false; } =20 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && @@ -1398,7 +1398,7 @@ static void raid10_write_request(struct mddev *mddev,= struct bio *bio, if (bio->bi_opf & REQ_NOWAIT) { allow_barrier(conf); bio_wouldblock_error(bio); - return; + return false; } mddev_add_trace_msg(conf->mddev, "raid10 wait reshape metadata"); @@ -1514,7 +1514,8 @@ static void raid10_write_request(struct mddev *mddev,= struct bio *bio, raid10_write_one_disk(mddev, r10_bio, bio, true, i); } one_write_done(r10_bio); - return; + return true; + err_handle: for (k =3D 0; k < i; k++) { int d =3D r10_bio->devs[k].devnum; @@ -1532,10 +1533,12 @@ static void raid10_write_request(struct mddev *mdde= v, struct bio *bio, } =20 raid_end_bio_io(r10_bio); + return false; } =20 -static void __make_request(struct mddev *mddev, struct bio *bio, int secto= rs) +static bool __make_request(struct mddev *mddev, struct bio *bio, int secto= rs) { + bool ret; struct r10conf *conf =3D mddev->private; struct r10bio *r10_bio; =20 @@ -1551,10 +1554,13 @@ static void __make_request(struct mddev *mddev, str= uct bio *bio, int sectors) memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->geo.raid_disks); =20 + ret =3D true; if (bio_data_dir(bio) =3D=3D READ) raid10_read_request(mddev, bio, r10_bio); else - raid10_write_request(mddev, bio, r10_bio); + ret =3D raid10_write_request(mddev, bio, r10_bio); + + return ret; } =20 static void raid_end_discard_bio(struct r10bio *r10bio) @@ -1900,7 +1906,8 @@ static bool raid10_make_request(struct mddev *mddev, = struct bio *bio) sectors =3D chunk_sects - (bio->bi_iter.bi_sector & (chunk_sects - 1)); - __make_request(mddev, bio, sectors); + if (!__make_request(mddev, bio, sectors)) + md_write_end(mddev); =20 /* In case raid10d snuck in to freeze_array */ wake_up_barrier(conf); --=20 2.43.0 From nobody Sat Jun 13 23:22:55 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (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 0748C2C3768 for ; Sat, 13 Jun 2026 18:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375307; cv=none; b=ndfBKnVCqxUHCo+ITUQlCYotL0mVUia0+c1RYm3dyhvSiitGC26hGyZnqX+/e0Jnh4yffq17hKuJ0MPUFAEVV3/yYrbcHq0Eh0kQ30rMg4joRKod11sAyjNiInBcghJpkgO02amZkuMI7zuk8lhkUWSFo/fLca41pG8+jCUu0Sg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375307; c=relaxed/simple; bh=8ZkjyDCmBeMp6Lp8hhEHzHjFWd+c3fExX2yd98X/Alk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fb38nWj5Px8XjxXSgYx5Ex00GX7Cn4Mp6iRnVKIeyfLiMhLRk30KaLP+KPtN7CjZGiHy9K/L9lcGftsYX7guqGnmcCc+55BQjB2Br792LB9t7agM1OhJS4nU62LinRx7dyRQgaUK0aZwyDnTDnjdhG9fn7CIy6YGo3r7XgeQZCA= 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=RC0xGOeU; arc=none smtp.client-ip=209.85.221.48 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="RC0xGOeU" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-460662fcb4eso1268440f8f.0 for ; Sat, 13 Jun 2026 11:28:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781375304; x=1781980104; 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=zjWi+S6jDskwftAxrO6nheJGxPEoq3XczJr2SHMLRUU=; b=RC0xGOeU8Cl1Ijc7pv2ZyqdOCFmICuaXHXPh0lZ06h4Wuak4e88xr3jak3eFMF3VCn OLVBG4kICLB8KIhXSMARxqWpB2EHxk2pEmQe+3AiwV8H6QgaaTQwOEm3jh8IHc4zsof/ ri+u69EDLVh13F1HsA4+LwVWGQ1SMIPQskrzZp9L8cYJSibeMbaFyBlwKFdqCpv7tl8n Ln4kWNWvLPreUdooipqEOxy54g0XwFP3gOqaI/TnRyLF7etc+oe1Uqz6Gxs7p1/LEjxH FEaNwQsdVNeUAq9Y0t/Ndtz9l4+UHIn+K8sF9NCtEHiUEHEQseCT6ul+rpJXbXM0yR3E pTFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781375304; x=1781980104; 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=zjWi+S6jDskwftAxrO6nheJGxPEoq3XczJr2SHMLRUU=; b=hy7LBTKT/DYCajafHZSSenxCYCN7PVedX8URSTd6qlv4QWlkEYEvO4sEkFMabIMuVZ BgPCKoJQFO8GQt5ubyY1VL90sZ4MoC9rmFfFhbr8+WJ4gL9DNJTAcrE8PVJV59BRnith O/8vRW4g1yYSC3AMsFOjW6T7eNw+aMBV609dvjXraCPNmfTk/bs3f1atp3g4ReFOR4JF 0MIfLvaYFMV+QYGF+Cm7da3js4Goaw6H9NrL9m++eWY0LrJx1g+miPntQB3MxRFJJd0V 5rXA35p3MhSblUu9MtYmEKS7jO/H+F7SL+FS0z+TDlk8+/Muoh+6HX7BabX/mZUBbTcZ Bm2w== X-Forwarded-Encrypted: i=1; AFNElJ8j7pcW6ODVCtw9TnAKHM2KNisS/Lv1sLn555okA1ViMpm96svaW9X/QBZ4NYRTKsvnAWE/Jyl0fsZIXLE=@vger.kernel.org X-Gm-Message-State: AOJu0YxVWOIsBYQT6gaGwD7a0Jxn4hS9A/IkEQmJLQ8lE3BkS2IXuEJk kn2DOdXR6PjU+ww0uJBbwgRHFbcRunWCaVwQUN+r+Ct2vTq5melh/wzx X-Gm-Gg: Acq92OH3wC/CHDSgXc7+lFQobReeHRmqR6HVdHyFDAvA9NxMFPznzNdL+w7dlmxKF9l ug5kjv+RdM3DR4DEiERbW+4UYGoPNx2Iy9WQXoenDhVAKXnl11PB0ezSS2fn1Vcf4OT/2jKiyWF 3Y07emY2nSDKk5rtHN22ac+EbNMl/oGIuKLdTBU6gGJXywdJk8867GQCT7xJR5+uXMDZKSUqW1u D6zuviIXnitaDkGVrI2qcKaF2snufOV2Se6rtapKIurfrgFBobZWwJ+d1ieXiCnLHcVIOr6Ol/w IuH0vyYWodt79U/CPZ41Z0mdxGynIAYmEqoZsPQ9oUgcQEg9zLSPgTDO9OhAEl2DEyOM25T2EP8 IIvlGNtdcq6cPIkr7DwHfIKVopo1nH0pQ8GrxW56LgcdDpkvB1qyXXrDCYwiJSeiOrPYiA2/01E b9yi9xC9Vu8gL+PXlDl/AWMx+NkoEpEJtxUs4b06UIx2i1RjofrMDxE9Jcb+Z0UavLmeuGUD0zR Qfrex3HNjDeUA== X-Received: by 2002:a05:6000:288e:b0:460:ff2:63e5 with SMTP id ffacd0b85a97d-4606db99da6mr12112396f8f.18.1781375304257; Sat, 13 Jun 2026 11:28:24 -0700 (PDT) Received: from yocto.. (dynamic-176-007-197-181.176.7.pool.telefonica.de. [176.7.197.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4606f2c3782sm15353944f8f.25.2026.06.13.11.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jun 2026 11:28:23 -0700 (PDT) From: Abd-Alrhman Masalkhi To: song@kernel.org, yukuai@fygo.io, magiclinan@didiglobal.com, xiao@kernel.org, axboe@kernel.dk, hare@suse.de, john.g.garry@oracle.com, martin.petersen@oracle.com, vverma@digitalocean.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Abd-Alrhman Masalkhi Subject: [PATCH v2 3/4] md/raid10: fix writes_pending and barrier reference leaks on discard failures Date: Sat, 13 Jun 2026 18:28:09 +0000 Message-ID: <20260613182810.1317258-4-abd.masalkhi@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260613182810.1317258-1-abd.masalkhi@gmail.com> References: <20260613182810.1317258-1-abd.masalkhi@gmail.com> 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" raid10_make_request() acquires a writes_pending reference with md_write_start() before calling raid10_handle_discard(). Several failure paths in raid10_handle_discard() complete the bio and return without releasing the corresponding reference, causing md_write_end() to be skipped. Call md_write_end() before returning from these failure paths to keep writes_pending accounting balanced. Additionally, discard split allocation failures can occur after wait_barrier() succeeds. Those paths return without calling allow_barrier(), leaking the associated barrier reference. Release the barrier before returning from those paths. Fixes: c9aa889b035f ("md: raid10 add nowait support") Fixes: 4cf58d952909 ("md/raid10: Handle bio_split() errors") Signed-off-by: Abd-Alrhman Masalkhi --- Changes in v2: - new patch. --- drivers/md/raid10.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 5ad1b0c6207a..aacf160ee9f2 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1639,6 +1639,7 @@ static int raid10_handle_discard(struct mddev *mddev,= struct bio *bio) =20 if (!wait_barrier(conf, bio->bi_opf & REQ_NOWAIT)) { bio_wouldblock_error(bio); + md_write_end(mddev); return 0; } =20 @@ -1681,6 +1682,8 @@ static int raid10_handle_discard(struct mddev *mddev,= struct bio *bio) if (IS_ERR(split)) { bio->bi_status =3D errno_to_blk_status(PTR_ERR(split)); bio_endio(bio); + md_write_end(mddev); + allow_barrier(conf); return 0; } =20 @@ -1698,6 +1701,8 @@ static int raid10_handle_discard(struct mddev *mddev,= struct bio *bio) if (IS_ERR(split)) { bio->bi_status =3D errno_to_blk_status(PTR_ERR(split)); bio_endio(bio); + md_write_end(mddev); + allow_barrier(conf); return 0; } =20 --=20 2.43.0 From nobody Sat Jun 13 23:22:55 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 ED32B34B1A3 for ; Sat, 13 Jun 2026 18:28:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375310; cv=none; b=TdXR4oPRHEgfe+cKVlNeiFp6/aaAgCefIpJtJTgdLIrnSjQSmjG35gnNgpPMsN2iq5c4YHIQIkZbn7Rhw8YyLO4JD+GaYYA68wAImA+hPigB4pLBWxoqdqqPYYSSg0UyMGSjm5YYRrqQU8LHyTNmb2kfgph+zxtpvoKHWJTJwps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781375310; c=relaxed/simple; bh=H6xEHOv2A3X5t6F2c677VKkcIm5PxpOYu/wf+3EP4Lo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V+bXXdB/a9keDA86f+Lj5cYecnonr15wDTVUfFQXP7BSAc0TDyjAIklfB9FfW4k/Stqa1WYmRxJF0tuP9kw4c+6KzujWYoYqHuG8Jf0jXoLW39zSbuTBvc5FrfNRvse6AksbP/FubrNCbbQR20xtXTagOwgKIqn1yGjpMEwzEpA= 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=pTNNJ01E; arc=none smtp.client-ip=209.85.128.51 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="pTNNJ01E" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4905529b933so20176215e9.0 for ; Sat, 13 Jun 2026 11:28:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781375307; x=1781980107; 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=oykH226daU1dmEgW6apfw5s9xG7KAd0jfisG7uN7peU=; b=pTNNJ01EDMb+GExOi8dgIPqWFf0zjx2fcliBtUjUj7sXkUqIK6X6WjXlYteSRx6PE8 Bsegi3uYMakYlMBZlgs0GfNRS02YMN+eaOgZPcmqCQXzR/8lm5PFieJtITLhIVD3lsIy Sg17RCU5bZtOomq/ltUVtrPU85hrH+YcMUNN5/K7fpkpatbQeyU7gBQbVpQNDy4pe4re DaCHIKcOWCqkgIsgPTgs6KW1A6YReuvC57iDJ739DfU/abJ9Ugb8sBLcFk6IHcEYV4Ue fCl6Em8b1+vkdZKAsgYRmmZLIbTVBeVPfKGWivRJG04G2nZQvfbZeGTO4b/yQszkAzb+ 9pHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781375307; x=1781980107; 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=oykH226daU1dmEgW6apfw5s9xG7KAd0jfisG7uN7peU=; b=UrgoroAbIqBeNSc6i8X+5M9VEIr8ZcGs0KQew3uoRkRPOAyT3vdAevmBr/74EcSObg KCJZIPsdO5WfXNy9Aqmp62btUAn4CJ1Kz+EUyU9DpBs+/s7LoDHSwScDKfhcA90wyRRF VPaKM+ZwKF29F625VXdwDOgAbHkQAUZBVFO/mmElPpzlWeRGAVF1amEhrhzAUVu5qnud 4pe/HuUapxVNC3i8DF6+xgpcnmRWlOiWtd6hfajYZ4UyIJ9QSfBXTf8uztbQJu86o7Nl /le+47ajVrAvpqAfO2jMjIiIgth1QEGw0zQwwYkoOGZe8W+/pRpvaNc4/2A4SIA/ZqYV VPWw== X-Forwarded-Encrypted: i=1; AFNElJ8d8WmyY/p1reX2rTzziNN65kb6fI8ocPl2F6nBHcV3l1rjTgZ0h7ICYuhDeNtoI/3iAyX5xZiD28YPFco=@vger.kernel.org X-Gm-Message-State: AOJu0YxXTNmGhdYAlf4tjx481SZmiMq41CDB7DAkJzKa+EWzskdQJ8hu 9mzkfZAdIluHtDC4hBTcTmUxlX2mp4r9p5s4dhqZ5FISRvKRLVyDXpXQ X-Gm-Gg: Acq92OF7psnN50PeHXfV6x82oIN95CMI2OPYtjVT2UiPIiRsgFCw7itPr47noOZ2YN9 pZBsdedc9YgcTtWEorl6+32DwbZFwdDUPZadOgmTt+/X7K0CwXDQ626BNMcJtxcuZYw135xET1N 4ObKAFAEUiXCEDRt+7O5x4zsVg4Yds8fA13p9NTxZihzd0lmZLQQCwqiiJdMwzOUyfxlR8B222t dOIt30ado8BSq31DQTI8PC6RVj3Bsd90lI1rVbb6tkDAKJOuQBtrcxvkS4uDJD5ESjtk0XlkRrZ uWjfDxv1fym6TBAU4txePuLtE7yETChVngFnLPfjRy0sjEXXn5L1+uwa3LAQUEHSB3EzT1Z/mFM AUgoWLFFrt3gv2E5Y4C1iqlZu4ahxbxqujEA68+HnFJSu9l0RuYMWIcm+2VUYg66N4jD92/37nb wQ+EW7VldvcLe86xmHCfNTRbI/Z1cKyVnxl8TzLfd7e5ZW9MER6Is0e+dcVYO1tKxJb36m9hTAw w+DraptL/8aHA== X-Received: by 2002:a05:6000:2dc2:b0:460:30bd:4dca with SMTP id ffacd0b85a97d-4606dba0652mr9981669f8f.30.1781375307241; Sat, 13 Jun 2026 11:28:27 -0700 (PDT) Received: from yocto.. (dynamic-176-007-197-181.176.7.pool.telefonica.de. [176.7.197.181]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4606f2c3782sm15353944f8f.25.2026.06.13.11.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Jun 2026 11:28:26 -0700 (PDT) From: Abd-Alrhman Masalkhi To: song@kernel.org, yukuai@fygo.io, magiclinan@didiglobal.com, xiao@kernel.org, axboe@kernel.dk, hare@suse.de, john.g.garry@oracle.com, martin.petersen@oracle.com, vverma@digitalocean.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, Abd-Alrhman Masalkhi Subject: [PATCH v2 4/4] md/raid1: simplify raid1_write_request() error handling Date: Sat, 13 Jun 2026 18:28:10 +0000 Message-ID: <20260613182810.1317258-5-abd.masalkhi@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260613182810.1317258-1-abd.masalkhi@gmail.com> References: <20260613182810.1317258-1-abd.masalkhi@gmail.com> 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" raid1_write_request() increments rdev->nr_pending before checking the badblocks and then immediately decrements it again when a device is skipped. Move the increment until after the checks succeed so the reference accounting is easier to follow. Consolidate the failure paths so that each error label releases exactly the resources acquired up to that point. err_dec_pending drops pending references and frees the r1bio, while err_allow_barrier handles the barrier release before returning. When a REQ_ATOMIC write cannot be satisfied due to a badblock range, complete the bio with BLK_STS_NOTSUPP rather than reporting an I/O error, since the operation is unsupported rather than having failed during I/O. Rename max_write_sectors to max_sectors and remove the redundant local copy. Signed-off-by: Abd-Alrhman Masalkhi --- Changes in v2: - new patch, depends on patch 1. --- drivers/md/raid1.c | 59 +++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index f0e1c7125972..dc0b7b8bc2f8 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1502,29 +1502,29 @@ static void raid1_start_write_behind(struct mddev *= mddev, struct r1bio *r1_bio, } =20 static bool raid1_write_request(struct mddev *mddev, struct bio *bio, - int max_write_sectors) + int max_sectors) { struct r1conf *conf =3D mddev->private; struct r1bio *r1_bio; int i, disks, k; unsigned long flags; int first_clone; - int max_sectors; bool write_behind =3D false; - bool is_discard =3D (bio_op(bio) =3D=3D REQ_OP_DISCARD); + bool nowait =3D bio->bi_opf & REQ_NOWAIT; + bool is_discard =3D op_is_discard(bio->bi_opf); sector_t sector =3D bio->bi_iter.bi_sector; =20 if (mddev_is_clustered(mddev) && - mddev->cluster_ops->area_resyncing(mddev, WRITE, - bio->bi_iter.bi_sector, bio_end_sector(bio))) { + mddev->cluster_ops->area_resyncing(mddev, WRITE, sector, + bio_end_sector(bio))) { =20 - if (bio->bi_opf & REQ_NOWAIT) { + if (nowait) { bio_wouldblock_error(bio); return false; } wait_event_idle(conf->wait_barrier, !mddev->cluster_ops->area_resyncing(mddev, WRITE, - bio->bi_iter.bi_sector, + sector, bio_end_sector(bio))); } =20 @@ -1533,20 +1533,18 @@ static bool raid1_write_request(struct mddev *mddev= , struct bio *bio, * thread has put up a bar for new requests. * Continue immediately if no resync is active currently. */ - if (!wait_barrier(conf, bio->bi_iter.bi_sector, - bio->bi_opf & REQ_NOWAIT)) { + if (!wait_barrier(conf, sector, nowait)) { bio_wouldblock_error(bio); return false; } =20 if (!wait_blocked_rdev(mddev, bio)) { bio_wouldblock_error(bio); - allow_barrier(conf, sector); - return false; + goto err_allow_barrier; } =20 r1_bio =3D alloc_r1bio(mddev, bio); - r1_bio->sectors =3D max_write_sectors; + r1_bio->sectors =3D max_sectors; =20 /* first select target devices under rcu_lock and * inc refcount on their rdev. Record them by setting @@ -1560,7 +1558,6 @@ static bool raid1_write_request(struct mddev *mddev, = struct bio *bio, */ =20 disks =3D conf->raid_disks * 2; - max_sectors =3D r1_bio->sectors; for (i =3D 0; i < disks; i++) { struct md_rdev *rdev =3D conf->mirrors[i].rdev; =20 @@ -1576,23 +1573,21 @@ static bool raid1_write_request(struct mddev *mddev= , struct bio *bio, if (!rdev || test_bit(Faulty, &rdev->flags)) continue; =20 - atomic_inc(&rdev->nr_pending); if (test_bit(WriteErrorSeen, &rdev->flags)) { sector_t first_bad; sector_t bad_sectors; int is_bad; =20 - is_bad =3D is_badblock(rdev, r1_bio->sector, max_sectors, + is_bad =3D is_badblock(rdev, sector, max_sectors, &first_bad, &bad_sectors); - if (is_bad && first_bad <=3D r1_bio->sector) { + if (is_bad && first_bad <=3D sector) { /* Cannot write here at all */ - bad_sectors -=3D (r1_bio->sector - first_bad); + bad_sectors -=3D (sector - first_bad); if (bad_sectors < max_sectors) /* mustn't write more than bad_sectors * to other devices yet */ max_sectors =3D bad_sectors; - rdev_dec_pending(rdev, mddev); continue; } if (is_bad) { @@ -1606,15 +1601,18 @@ static bool raid1_write_request(struct mddev *mddev= , struct bio *bio, * the benefit. */ if (bio->bi_opf & REQ_ATOMIC) { - rdev_dec_pending(rdev, mddev); - goto err_handle; + bio->bi_status =3D BLK_STS_NOTSUPP; + bio_endio(bio); + goto err_dec_pending; } =20 - good_sectors =3D first_bad - r1_bio->sector; + good_sectors =3D first_bad - sector; if (good_sectors < max_sectors) max_sectors =3D good_sectors; } } + + atomic_inc(&rdev->nr_pending); r1_bio->bios[i] =3D bio; } =20 @@ -1630,10 +1628,8 @@ static bool raid1_write_request(struct mddev *mddev,= struct bio *bio, if (max_sectors < bio_sectors(bio)) { bio =3D bio_submit_split_bioset(bio, max_sectors, &conf->bio_split); - if (!bio) { - set_bit(R1BIO_Returned, &r1_bio->state); - goto err_handle; - } + if (!bio) + goto err_dec_pending; =20 r1_bio->master_bio =3D bio; r1_bio->sectors =3D max_sectors; @@ -1677,7 +1673,7 @@ static bool raid1_write_request(struct mddev *mddev, = struct bio *bio, mbio->bi_opf &=3D ~REQ_NOWAIT; r1_bio->bios[i] =3D mbio; =20 - mbio->bi_iter.bi_sector =3D (r1_bio->sector + rdev->data_offset); + mbio->bi_iter.bi_sector =3D sector + rdev->data_offset; mbio->bi_end_io =3D raid1_end_write_request; if (test_bit(FailFast, &rdev->flags) && !test_bit(WriteMostly, &rdev->flags) && @@ -1686,7 +1682,7 @@ static bool raid1_write_request(struct mddev *mddev, = struct bio *bio, mbio->bi_private =3D r1_bio; =20 atomic_inc(&r1_bio->remaining); - mddev_trace_remap(mddev, mbio, r1_bio->sector); + mddev_trace_remap(mddev, mbio, sector); /* flush_pending_writes() needs access to the rdev so...*/ mbio->bi_bdev =3D (void *)rdev; if (!raid1_add_bio_to_plug(mddev, mbio, raid1_unplug, disks)) { @@ -1701,9 +1697,10 @@ static bool raid1_write_request(struct mddev *mddev,= struct bio *bio, =20 /* In case raid1d snuck in to freeze_array */ wake_up_barrier(conf); + return true; =20 -err_handle: +err_dec_pending: for (k =3D 0; k < i; k++) { if (r1_bio->bios[k]) { rdev_dec_pending(conf->mirrors[k].rdev, mddev); @@ -1711,7 +1708,11 @@ static bool raid1_write_request(struct mddev *mddev,= struct bio *bio, } } =20 - raid_end_bio_io(r1_bio); + free_r1bio(r1_bio); + +err_allow_barrier: + allow_barrier(conf, sector); + return false; } =20 --=20 2.43.0