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

Commit defad61a authored by NeilBrown's avatar NeilBrown
Browse files

md: md_stop_writes requires mddev_lock.



As md_stop_writes manipulates the sync_thread and calls md_update_sb,
it need to be called with mddev_lock held.

In all internal cases it is, but the symbol is exported for dm-raid to
call and in that case the lock won't be help.
Do make an exported version which takes the lock, and an internal
version which does not.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 43c73ca4
Loading
Loading
Loading
Loading
+10 −3
Original line number Original line Diff line number Diff line
@@ -4704,7 +4704,7 @@ static void md_clean(mddev_t *mddev)
	mddev->plug = NULL;
	mddev->plug = NULL;
}
}


void md_stop_writes(mddev_t *mddev)
static void __md_stop_writes(mddev_t *mddev)
{
{
	if (mddev->sync_thread) {
	if (mddev->sync_thread) {
		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
@@ -4724,6 +4724,13 @@ void md_stop_writes(mddev_t *mddev)
		md_update_sb(mddev, 1);
		md_update_sb(mddev, 1);
	}
	}
}
}

void md_stop_writes(mddev_t *mddev)
{
	mddev_lock(mddev);
	__md_stop_writes(mddev);
	mddev_unlock(mddev);
}
EXPORT_SYMBOL_GPL(md_stop_writes);
EXPORT_SYMBOL_GPL(md_stop_writes);


void md_stop(mddev_t *mddev)
void md_stop(mddev_t *mddev)
@@ -4748,7 +4755,7 @@ static int md_set_readonly(mddev_t *mddev, int is_open)
		goto out;
		goto out;
	}
	}
	if (mddev->pers) {
	if (mddev->pers) {
		md_stop_writes(mddev);
		__md_stop_writes(mddev);


		err  = -ENXIO;
		err  = -ENXIO;
		if (mddev->ro==1)
		if (mddev->ro==1)
@@ -4785,7 +4792,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
		if (mddev->ro)
		if (mddev->ro)
			set_disk_ro(disk, 0);
			set_disk_ro(disk, 0);


		md_stop_writes(mddev);
		__md_stop_writes(mddev);
		md_stop(mddev);
		md_stop(mddev);
		mddev->queue->merge_bvec_fn = NULL;
		mddev->queue->merge_bvec_fn = NULL;
		mddev->queue->unplug_fn = NULL;
		mddev->queue->unplug_fn = NULL;