]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
md/md-bitmap: support discard for bitmap ops
authorYu Kuai <yukuai3@huawei.com>
Fri, 29 Aug 2025 08:04:18 +0000 (16:04 +0800)
committerYu Kuai <yukuai3@huawei.com>
Sat, 6 Sep 2025 09:18:19 +0000 (17:18 +0800)
Use two new methods {start, end}_discard in bitmap_ops and a new field 'rw'
in struct md_io_clone to handle discard IO, prepare to support new md
bitmap.

Since all bitmap functions to hanlde write IO are the same, also add
typedef to make code cleaner.

Link: https://lore.kernel.org/linux-raid/20250829080426.1441678-4-yukuai1@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Xiao Ni <xni@redhat.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Li Nan <linan122@huawei.com>
drivers/md/md-bitmap.c
drivers/md/md-bitmap.h
drivers/md/md.c
drivers/md/md.h

index b157119de123fa3d534fcb71649cad634e1355ec..dc050ff94d5b1cf47e63e46ef6f269fc20e882cd 100644 (file)
@@ -3005,6 +3005,9 @@ static struct bitmap_operations bitmap_ops = {
 
        .start_write            = bitmap_start_write,
        .end_write              = bitmap_end_write,
+       .start_discard          = bitmap_start_write,
+       .end_discard            = bitmap_end_write,
+
        .start_sync             = bitmap_start_sync,
        .end_sync               = bitmap_end_sync,
        .cond_end_sync          = bitmap_cond_end_sync,
index 42f91755a341967845cb9e393adc564566e3c2ed..8616ced49077d30a0eaa26d495b2ed8cf914a103 100644 (file)
@@ -61,6 +61,9 @@ struct md_bitmap_stats {
        struct file     *file;
 };
 
+typedef void (md_bitmap_fn)(struct mddev *mddev, sector_t offset,
+                           unsigned long sectors);
+
 struct bitmap_operations {
        struct md_submodule_head head;
 
@@ -81,10 +84,11 @@ struct bitmap_operations {
        void (*end_behind_write)(struct mddev *mddev);
        void (*wait_behind_writes)(struct mddev *mddev);
 
-       void (*start_write)(struct mddev *mddev, sector_t offset,
-                           unsigned long sectors);
-       void (*end_write)(struct mddev *mddev, sector_t offset,
-                         unsigned long sectors);
+       md_bitmap_fn *start_write;
+       md_bitmap_fn *end_write;
+       md_bitmap_fn *start_discard;
+       md_bitmap_fn *end_discard;
+
        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);
index 4bc35362f4d0ad6ccca3661f09ac6362f1de67fc..8a89dca8209c660a7f94db1908f09e18a278a4bc 100644 (file)
@@ -8933,18 +8933,24 @@ EXPORT_SYMBOL_GPL(md_submit_discard_bio);
 static void md_bitmap_start(struct mddev *mddev,
                            struct md_io_clone *md_io_clone)
 {
+       md_bitmap_fn *fn = unlikely(md_io_clone->rw == STAT_DISCARD) ?
+                          mddev->bitmap_ops->start_discard :
+                          mddev->bitmap_ops->start_write;
+
        if (mddev->pers->bitmap_sector)
                mddev->pers->bitmap_sector(mddev, &md_io_clone->offset,
                                           &md_io_clone->sectors);
 
-       mddev->bitmap_ops->start_write(mddev, md_io_clone->offset,
-                                      md_io_clone->sectors);
+       fn(mddev, md_io_clone->offset, md_io_clone->sectors);
 }
 
 static void md_bitmap_end(struct mddev *mddev, struct md_io_clone *md_io_clone)
 {
-       mddev->bitmap_ops->end_write(mddev, md_io_clone->offset,
-                                    md_io_clone->sectors);
+       md_bitmap_fn *fn = unlikely(md_io_clone->rw == STAT_DISCARD) ?
+                          mddev->bitmap_ops->end_discard :
+                          mddev->bitmap_ops->end_write;
+
+       fn(mddev, md_io_clone->offset, md_io_clone->sectors);
 }
 
 static void md_end_clone_io(struct bio *bio)
@@ -8983,6 +8989,7 @@ static void md_clone_bio(struct mddev *mddev, struct bio **bio)
        if (bio_data_dir(*bio) == WRITE && md_bitmap_enabled(mddev, false)) {
                md_io_clone->offset = (*bio)->bi_iter.bi_sector;
                md_io_clone->sectors = bio_sectors(*bio);
+               md_io_clone->rw = op_stat_group(bio_op(*bio));
                md_bitmap_start(mddev, md_io_clone);
        }
 
index 5ef73109d14d9fa56a7f4d5ef078de93b8e16b89..1b767b5320cfb095f70755a82e1c84eff8d79d44 100644 (file)
@@ -872,6 +872,7 @@ struct md_io_clone {
        unsigned long   start_time;
        sector_t        offset;
        unsigned long   sectors;
+       enum stat_group rw;
        struct bio      bio_clone;
 };