summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-12-15 02:56:58 +0100
committerNeilBrown <neilb@suse.de>2015-02-05 23:32:55 +0100
commit978a7a47cae79ae7a7b5a1e80bfcaef6ee700312 (patch)
treef9f479f5a662ddc9cd482d0e46c7e21e3ca3783b
parentmd: protect ->pers changes with mddev->lock (diff)
downloadlinux-978a7a47cae79ae7a7b5a1e80bfcaef6ee700312.tar.xz
linux-978a7a47cae79ae7a7b5a1e80bfcaef6ee700312.zip
md/bitmap: protect clearing of ->bitmap by mddev->lock
This makes it safe to inspect the struct while holding only the spinlock. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/bitmap.c2
-rw-r--r--drivers/md/md.h1
2 files changed, 3 insertions, 0 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 1695ee5f3ffc..3424b1915fc4 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -1619,7 +1619,9 @@ void bitmap_destroy(struct mddev *mddev)
return;
mutex_lock(&mddev->bitmap_info.mutex);
+ spin_lock(&mddev->lock);
mddev->bitmap = NULL; /* disconnect from the md device */
+ spin_unlock(&mddev->lock);
mutex_unlock(&mddev->bitmap_info.mutex);
if (mddev->thread)
mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index e41559dccdc9..8770308a8052 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -392,6 +392,7 @@ struct mddev {
* clearing MD_CHANGE_*
* in_sync - and related safemode and MD_CHANGE changes
* pers (also protected by reconfig_mutex and pending IO).
+ * clearing ->bitmap
*/
spinlock_t lock;
wait_queue_head_t sb_wait; /* for waiting on superblock updates */