mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
md/raid5: add exact old and new llbitmap mapping helpers
Teach RAID5 to export exact old and new llbitmap mappings and the corresponding sync and array sizes for reshape-aware bitmap users. Tested-by: Mykola Marzhan <mykola@meshstor.io> Link: https://patch.msgid.link/20260802195038.164272-27-yukuai@kernel.org Signed-off-by: Yu Kuai <yukuai@fygo.io>
This commit is contained in:
parent
aa648f26a9
commit
9f59258d30
|
|
@ -6015,6 +6015,34 @@ static enum reshape_loc get_reshape_loc(struct mddev *mddev,
|
|||
return LOC_BEHIND_RESHAPE;
|
||||
}
|
||||
|
||||
static void raid5_bitmap_sector_map(struct mddev *mddev, sector_t *offset,
|
||||
unsigned long *sectors,
|
||||
bool previous)
|
||||
{
|
||||
struct r5conf *conf = mddev->private;
|
||||
sector_t start = *offset;
|
||||
sector_t end = start + *sectors;
|
||||
int sectors_per_chunk;
|
||||
int dd_idx;
|
||||
|
||||
if (previous)
|
||||
sectors_per_chunk = conf->prev_chunk_sectors *
|
||||
(conf->previous_raid_disks - conf->max_degraded);
|
||||
else
|
||||
sectors_per_chunk = conf->chunk_sectors *
|
||||
(conf->raid_disks - conf->max_degraded);
|
||||
sector_div(start, sectors_per_chunk);
|
||||
start *= sectors_per_chunk;
|
||||
if (sector_div(end, sectors_per_chunk))
|
||||
end++;
|
||||
end *= sectors_per_chunk;
|
||||
|
||||
start = raid5_compute_sector(conf, start, previous, &dd_idx, NULL);
|
||||
end = raid5_compute_sector(conf, end, previous, &dd_idx, NULL);
|
||||
*offset = start;
|
||||
*sectors = end - start;
|
||||
}
|
||||
|
||||
static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset,
|
||||
unsigned long *sectors)
|
||||
{
|
||||
|
|
@ -6022,21 +6050,11 @@ static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset,
|
|||
sector_t start = *offset;
|
||||
sector_t end = start + *sectors;
|
||||
sector_t prev_start = start;
|
||||
sector_t prev_end = end;
|
||||
int sectors_per_chunk;
|
||||
unsigned long prev_sectors = end - start;
|
||||
enum reshape_loc loc;
|
||||
int dd_idx;
|
||||
|
||||
sectors_per_chunk = conf->chunk_sectors *
|
||||
(conf->raid_disks - conf->max_degraded);
|
||||
sector_div(start, sectors_per_chunk);
|
||||
start *= sectors_per_chunk;
|
||||
if (sector_div(end, sectors_per_chunk))
|
||||
end++;
|
||||
end *= sectors_per_chunk;
|
||||
|
||||
start = raid5_compute_sector(conf, start, 0, &dd_idx, NULL);
|
||||
end = raid5_compute_sector(conf, end, 0, &dd_idx, NULL);
|
||||
raid5_bitmap_sector_map(mddev, &start, sectors, false);
|
||||
end = start + *sectors;
|
||||
|
||||
/*
|
||||
* For LOC_INSIDE_RESHAPE, this IO will wait for reshape to make
|
||||
|
|
@ -6045,19 +6063,10 @@ static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset,
|
|||
loc = get_reshape_loc(mddev, conf, prev_start);
|
||||
if (likely(loc != LOC_AHEAD_OF_RESHAPE)) {
|
||||
*offset = start;
|
||||
*sectors = end - start;
|
||||
return;
|
||||
}
|
||||
|
||||
sectors_per_chunk = conf->prev_chunk_sectors *
|
||||
(conf->previous_raid_disks - conf->max_degraded);
|
||||
sector_div(prev_start, sectors_per_chunk);
|
||||
prev_start *= sectors_per_chunk;
|
||||
sector_div(prev_end, sectors_per_chunk);
|
||||
prev_end *= sectors_per_chunk;
|
||||
|
||||
prev_start = raid5_compute_sector(conf, prev_start, 1, &dd_idx, NULL);
|
||||
prev_end = raid5_compute_sector(conf, prev_end, 1, &dd_idx, NULL);
|
||||
raid5_bitmap_sector_map(mddev, &prev_start, &prev_sectors, true);
|
||||
|
||||
/*
|
||||
* for LOC_AHEAD_OF_RESHAPE, reshape can make progress before this IO
|
||||
|
|
@ -6065,7 +6074,7 @@ static void raid5_bitmap_sector(struct mddev *mddev, sector_t *offset,
|
|||
* we set bits for both.
|
||||
*/
|
||||
*offset = min(start, prev_start);
|
||||
*sectors = max(end, prev_end) - *offset;
|
||||
*sectors = max(end, prev_start + prev_sectors) - *offset;
|
||||
}
|
||||
|
||||
static enum stripe_result make_stripe_request(struct mddev *mddev,
|
||||
|
|
@ -9131,6 +9140,21 @@ static void raid5_prepare_suspend(struct mddev *mddev)
|
|||
wake_up(&conf->wait_for_reshape);
|
||||
}
|
||||
|
||||
static sector_t raid5_bitmap_sync_size(struct mddev *mddev, bool previous)
|
||||
{
|
||||
return mddev->dev_sectors;
|
||||
}
|
||||
|
||||
static sector_t raid5_bitmap_array_sectors(struct mddev *mddev, bool previous)
|
||||
{
|
||||
struct r5conf *conf = mddev->private;
|
||||
|
||||
if (previous)
|
||||
return raid5_size(mddev, mddev->dev_sectors,
|
||||
conf->previous_raid_disks);
|
||||
return raid5_size(mddev, mddev->dev_sectors, conf->raid_disks);
|
||||
}
|
||||
|
||||
static struct md_personality raid6_personality =
|
||||
{
|
||||
.head = {
|
||||
|
|
@ -9160,6 +9184,9 @@ static struct md_personality raid6_personality =
|
|||
.change_consistency_policy = raid5_change_consistency_policy,
|
||||
.prepare_suspend = raid5_prepare_suspend,
|
||||
.bitmap_sector = raid5_bitmap_sector,
|
||||
.bitmap_sector_map = raid5_bitmap_sector_map,
|
||||
.bitmap_sync_size = raid5_bitmap_sync_size,
|
||||
.bitmap_array_sectors = raid5_bitmap_array_sectors,
|
||||
};
|
||||
static struct md_personality raid5_personality =
|
||||
{
|
||||
|
|
@ -9190,6 +9217,9 @@ static struct md_personality raid5_personality =
|
|||
.change_consistency_policy = raid5_change_consistency_policy,
|
||||
.prepare_suspend = raid5_prepare_suspend,
|
||||
.bitmap_sector = raid5_bitmap_sector,
|
||||
.bitmap_sector_map = raid5_bitmap_sector_map,
|
||||
.bitmap_sync_size = raid5_bitmap_sync_size,
|
||||
.bitmap_array_sectors = raid5_bitmap_array_sectors,
|
||||
};
|
||||
|
||||
static struct md_personality raid4_personality =
|
||||
|
|
@ -9221,6 +9251,9 @@ static struct md_personality raid4_personality =
|
|||
.change_consistency_policy = raid5_change_consistency_policy,
|
||||
.prepare_suspend = raid5_prepare_suspend,
|
||||
.bitmap_sector = raid5_bitmap_sector,
|
||||
.bitmap_sector_map = raid5_bitmap_sector_map,
|
||||
.bitmap_sync_size = raid5_bitmap_sync_size,
|
||||
.bitmap_array_sectors = raid5_bitmap_array_sectors,
|
||||
};
|
||||
|
||||
static int __init raid5_init(void)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user