Commit 5ae58d15 authored by Yu Kuai's avatar Yu Kuai
Browse files

md/md-bitmap: handle the case bitmap is not enabled before start_sync()

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: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarXiao Ni <xni@redhat.com>
parent 11033207
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -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 */
+12 −0
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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,7 +3004,7 @@ 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,
			if (!md_bitmap_start_sync(mddev, sector_nr,
						  &sync_blocks, still_degraded) &&
			    !conf->fullsync &&
			    !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
+6 −9
Original line number Diff line number Diff line
@@ -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,8 +3572,7 @@ 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,
		if (!md_bitmap_start_sync(mddev, sector_nr, &sync_blocks,
					  mddev->degraded) &&
		    !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED,
						 &mddev->recovery)) {
+2 −5
Original line number Diff line number Diff line
@@ -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);