aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/persistent-data/dm-space-map-metadata.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c
index bfbfe03228c1..536782e3bcb7 100644
--- a/drivers/md/persistent-data/dm-space-map-metadata.c
+++ b/drivers/md/persistent-data/dm-space-map-metadata.c
@@ -617,13 +617,23 @@ static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks)
617 if (r) 617 if (r)
618 goto out; 618 goto out;
619 619
620 for (i = old_len; !r && i < smm->begin; i++) { 620 /*
621 r = sm_ll_inc(&smm->ll, i, &ev); 621 * We repeatedly increment then commit until the commit doesn't
622 * allocate any new blocks.
623 */
624 do {
625 for (i = old_len; !r && i < smm->begin; i++) {
626 r = sm_ll_inc(&smm->ll, i, &ev);
627 if (r)
628 goto out;
629 }
630 old_len = smm->begin;
631
632 r = sm_ll_commit(&smm->ll);
622 if (r) 633 if (r)
623 goto out; 634 goto out;
624 }
625 635
626 r = sm_metadata_commit(sm); 636 } while (old_len != smm->begin);
627 637
628out: 638out:
629 /* 639 /*