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

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: default avatarYu Kuai <yukuai3@huawei.com>
Reviewed-by: default avatarXiao Ni <xni@redhat.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarLi Nan <linan122@huawei.com>
parent 7797da14
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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,
+8 −4
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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);
	}

+1 −0
Original line number Diff line number Diff line
@@ -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;
};