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: NeilBrown <neilb@suse.de>
This commit is contained in:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user