Merge remote-tracking branches 'asoc/topic/rt5670', 'asoc/topic/rt5677', 'asoc/topic...
[firefly-linux-kernel-4.4.55.git] / drivers / md / bitmap.c
index 1695ee5f3ffc30b883c83c1926745ba22e48a7e1..3a5767968ba06c3083180f4299c5851f454289a8 100644 (file)
@@ -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;
@@ -2209,11 +2211,13 @@ __ATTR(metadata, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
 static ssize_t can_clear_show(struct mddev *mddev, char *page)
 {
        int len;
+       spin_lock(&mddev->lock);
        if (mddev->bitmap)
                len = sprintf(page, "%s\n", (mddev->bitmap->need_sync ?
                                             "false" : "true"));
        else
                len = sprintf(page, "\n");
+       spin_unlock(&mddev->lock);
        return len;
 }
 
@@ -2238,10 +2242,15 @@ __ATTR(can_clear, S_IRUGO|S_IWUSR, can_clear_show, can_clear_store);
 static ssize_t
 behind_writes_used_show(struct mddev *mddev, char *page)
 {
+       ssize_t ret;
+       spin_lock(&mddev->lock);
        if (mddev->bitmap == NULL)
-               return sprintf(page, "0\n");
-       return sprintf(page, "%lu\n",
-                      mddev->bitmap->behind_writes_used);
+               ret = sprintf(page, "0\n");
+       else
+               ret = sprintf(page, "%lu\n",
+                             mddev->bitmap->behind_writes_used);
+       spin_unlock(&mddev->lock);
+       return ret;
 }
 
 static ssize_t