md/md-bitmap: support discard for bitmap ops
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>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
+11
-4
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user