]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
md/md-bitmap: add 'sync_size' into struct md_bitmap_stats
authorYu Kuai <yukuai3@huawei.com>
Mon, 26 Aug 2024 07:44:16 +0000 (15:44 +0800)
committerSong Liu <song@kernel.org>
Tue, 27 Aug 2024 17:14:15 +0000 (10:14 -0700)
To avoid dereferencing bitmap directly in md-cluster to prepare
inventing a new bitmap.

BTW, also fix following checkpatch warnings:

WARNING: Deprecated use of 'kmap_atomic', prefer 'kmap_local_page' instead
WARNING: Deprecated use of 'kunmap_atomic', prefer 'kunmap_local' instead

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20240826074452.1490072-7-yukuai1@huaweicloud.com
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/md-bitmap.c
drivers/md/md-bitmap.h
drivers/md/md-cluster.c

index 95afc22bd2557119babf34c4c48902c2c031ed70..33812543d984ceebb69a47b076b29de164083bab 100644 (file)
@@ -2097,10 +2097,15 @@ EXPORT_SYMBOL_GPL(md_bitmap_copy_from_slot);
 int md_bitmap_get_stats(struct bitmap *bitmap, struct md_bitmap_stats *stats)
 {
        struct bitmap_counts *counts;
+       bitmap_super_t *sb;
 
        if (!bitmap)
                return -ENOENT;
 
+       sb = kmap_local_page(bitmap->storage.sb_page);
+       stats->sync_size = le64_to_cpu(sb->sync_size);
+       kunmap_local(sb);
+
        counts = &bitmap->counts;
        stats->missing_pages = counts->missing_pages;
        stats->pages = counts->pages;
@@ -2110,6 +2115,7 @@ int md_bitmap_get_stats(struct bitmap *bitmap, struct md_bitmap_stats *stats)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(md_bitmap_get_stats);
 
 int md_bitmap_resize(struct bitmap *bitmap, sector_t blocks,
                  int chunksize, int init)
index 751dca2366c354475fafcbfb9962e720238b8f04..a43a75575769159620c0357754b324fc2ad075b6 100644 (file)
@@ -237,6 +237,7 @@ struct bitmap {
 struct md_bitmap_stats {
        u64             events_cleared;
        unsigned long   missing_pages;
+       unsigned long   sync_size;
        unsigned long   pages;
        struct file     *file;
 };
index e642361b6526fff8b865d9f1b67906ed2ca3fb59..e3faf752f0b1fd69a1947a2dca7b2694d6fbfd0a 100644 (file)
@@ -1207,18 +1207,21 @@ out:
  */
 static int cluster_check_sync_size(struct mddev *mddev)
 {
-       int i, rv;
-       bitmap_super_t *sb;
-       unsigned long my_sync_size, sync_size = 0;
-       int node_num = mddev->bitmap_info.nodes;
        int current_slot = md_cluster_ops->slot_number(mddev);
+       int node_num = mddev->bitmap_info.nodes;
        struct bitmap *bitmap = mddev->bitmap;
-       char str[64];
        struct dlm_lock_resource *bm_lockres;
+       struct md_bitmap_stats stats;
+       unsigned long sync_size = 0;
+       unsigned long my_sync_size;
+       char str[64];
+       int i, rv;
 
-       sb = kmap_atomic(bitmap->storage.sb_page);
-       my_sync_size = le64_to_cpu(sb->sync_size);
-       kunmap_atomic(sb);
+       rv = md_bitmap_get_stats(bitmap, &stats);
+       if (rv)
+               return rv;
+
+       my_sync_size = stats.sync_size;
 
        for (i = 0; i < node_num; i++) {
                if (i == current_slot)
@@ -1247,15 +1250,18 @@ static int cluster_check_sync_size(struct mddev *mddev)
                        md_bitmap_update_sb(bitmap);
                lockres_free(bm_lockres);
 
-               sb = kmap_atomic(bitmap->storage.sb_page);
-               if (sync_size == 0)
-                       sync_size = le64_to_cpu(sb->sync_size);
-               else if (sync_size != le64_to_cpu(sb->sync_size)) {
-                       kunmap_atomic(sb);
+               rv = md_bitmap_get_stats(bitmap, &stats);
+               if (rv) {
+                       md_bitmap_free(bitmap);
+                       return rv;
+               }
+
+               if (sync_size == 0) {
+                       sync_size = stats.sync_size;
+               } else if (sync_size != stats.sync_size) {
                        md_bitmap_free(bitmap);
                        return -1;
                }
-               kunmap_atomic(sb);
                md_bitmap_free(bitmap);
        }