From: Yu Kuai <yuku...@huawei.com>

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.

Signed-off-by: Yu Kuai <yuku...@huawei.com>
Reviewed-by: Xiao Ni <x...@redhat.com>
Reviewed-by: Hannes Reinecke <h...@suse.de>
---
 drivers/md/md-bitmap.c |  3 +++
 drivers/md/md-bitmap.h | 12 ++++++++----
 drivers/md/md.c        | 15 +++++++++++----
 drivers/md/md.h        |  1 +
 4 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
index 3c8b8ecf0695..0eb3774f372d 100644
--- a/drivers/md/md-bitmap.c
+++ b/drivers/md/md-bitmap.c
@@ -3006,6 +3006,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,
diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h
index 42f91755a341..8616ced49077 100644
--- a/drivers/md/md-bitmap.h
+++ b/drivers/md/md-bitmap.h
@@ -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);
diff --git a/drivers/md/md.c b/drivers/md/md.c
index a70d8536075c..b3af0172f4e2 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8855,18 +8855,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)
@@ -8905,6 +8911,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);
        }
 
diff --git a/drivers/md/md.h b/drivers/md/md.h
index ae8e7a9c5cc4..5c1da47fe73b 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -850,6 +850,7 @@ struct md_io_clone {
        unsigned long   start_time;
        sector_t        offset;
        unsigned long   sectors;
+       enum stat_group rw;
        struct bio      bio_clone;
 };
 
-- 
2.39.2


Reply via email to