Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 060b0689 authored by NeilBrown's avatar NeilBrown Committed by Shaohua Li
Browse files

md: perform async updates for metadata where possible.



When adding devices to, or removing device from, an array we need to
update the metadata.  However we don't need to do it synchronously as
data integrity doesn't depend on these changes being recorded
instantly.  So avoid the synchronous call to md_update_sb and just set
a flag so that the thread will do it.

This can reduce the number of updates performed when lots of devices
are being added or removed.

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent 3fd880af
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -2599,8 +2599,10 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)

			if (err == 0) {
				md_kick_rdev_from_array(rdev);
				if (mddev->pers)
					md_update_sb(mddev, 1);
				if (mddev->pers) {
					set_bit(MD_CHANGE_DEVS, &mddev->flags);
					md_wakeup_thread(mddev->thread);
				}
				md_new_event(mddev);
			}
		}
@@ -6175,6 +6177,10 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
		md_cluster_ops->remove_disk(mddev, rdev);

	md_kick_rdev_from_array(rdev);
	set_bit(MD_CHANGE_DEVS, &mddev->flags);
	if (mddev->thread)
		md_wakeup_thread(mddev->thread);
	else
		md_update_sb(mddev, 1);
	md_new_event(mddev);

@@ -6240,6 +6246,8 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)

	rdev->raid_disk = -1;

	set_bit(MD_CHANGE_DEVS, &mddev->flags);
	if (!mddev->thread)
		md_update_sb(mddev, 1);
	/*
	 * Kick recovery, maybe this spare has to be added to the