On Sat, May 24, 2025 at 2:18 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote: > > From: Yu Kuai <yukuai3@xxxxxxxxxx> > > The parameter is always set to 0 for now, following patches will use > this helper to write llbitmap to underlying disks, allow writing > dirty sectors instead of the whole page. > > Also rename md_super_write to md_write_metadata since there is nothing > super-block specific. > > Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> > --- > drivers/md/md-bitmap.c | 3 ++- > drivers/md/md.c | 28 ++++++++++++++-------------- > drivers/md/md.h | 5 +++-- > 3 files changed, 19 insertions(+), 17 deletions(-) > > diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c > index 431a3ab2e449..168eea6595b3 100644 > --- a/drivers/md/md-bitmap.c > +++ b/drivers/md/md-bitmap.c > @@ -470,7 +470,8 @@ static int __write_sb_page(struct md_rdev *rdev, struct bitmap *bitmap, > return -EINVAL; > } > > - md_super_write(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit), page); > + md_write_metadata(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit), > + page, 0); > return 0; > } > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 32b997dfe6f4..18e03f651f6b 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -1021,8 +1021,9 @@ static void super_written(struct bio *bio) > wake_up(&mddev->sb_wait); > } > > -void md_super_write(struct mddev *mddev, struct md_rdev *rdev, > - sector_t sector, int size, struct page *page) > +void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev, > + sector_t sector, int size, struct page *page, > + unsigned int offset) > { > /* write first size bytes of page to sector of rdev > * Increment mddev->pending_writes before returning > @@ -1047,7 +1048,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev, > atomic_inc(&rdev->nr_pending); > > bio->bi_iter.bi_sector = sector; > - __bio_add_page(bio, page, size, 0); > + __bio_add_page(bio, page, size, offset); > bio->bi_private = rdev; > bio->bi_end_io = super_written; > > @@ -1657,8 +1658,8 @@ super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors) > if ((u64)num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1) > num_sectors = (sector_t)(2ULL << 32) - 2; > do { > - md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, > - rdev->sb_page); > + md_write_metadata(rdev->mddev, rdev, rdev->sb_start, > + rdev->sb_size, rdev->sb_page, 0); > } while (md_super_wait(rdev->mddev) < 0); > return num_sectors; > } > @@ -2306,8 +2307,8 @@ super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors) > sb->super_offset = cpu_to_le64(rdev->sb_start); > sb->sb_csum = calc_sb_1_csum(sb); > do { > - md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, > - rdev->sb_page); > + md_write_metadata(rdev->mddev, rdev, rdev->sb_start, > + rdev->sb_size, rdev->sb_page, 0); > } while (md_super_wait(rdev->mddev) < 0); > return num_sectors; > > @@ -2816,18 +2817,17 @@ void md_update_sb(struct mddev *mddev, int force_change) > continue; /* no noise on spare devices */ > > if (!test_bit(Faulty, &rdev->flags)) { > - md_super_write(mddev,rdev, > - rdev->sb_start, rdev->sb_size, > - rdev->sb_page); > + md_write_metadata(mddev, rdev, rdev->sb_start, > + rdev->sb_size, rdev->sb_page, 0); > pr_debug("md: (write) %pg's sb offset: %llu\n", > rdev->bdev, > (unsigned long long)rdev->sb_start); > rdev->sb_events = mddev->events; > if (rdev->badblocks.size) { > - md_super_write(mddev, rdev, > - rdev->badblocks.sector, > - rdev->badblocks.size << 9, > - rdev->bb_page); > + md_write_metadata(mddev, rdev, > + rdev->badblocks.sector, > + rdev->badblocks.size << 9, > + rdev->bb_page, 0); > rdev->badblocks.size = 0; > } > > diff --git a/drivers/md/md.h b/drivers/md/md.h > index 6eb5dfdf2f55..5ba4a9093a92 100644 > --- a/drivers/md/md.h > +++ b/drivers/md/md.h > @@ -886,8 +886,9 @@ void md_account_bio(struct mddev *mddev, struct bio **bio); > void md_free_cloned_bio(struct bio *bio); > > extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio); > -extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev, > - sector_t sector, int size, struct page *page); > +extern void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev, > + sector_t sector, int size, struct page *page, > + unsigned int offset); > extern int md_super_wait(struct mddev *mddev); > extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, > struct page *page, blk_opf_t opf, bool metadata_op); > -- > 2.39.2 > Reviewed-by: Xiao Ni <xni@xxxxxxxxxx>