]> git.baikalelectronics.ru Git - kernel.git/commit
md: move bitmap_destroy to the beginning of __md_stop
authorGuoqing Jiang <gqjiang@suse.com>
Tue, 14 Mar 2017 01:40:20 +0000 (09:40 +0800)
committerShaohua Li <shli@fb.com>
Thu, 16 Mar 2017 23:55:58 +0000 (16:55 -0700)
commit18f37975fcd87a92849b0de501c99c415bc3b0fd
treefa449f9bdc074689955e4c6d8f5d62087b619c77
parent323a467a01cee9336559269dd859a9b78503e8b7
md: move bitmap_destroy to the beginning of __md_stop

Since we have switched to sync way to handle METADATA_UPDATED
msg for md-cluster, then process_metadata_update is depended
on mddev->thread->wqueue.

With the new change, clustered raid could possible hang if
array received a METADATA_UPDATED msg after array unregistered
mddev->thread, so we need to stop clustered raid (bitmap_destroy
-> bitmap_free -> md_cluster_stop) earlier than unregister
thread (mddev_detach -> md_unregister_thread).

And this change should be safe for non-clustered raid since
all writes are stopped before the destroy. Also in md_run,
we activate the personality (pers->run()) before activating
the bitmap (bitmap_create()). So it is pleasingly symmetric
to stop the bitmap (bitmap_destroy()) before stopping the
personality (__md_stop() calls pers->free()), we achieve this
by move bitmap_destroy to the beginning of __md_stop.

But we don't want to break the codes for waiting behind IO as
Shaohua mentioned, so introduce bitmap_wait_behind_writes to
call the codes, and call the new fun in both mddev_detach and
bitmap_destroy, then we will not break original behind IO code
and also fit the new condition well.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/bitmap.c
drivers/md/bitmap.h
drivers/md/md.c