Commit 5f286f33 authored by Xiao Ni's avatar Xiao Ni Committed by Yu Kuai
Browse files

md: Don't clear MD_CLOSING until mddev is freed



UNTIL_STOP is used to avoid mddev is freed on the last close before adding
disks to mddev. And it should be cleared when stopping an array which is
mentioned in commit efeb53c0 ("md: Allow md devices to be created by
name."). So reset ->hold_active to 0 in md_clean.

And MD_CLOSING should be kept until mddev is freed to avoid reopen.

Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Signed-off-by: default avatarXiao Ni <xni@redhat.com>
Link: https://lore.kernel.org/linux-raid/20250611073108.25463-3-xni@redhat.com


Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
parent 9e59d609
Loading
Loading
Loading
Loading
+4 −12
Original line number Diff line number Diff line
@@ -6425,14 +6425,9 @@ static void md_clean(struct mddev *mddev)
	mddev->persistent = 0;
	mddev->level = LEVEL_NONE;
	mddev->clevel[0] = 0;
	/*
	 * Don't clear MD_CLOSING, or mddev can be opened again.
	 * 'hold_active != 0' means mddev is still in the creation
	 * process and will be used later.
	 */
	if (mddev->hold_active)
		mddev->flags = 0;
	else
	/* if UNTIL_STOP is set, it's cleared here */
	mddev->hold_active = 0;
	/* Don't clear MD_CLOSING, or mddev can be opened again. */
	mddev->flags &= BIT_ULL_MASK(MD_CLOSING);
	mddev->sb_flags = 0;
	mddev->ro = MD_RDWR;
@@ -6660,9 +6655,6 @@ static int do_md_stop(struct mddev *mddev, int mode)
		export_array(mddev);
		md_clean(mddev);
		set_bit(MD_DELETED, &mddev->flags);

		if (mddev->hold_active == UNTIL_STOP)
			mddev->hold_active = 0;
	}
	md_new_event();
	sysfs_notify_dirent_safe(mddev->sysfs_state);