]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
md/md-bitmap: handle the case bitmap is not enabled before end_sync()
authorYu Kuai <yukuai3@huawei.com>
Mon, 7 Jul 2025 01:27:04 +0000 (09:27 +0800)
committerYu Kuai <yukuai3@huawei.com>
Sat, 6 Sep 2025 09:11:54 +0000 (17:11 +0800)
This case can be handled without knowing internal implementation.

Prepare to introduce CONFIG_MD_BITMAP.

Link: https://lore.kernel.org/linux-raid/20250707012711.376844-9-yukuai1@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Xiao Ni <xni@redhat.com>
drivers/md/md-bitmap.c
drivers/md/md-bitmap.h
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c

index 625f741153524d3f8ca2ee94c2868861a5cec514..62b0eac28a7d291a2e38044d622369e167e87e44 100644 (file)
@@ -1838,10 +1838,6 @@ static void __bitmap_end_sync(struct bitmap *bitmap, sector_t offset,
        bitmap_counter_t *bmc;
        unsigned long flags;
 
-       if (bitmap == NULL) {
-               *blocks = 1024;
-               return;
-       }
        spin_lock_irqsave(&bitmap->counts.lock, flags);
        bmc = md_bitmap_get_counter(&bitmap->counts, offset, blocks, 0);
        if (bmc == NULL)
index 7a16de62ee354ed87c4b5fad95cdef1315786b9d..61cfc650c69cf27d473cb5df2972168a621d079b 100644 (file)
@@ -136,4 +136,15 @@ static inline bool md_bitmap_start_sync(struct mddev *mddev, sector_t offset,
        return mddev->bitmap_ops->start_sync(mddev, offset, blocks, degraded);
 }
 
+static inline void md_bitmap_end_sync(struct mddev *mddev, sector_t offset,
+                                     sector_t *blocks)
+{
+       if (!md_bitmap_enabled(mddev, false)) {
+               *blocks = 1024;
+               return;
+       }
+
+       mddev->bitmap_ops->end_sync(mddev, offset, blocks);
+}
+
 #endif
index 1485c3ffe577ab65ef91703a7e220f64ca0cf1fd..0864da7d9adcd1c674a2496d0c3865efe6b433da 100644 (file)
@@ -2057,7 +2057,7 @@ static void abort_sync_write(struct mddev *mddev, struct r1bio *r1_bio)
 
        /* make sure these bits don't get cleared. */
        do {
-               mddev->bitmap_ops->end_sync(mddev, s, &sync_blocks);
+               md_bitmap_end_sync(mddev, s, &sync_blocks);
                s += sync_blocks;
                sectors_to_go -= sync_blocks;
        } while (sectors_to_go > 0);
@@ -2804,8 +2804,8 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
                 * We can find the current addess in mddev->curr_resync
                 */
                if (mddev->curr_resync < max_sector) /* aborted */
-                       mddev->bitmap_ops->end_sync(mddev, mddev->curr_resync,
-                                                   &sync_blocks);
+                       md_bitmap_end_sync(mddev, mddev->curr_resync,
+                                          &sync_blocks);
                else /* completed sync */
                        conf->fullsync = 0;
 
index eeaf7eaf8a0757ec76729fd1b1d5d9c4f2e2f817..d047e9dfdb85006d08f98d68bcbcd26a378aae88 100644 (file)
@@ -3221,15 +3221,13 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
 
                if (mddev->curr_resync < max_sector) { /* aborted */
                        if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
-                               mddev->bitmap_ops->end_sync(mddev,
-                                                           mddev->curr_resync,
-                                                           &sync_blocks);
+                               md_bitmap_end_sync(mddev, mddev->curr_resync,
+                                                  &sync_blocks);
                        else for (i = 0; i < conf->geo.raid_disks; i++) {
                                sector_t sect =
                                        raid10_find_virt(conf, mddev->curr_resync, i);
 
-                               mddev->bitmap_ops->end_sync(mddev, sect,
-                                                           &sync_blocks);
+                               md_bitmap_end_sync(mddev, sect, &sync_blocks);
                        }
                } else {
                        /* completed sync */
index dbbf9290417a012751090cc1bb634c666b299126..955906bd477834258fb301952ca80bc99468a69f 100644 (file)
@@ -6492,8 +6492,8 @@ static inline sector_t raid5_sync_request(struct mddev *mddev, sector_t sector_n
                }
 
                if (mddev->curr_resync < max_sector) /* aborted */
-                       mddev->bitmap_ops->end_sync(mddev, mddev->curr_resync,
-                                                   &sync_blocks);
+                       md_bitmap_end_sync(mddev, mddev->curr_resync,
+                                          &sync_blocks);
                else /* completed sync */
                        conf->fullsync = 0;
                mddev->bitmap_ops->close_sync(mddev);