Commit bb74b093 authored by Yu Kuai's avatar Yu Kuai
Browse files

md/md-bitmap: handle the case bitmap is not enabled before end_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-9-yukuai1@huaweicloud.com


Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarXiao Ni <xni@redhat.com>
parent 5ae58d15
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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)
+11 −0
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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,7 +2804,7 @@ 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,
			md_bitmap_end_sync(mddev, mddev->curr_resync,
					   &sync_blocks);
		else /* completed sync */
			conf->fullsync = 0;
+3 −5
Original line number Diff line number Diff line
@@ -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,
				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 */
+2 −2
Original line number Diff line number Diff line
@@ -6492,7 +6492,7 @@ 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,
			md_bitmap_end_sync(mddev, mddev->curr_resync,
					   &sync_blocks);
		else /* completed sync */
			conf->fullsync = 0;