arm64: dts add Rockchip RK3328 EVB board for wifi
[firefly-linux-kernel-4.4.55.git] / drivers / md / bitmap.c
index 48b5890c28e35ad70484d67b29e12a70cb9a4b1b..4f22e919787aba1bcab7b8f6799a3c22a6b7ce28 100644 (file)
@@ -613,12 +613,10 @@ re_read:
        daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
        write_behind = le32_to_cpu(sb->write_behind);
        sectors_reserved = le32_to_cpu(sb->sectors_reserved);
-       /* XXX: This is a hack to ensure that we don't use clustering
-        *  in case:
-        *      - dm-raid is in use and
-        *      - the nodes written in bitmap_sb is erroneous.
+       /* Setup nodes/clustername only if bitmap version is
+        * cluster-compatible
         */
-       if (!bitmap->mddev->sync_super) {
+       if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) {
                nodes = le32_to_cpu(sb->nodes);
                strlcpy(bitmap->mddev->bitmap_info.cluster_name,
                                sb->cluster_name, 64);
@@ -628,7 +626,7 @@ re_read:
        if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
                reason = "bad magic";
        else if (le32_to_cpu(sb->version) < BITMAP_MAJOR_LO ||
-                le32_to_cpu(sb->version) > BITMAP_MAJOR_HI)
+                le32_to_cpu(sb->version) > BITMAP_MAJOR_CLUSTERED)
                reason = "unrecognized superblock version";
        else if (chunksize < 512)
                reason = "bitmap chunksize too small";
@@ -1572,7 +1570,7 @@ void bitmap_close_sync(struct bitmap *bitmap)
 }
 EXPORT_SYMBOL(bitmap_close_sync);
 
-void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector)
+void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector, bool force)
 {
        sector_t s = 0;
        sector_t blocks;
@@ -1583,7 +1581,7 @@ void bitmap_cond_end_sync(struct bitmap *bitmap, sector_t sector)
                bitmap->last_end_sync = jiffies;
                return;
        }
-       if (time_before(jiffies, (bitmap->last_end_sync
+       if (!force && time_before(jiffies, (bitmap->last_end_sync
                                  + bitmap->mddev->bitmap_info.daemon_sleep)))
                return;
        wait_event(bitmap->mddev->recovery_wait,