Commit defad61a authored by NeilBrown's avatar NeilBrown

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
...@@ -4704,7 +4704,7 @@ static void md_clean(mddev_t *mddev) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment