From: sashiko-bot@kernel.org
To: "Zhihao Cheng" <chengzhihao1@huawei.com>
Cc: linux-raid@vger.kernel.org, yukuai@fygo.io
Subject: Re: [PATCH v2 2/4] md: Handle pers->run failure in level_store
Date: Tue, 22 Sep 2026 15:01:47 +0000 [thread overview]
Message-ID: <20260922150147.D5DC91F00899@smtp.kernel.org> (raw)
In-Reply-To: <20260922141456.738937-3-chengzhihao1@huawei.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] md: NULL pointer dereference in md_handle_request() when resuming array after pers->run() failure
- [Medium] md: sysfs group md_redundancy_group leaked on pers->run() failure
--
commit 4ab3c278fcfe04083eb0fb2b801da26eb96c6cec
Author: Zhihao Cheng <chengzhihao1@huawei.com>
md: Handle pers->run failure in level_store
This commit fixes a NULL pointer dereference that occurs when raid_disks
is set after raid5_run() fails during array conversion. It handles the
error by stopping the array if the new personality fails to run, allowing
a subsequent active order to restart it.
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 680b34a63cb3d..f8fffc5de1143 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
[ ... ]
> @@ -4229,7 +4230,31 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
> mddev->in_sync = 1;
> timer_delete_sync(&mddev->safemode_timer);
> }
> - pers->run(mddev);
> + rv = pers->run(mddev);
> + if (rv) {
> + /*
> + * ->run() has released the private data of the new personality,
> + * while the old one has already been released as well. There is
> + * nothing to fall back to, so stop the array to avoid leaving
> + * 'mddev->pers' pointing to a personality which has no private
> + * data, and reminds user to try to active the mddev again.
> + */
> + pr_warn("md: %s: failed to run %s after takeover, please try to active\n",
> + mdname(mddev), pers->head.name);
> + if (md_bitmap_enabled(mddev, true))
> + mddev->bitmap_ops->flush(mddev);
> + clear_bit(MD_SERIALIZE_POLICY, &mddev->flags);
> + mddev_destroy_serial_pool(mddev, NULL);
> + __md_stop(mddev);
[Severity: High]
Does calling __md_stop() here introduce a NULL pointer dereference for in-flight IOs?
If level_store() is called while IOs are active, mddev_suspend_and_lock() will
force them to wait in md_handle_request(). __md_stop() sets mddev->pers = NULL.
When the error path later reaches out_unlock and calls mddev_unlock_and_resume(),
will the trapped IOs wake up and unconditionally call mddev->pers->make_request()
while mddev->pers is NULL, panicking the kernel?
> + rdev_for_each(rdev, mddev)
> + if (rdev->raid_disk >= 0)
> + sysfs_unlink_rdev(mddev, rdev);
> + set_capacity_and_notify(mddev->gendisk, 0);
> + mddev->changed = 1;
> + md_new_event();
> + sysfs_notify_dirent_safe(mddev->sysfs_state);
> + goto out_unlock;
[Severity: Medium]
When converting from a non-redundancy array to a redundancy array,
sysfs_create_group() is called earlier in level_store() to add md_redundancy_group.
Does this error path leak the sysfs group and its kernfs_node references, since
mddev->to_remove is not set to &md_redundancy_group to trigger cleanup in
mddev_unlock()?
> + }
> set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
> if (!mddev->thread)
> md_update_sb(mddev, 1);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260922141456.738937-1-chengzhihao1@huawei.com?part=2
next prev parent reply other threads:[~2026-09-22 15:01 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 14:14 [PATCH v2 0/4] md: Fix two raid5/raid10 bugs Zhihao Cheng
2026-09-22 14:14 ` [PATCH v2 1/4] md/raid5: Hide the origin mddev->thread before takeover Zhihao Cheng
2026-09-22 14:14 ` [PATCH v2 2/4] md: Handle pers->run failure in level_store Zhihao Cheng
2026-09-22 15:01 ` sashiko-bot [this message]
2026-09-22 14:14 ` [PATCH v2 3/4] md/raid5: Don't free conf on raid5_run failure Zhihao Cheng
2026-09-22 14:14 ` [PATCH v2 4/4] md/raid10: Don't free conf on raid10_run failure Zhihao Cheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260922150147.D5DC91F00899@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=chengzhihao1@huawei.com \
--cc=linux-raid@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=yukuai@fygo.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.