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:
Yu Kuai 2026-08-03 03:50:27 +08:00
parent b094fa9d32
commit 807757d4c3

View File

@ -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,