[PATCH 1/1] md: skip discard on unsupported member devices

From: Wale Zhang

Date: Fri Jul 31 2026 - 03:48:35 EST


blk_stack_limits() uses min_not_zero() when stacking discard limits.
Thus an array containing devices with different discard capabilities can
expose discard support as long as at least one member has a non-zero
discard limit.

raid0 and raid10 use md_submit_discard_bio() to submit a discard bio to
each member covered by the request. The helper currently also submits
bios to members whose max_discard_sectors is zero. The block layer
completes these bios with BLK_STS_NOTSUPP, and bio chaining propagates
that status to the original discard request.

Discard is optional, so skip members which do not support it. Members that
do support discard continue to receive their portion of the request.

Signed-off-by: Wale Zhang <wale.zhang.ftd@xxxxxxxxx>
---
drivers/md/md.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index d1465bcd86c8..77e6e6bd5460 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -9350,6 +9350,10 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
{
struct bio *discard_bio = NULL;

+ /* Discard is optional, so silently skip members that do not support it. */
+ if (unlikely(!bdev_max_discard_sectors(rdev->bdev)))
+ return;
+
__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, &discard_bio);
if (!discard_bio)
return;
--
2.47.3