Re: [PATCH 4/4] md: include events counters when kicking non-fresh device
"yu kuai" <[email protected]> Mon, 20 Jul 2026 10:14:19 +0800
| Newsgroups | org.kernel.vger.linux-raid,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi, 在 2026/7/19 22:44, Mykola Marzhan 写道: > When analyze_sbs() kicks a member with a stale events counter, the > warning names the device but not the divergence that caused the > kick, so judging whether the kicked member is salvageable means > running mdadm --examine on every member. Print the member's on-disk > events counter and the freshest events counter in the warning > itself. If user space tools can do this already, then user space tools should be considered preferred. > > rdev->sb_events cannot be used here: it is only assigned when a > superblock is written and still reads 0 during assemble. Read the > counter from the superblock page instead -- md_event() for 0.90 > metadata, the little-endian events field for 1.x. > > The legacy substring "kicking non-fresh %pg from array!" is > unchanged, so existing log parsers continue to match. > > Assisted-by: Claude-Code:claude-opus-4-8 > Signed-off-by: Mykola Marzhan <[email protected]> > --- > drivers/md/md.c | 25 +++++++++++++++++++++++-- > 1 file changed, 23 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index d60ea7aaca3a..9ec87375a717 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -3934,8 +3934,29 @@ static int analyze_sbs(struct mddev *mddev) > if (rdev != freshest) { > if (super_types[mddev->major_version]. > validate_super(mddev, freshest, rdev)) { > - pr_warn("md: kicking non-fresh %pg from array!\n", > - rdev->bdev); > + u64 rdev_events = 0; > + > + /* > + * rdev->sb_events is only assigned when > + * writing a superblock and reads 0 during > + * assemble; read events from the on-disk > + * superblock instead. > + */ > + if (rdev->sb_page) { > + if (mddev->major_version == 1) { > + struct mdp_superblock_1 *sb = > + page_address(rdev->sb_page); > + rdev_events = le64_to_cpu(sb->events); > + } else if (mddev->major_version == 0) { > + mdp_super_t *sb = > + page_address(rdev->sb_page); > + rdev_events = md_event(sb); > + } > + } > + pr_warn("md: kicking non-fresh %pg from array! (events=%llu, freshest=%llu)\n", > + rdev->bdev, > + (unsigned long long)rdev_events, > + (unsigned long long)mddev->events); And I don't like the above changes. If you really want such log, please add it inside validate_super() methods. > md_kick_rdev_from_array(rdev); > continue; > } -- Thanks, Kuai