diff options
| -rw-r--r-- | drivers/md/persistent-data/dm-space-map-metadata.c | 18 |
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 | ||
| 628 | out: | 638 | out: |
| 629 | /* | 639 | /* |
