From: Yu Kuai Date: Fri, 29 Aug 2025 08:04:22 +0000 (+0800) Subject: md/md-bitmap: add a new method skip_sync_blocks() in bitmap_operations X-Git-Tag: v6.18-rc1~136^2~62^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f196d72888640e35002ac3511757cefaa9c5e339;p=thirdparty%2Flinux.git md/md-bitmap: add a new method skip_sync_blocks() in bitmap_operations This method is used to check if blocks can be skipped before calling into pers->sync_request(), llbitmap will use this method to skip resync for unwritten/clean data blocks, and recovery/check/repair for unwritten data blocks; Link: https://lore.kernel.org/linux-raid/20250829080426.1441678-8-yukuai1@huaweicloud.com Signed-off-by: Yu Kuai Reviewed-by: Christoph Hellwig Reviewed-by: Xiao Ni Reviewed-by: Hannes Reinecke Reviewed-by: Li Nan --- diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 8616ced49077d..95453696c68e4 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -89,6 +89,7 @@ struct bitmap_operations { md_bitmap_fn *start_discard; md_bitmap_fn *end_discard; + sector_t (*skip_sync_blocks)(struct mddev *mddev, sector_t offset); bool (*start_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks, bool degraded); void (*end_sync)(struct mddev *mddev, sector_t offset, sector_t *blocks); diff --git a/drivers/md/md.c b/drivers/md/md.c index 51dee0a98af1c..ec80c8d6cbcb7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9460,6 +9460,12 @@ void md_do_sync(struct md_thread *thread) if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) break; + if (mddev->bitmap_ops && mddev->bitmap_ops->skip_sync_blocks) { + sectors = mddev->bitmap_ops->skip_sync_blocks(mddev, j); + if (sectors) + goto update; + } + sectors = mddev->pers->sync_request(mddev, j, max_sectors, &skipped); if (sectors == 0) { @@ -9475,6 +9481,7 @@ void md_do_sync(struct md_thread *thread) if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) break; +update: j += sectors; if (j > max_sectors) /* when skipping, extra large numbers can be returned. */