Skip to content

Commit e051a8b

Browse files
committed
md: add a new parameter 'offset' to md_super_write()
JIRA: https://issues.redhat.com/browse/RHEL-123668 commit d01acbc Author: Yu Kuai <yukuai3@huawei.com> Date: Fri Aug 29 16:04:16 2025 +0800 md: add a new parameter 'offset' to md_super_write() 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. Link: https://lore.kernel.org/linux-raid/20250829080426.1441678-2-yukuai1@huaweicloud.com Signed-off-by: Yu Kuai <yukuai3@huawei.com> Reviewed-by: Xiao Ni <xni@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Li Nan <linan122@huawei.com> Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
1 parent 96b9f2d commit e051a8b

File tree

3 files changed

+36
-24
lines changed

3 files changed

+36
-24
lines changed

drivers/md/md-bitmap.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,8 @@ static int __write_sb_page(struct md_rdev *rdev, struct bitmap *bitmap,
483483
return -EINVAL;
484484
}
485485

486-
md_super_write(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit), page);
486+
md_write_metadata(mddev, rdev, sboff + ps, (int)min(size, bitmap_limit),
487+
page, 0);
487488
return 0;
488489
}
489490

drivers/md/md.c

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,15 +1016,26 @@ static void super_written(struct bio *bio)
10161016
wake_up(&mddev->sb_wait);
10171017
}
10181018

1019-
void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
1020-
sector_t sector, int size, struct page *page)
1021-
{
1022-
/* write first size bytes of page to sector of rdev
1023-
* Increment mddev->pending_writes before returning
1024-
* and decrement it on completion, waking up sb_wait
1025-
* if zero is reached.
1026-
* If an error occurred, call md_error
1027-
*/
1019+
/**
1020+
* md_write_metadata - write metadata to underlying disk, including
1021+
* array superblock, badblocks, bitmap superblock and bitmap bits.
1022+
* @mddev: the array to write
1023+
* @rdev: the underlying disk to write
1024+
* @sector: the offset to @rdev
1025+
* @size: the length of the metadata
1026+
* @page: the metadata
1027+
* @offset: the offset to @page
1028+
*
1029+
* Write @size bytes of @page start from @offset, to @sector of @rdev, Increment
1030+
* mddev->pending_writes before returning, and decrement it on completion,
1031+
* waking up sb_wait. Caller must call md_super_wait() after issuing io to all
1032+
* rdev. If an error occurred, md_error() will be called, and the @rdev will be
1033+
* kicked out from @mddev.
1034+
*/
1035+
void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev,
1036+
sector_t sector, int size, struct page *page,
1037+
unsigned int offset)
1038+
{
10281039
struct bio *bio;
10291040

10301041
if (!page)
@@ -1042,7 +1053,7 @@ void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
10421053
atomic_inc(&rdev->nr_pending);
10431054

10441055
bio->bi_iter.bi_sector = sector;
1045-
__bio_add_page(bio, page, size, 0);
1056+
__bio_add_page(bio, page, size, offset);
10461057
bio->bi_private = rdev;
10471058
bio->bi_end_io = super_written;
10481059

@@ -1652,8 +1663,8 @@ super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
16521663
if ((u64)num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1)
16531664
num_sectors = (sector_t)(2ULL << 32) - 2;
16541665
do {
1655-
md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
1656-
rdev->sb_page);
1666+
md_write_metadata(rdev->mddev, rdev, rdev->sb_start,
1667+
rdev->sb_size, rdev->sb_page, 0);
16571668
} while (md_super_wait(rdev->mddev) < 0);
16581669
return num_sectors;
16591670
}
@@ -2301,8 +2312,8 @@ super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
23012312
sb->super_offset = cpu_to_le64(rdev->sb_start);
23022313
sb->sb_csum = calc_sb_1_csum(sb);
23032314
do {
2304-
md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
2305-
rdev->sb_page);
2315+
md_write_metadata(rdev->mddev, rdev, rdev->sb_start,
2316+
rdev->sb_size, rdev->sb_page, 0);
23062317
} while (md_super_wait(rdev->mddev) < 0);
23072318
return num_sectors;
23082319

@@ -2811,18 +2822,17 @@ void md_update_sb(struct mddev *mddev, int force_change)
28112822
continue; /* no noise on spare devices */
28122823

28132824
if (!test_bit(Faulty, &rdev->flags)) {
2814-
md_super_write(mddev,rdev,
2815-
rdev->sb_start, rdev->sb_size,
2816-
rdev->sb_page);
2825+
md_write_metadata(mddev, rdev, rdev->sb_start,
2826+
rdev->sb_size, rdev->sb_page, 0);
28172827
pr_debug("md: (write) %pg's sb offset: %llu\n",
28182828
rdev->bdev,
28192829
(unsigned long long)rdev->sb_start);
28202830
rdev->sb_events = mddev->events;
28212831
if (rdev->badblocks.size) {
2822-
md_super_write(mddev, rdev,
2823-
rdev->badblocks.sector,
2824-
rdev->badblocks.size << 9,
2825-
rdev->bb_page);
2832+
md_write_metadata(mddev, rdev,
2833+
rdev->badblocks.sector,
2834+
rdev->badblocks.size << 9,
2835+
rdev->bb_page, 0);
28262836
rdev->badblocks.size = 0;
28272837
}
28282838

drivers/md/md.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -908,8 +908,9 @@ void md_account_bio(struct mddev *mddev, struct bio **bio);
908908
void md_free_cloned_bio(struct bio *bio);
909909

910910
extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
911-
extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
912-
sector_t sector, int size, struct page *page);
911+
void md_write_metadata(struct mddev *mddev, struct md_rdev *rdev,
912+
sector_t sector, int size, struct page *page,
913+
unsigned int offset);
913914
extern int md_super_wait(struct mddev *mddev);
914915
extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
915916
struct page *page, blk_opf_t opf, bool metadata_op);

0 commit comments

Comments
 (0)