mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
md/md-llbitmap: refuse reshape while llbitmap still needs sync
Reject reshape when llbitmap still contains NeedSync or Syncing bits. This keeps reshape from starting until the current llbitmap state has been reconciled. Tested-by: Mykola Marzhan <mykola@meshstor.io> Link: https://patch.msgid.link/20260802195038.164272-19-yukuai@kernel.org Signed-off-by: Yu Kuai <yukuai@fygo.io>
This commit is contained in:
parent
b094fa9d32
commit
807757d4c3
|
|
@ -1718,6 +1718,29 @@ static void llbitmap_dirty_bits(struct mddev *mddev, unsigned long s,
|
|||
llbitmap_state_machine(mddev->bitmap, s, e, BitmapActionStartwrite);
|
||||
}
|
||||
|
||||
static int llbitmap_reshape_can_start(struct mddev *mddev)
|
||||
{
|
||||
struct llbitmap *llbitmap = mddev->bitmap;
|
||||
unsigned long chunk;
|
||||
int ret = 0;
|
||||
|
||||
if (!llbitmap)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&mddev->bitmap_info.mutex);
|
||||
for (chunk = 0; chunk < llbitmap->chunks; chunk++) {
|
||||
enum llbitmap_state state = llbitmap_read(llbitmap, chunk);
|
||||
|
||||
if (state == BitNeedSync || state == BitSyncing) {
|
||||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&mddev->bitmap_info.mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void llbitmap_reshape_finish(struct mddev *mddev)
|
||||
{
|
||||
struct llbitmap *llbitmap = mddev->bitmap;
|
||||
|
|
@ -2034,6 +2057,7 @@ static struct bitmap_operations llbitmap_ops = {
|
|||
.dirty_bits = llbitmap_dirty_bits,
|
||||
.prepare_range = llbitmap_prepare_range,
|
||||
.reshape_finish = llbitmap_reshape_finish,
|
||||
.reshape_can_start = llbitmap_reshape_can_start,
|
||||
.write_all = llbitmap_write_all,
|
||||
|
||||
.groups = md_llbitmap_groups,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user