]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
md/md-bitmap: handle the case bitmap is not enabled before start_sync()
authorYu Kuai <yukuai3@huawei.com>
Mon, 7 Jul 2025 01:27:03 +0000 (09:27 +0800)
committerYu Kuai <yukuai3@huawei.com>
Sat, 6 Sep 2025 09:11:50 +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-8-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 613e767578aadda5123fedc60fcbcbdda954d604..625f741153524d3f8ca2ee94c2868861a5cec514 100644 (file)
@@ -1787,15 +1787,9 @@ static bool __bitmap_start_sync(struct bitmap *bitmap, sector_t offset,
                                sector_t *blocks, bool degraded)
 {
        bitmap_counter_t *bmc;
-       bool rv;
+       bool rv = false;
 
-       if (bitmap == NULL) {/* FIXME or bitmap set as 'failed' */
-               *blocks = 1024;
-               return true; /* always resync if no bitmap */
-       }
        spin_lock_irq(&bitmap->counts.lock);
-
-       rv = false;
        bmc = md_bitmap_get_counter(&bitmap->counts, offset, blocks, 0);
        if (bmc) {
                /* locked */
index a36ed32ec0d516303753fe6e72e0326665ac0552..7a16de62ee354ed87c4b5fad95cdef1315786b9d 100644 (file)
@@ -124,4 +124,16 @@ static inline bool md_bitmap_enabled(struct mddev *mddev, bool flush)
        return mddev->bitmap_ops->enabled(mddev->bitmap, flush);
 }
 
+static inline bool md_bitmap_start_sync(struct mddev *mddev, sector_t offset,
+                                       sector_t *blocks, bool degraded)
+{
+       /* always resync if no bitmap */
+       if (!md_bitmap_enabled(mddev, false)) {
+               *blocks = 1024;
+               return true;
+       }
+
+       return mddev->bitmap_ops->start_sync(mddev, offset, blocks, degraded);
+}
+
 #endif
index ce24e3d01d4a1d5619bfca3c8bee0d0ad4204ead..1485c3ffe577ab65ef91703a7e220f64ca0cf1fd 100644 (file)
@@ -2829,7 +2829,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
        /* before building a request, check if we can skip these blocks..
         * This call the bitmap_start_sync doesn't actually record anything
         */
-       if (!mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks, true) &&
+       if (!md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, true) &&
            !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
                /* We can skip this block, and probably several more */
                *skipped = 1;
@@ -3004,8 +3004,8 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
                if (len == 0)
                        break;
                if (sync_blocks == 0) {
-                       if (!mddev->bitmap_ops->start_sync(mddev, sector_nr,
-                                               &sync_blocks, still_degraded) &&
+                       if (!md_bitmap_start_sync(mddev, sector_nr,
+                                                 &sync_blocks, still_degraded) &&
                            !conf->fullsync &&
                            !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
                                break;
index 269187faa011b92a2257a195883fbff805bf1f72..eeaf7eaf8a0757ec76729fd1b1d5d9c4f2e2f817 100644 (file)
@@ -3351,9 +3351,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                         * we only need to recover the block if it is set in
                         * the bitmap
                         */
-                       must_sync = mddev->bitmap_ops->start_sync(mddev, sect,
-                                                                 &sync_blocks,
-                                                                 true);
+                       must_sync = md_bitmap_start_sync(mddev, sect,
+                                                        &sync_blocks, true);
                        if (sync_blocks < max_sync)
                                max_sync = sync_blocks;
                        if (!must_sync &&
@@ -3396,9 +3395,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                }
                        }
 
-                       must_sync = mddev->bitmap_ops->start_sync(mddev, sect,
-                                               &sync_blocks, still_degraded);
-
+                       md_bitmap_start_sync(mddev, sect, &sync_blocks,
+                                            still_degraded);
                        any_working = 0;
                        for (j=0; j<conf->copies;j++) {
                                int k;
@@ -3574,9 +3572,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
                                        mddev_is_clustered(mddev) &&
                                        (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high));
 
-               if (!mddev->bitmap_ops->start_sync(mddev, sector_nr,
-                                                  &sync_blocks,
-                                                  mddev->degraded) &&
+               if (!md_bitmap_start_sync(mddev, sector_nr, &sync_blocks,
+                                         mddev->degraded) &&
                    !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED,
                                                 &mddev->recovery)) {
                        /* We can skip this block */
index bb95069e31f3f5a85062d44788cf2b6b00f05f46..dbbf9290417a012751090cc1bb634c666b299126 100644 (file)
@@ -6525,8 +6525,7 @@ static inline sector_t raid5_sync_request(struct mddev *mddev, sector_t sector_n
        }
        if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
            !conf->fullsync &&
-           !mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks,
-                                          true) &&
+           !md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, true) &&
            sync_blocks >= RAID5_STRIPE_SECTORS(conf)) {
                /* we can skip this block, and probably more */
                do_div(sync_blocks, RAID5_STRIPE_SECTORS(conf));
@@ -6557,9 +6556,7 @@ static inline sector_t raid5_sync_request(struct mddev *mddev, sector_t sector_n
                        still_degraded = true;
        }
 
-       mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks,
-                                     still_degraded);
-
+       md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, still_degraded);
        set_bit(STRIPE_SYNC_REQUESTED, &sh->state);
        set_bit(STRIPE_HANDLE, &sh->state);