public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
To: Yu Kuai <yukuai1@huaweicloud.com>
Cc: song@kernel.org, linux-raid@vger.kernel.org,
	linux-kernel@vger.kernel.org, yukuai3@huawei.com,
	yi.zhang@huawei.com, yangerkun@huawei.com
Subject: Re: [PATCH -next] md: wake up mdmon after setting badblocks
Date: Mon, 5 Aug 2024 11:40:24 +0200	[thread overview]
Message-ID: <20240805114024.00007877@linux.intel.com> (raw)
In-Reply-To: <20240801125148.251986-1-yukuai1@huaweicloud.com>

On Thu,  1 Aug 2024 20:51:48 +0800
Yu Kuai <yukuai1@huaweicloud.com> wrote:

> From: Yu Kuai <yukuai3@huawei.com>
> 
> For external super_block, mdmon rely on "mddev->sysfs_state" to update
> super_block. However, rdev_set_badblocks() will set sb_flags without
> waking up mdmon, which might cauing IO hang due to suepr_block can't be
> updated.
> 
> This problem is found by code review.
> 
> Signed-off-by: Yu Kuai <yukuai3@huawei.com>
> ---
>  drivers/md/md.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 23cc77d51676..06d6ee8cd543 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -9831,10 +9831,12 @@ int rdev_set_badblocks(struct md_rdev *rdev, sector_t
> s, int sectors, /* Make sure they get written out promptly */
>  		if (test_bit(ExternalBbl, &rdev->flags))
>  			sysfs_notify_dirent_safe(rdev->sysfs_unack_badblocks);
> -		sysfs_notify_dirent_safe(rdev->sysfs_state);
>  		set_mask_bits(&mddev->sb_flags, 0,
>  			      BIT(MD_SB_CHANGE_CLEAN) |
> BIT(MD_SB_CHANGE_PENDING)); md_wakeup_thread(rdev->mddev->thread);
> +
> +		sysfs_notify_dirent_safe(rdev->sysfs_state);
> +		sysfs_notify_dirent_safe(mddev->sysfs_state);
>  		return 1;
>  	} else
>  		return 0;


Hey Kuai,
Later, I realized that mdmon is attached to various fds:

Here a mdmon code:

add_fd(&rfds, &maxfd, a->info.state_fd);	#mddev->sysfs_state
add_fd(&rfds, &maxfd, a->action_fd);		#mddev->sysfs_action
add_fd(&rfds, &maxfd, a->sync_completed_fd);	#mddev->resync_position


for (mdi = a->info.devs ; mdi ; mdi = mdi->next) { #for each rdev
	add_fd(&rfds, &maxfd, mdi->state_fd);		#rdev->sysfs_state
	add_fd(&rfds, &maxfd, mdi->bb_fd);		#rdev->sysfs_badblocks
	add_fd(&rfds, &maxfd, mdi->ubb_fd);
#rdev->sysfs_unack_badblocks }

Notification in rdev->sysfs_state is fine. The problem was somewhere else
(mdmon blocked on "rdev remove"). And It will be fixed by moving rdev remove to
managemon because it is blocking action now.

https://github.com/md-raid-utilities/mdadm/pull/66

I think it is fine to move this down after set_mask_bits, but we don't
have to repeat notification to mddev->state.

Thanks,
Mariusz

  reply	other threads:[~2024-08-05  9:40 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-01 12:51 [PATCH -next] md: wake up mdmon after setting badblocks Yu Kuai
2024-08-05  9:40 ` Mariusz Tkaczyk [this message]
2024-08-05 11:08   ` Yu Kuai

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=20240805114024.00007877@linux.intel.com \
    --to=mariusz.tkaczyk@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-raid@vger.kernel.org \
    --cc=song@kernel.org \
    --cc=yangerkun@huawei.com \
    --cc=yi.zhang@huawei.com \
    --cc=yukuai1@huaweicloud.com \
    --cc=yukuai3@huawei.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox