diff options
Diffstat (limited to 'drivers/md/persistent-data/dm-space-map-metadata.c')
-rw-r--r-- | drivers/md/persistent-data/dm-space-map-metadata.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c index 199c9ccd1f5..032ee39a0e9 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.c +++ b/drivers/md/persistent-data/dm-space-map-metadata.c | |||
@@ -136,7 +136,7 @@ static int brb_push(struct bop_ring_buffer *brb, | |||
136 | return 0; | 136 | return 0; |
137 | } | 137 | } |
138 | 138 | ||
139 | static int brb_pop(struct bop_ring_buffer *brb, struct block_op *result) | 139 | static int brb_peek(struct bop_ring_buffer *brb, struct block_op *result) |
140 | { | 140 | { |
141 | struct block_op *bop; | 141 | struct block_op *bop; |
142 | 142 | ||
@@ -147,6 +147,14 @@ static int brb_pop(struct bop_ring_buffer *brb, struct block_op *result) | |||
147 | result->type = bop->type; | 147 | result->type = bop->type; |
148 | result->block = bop->block; | 148 | result->block = bop->block; |
149 | 149 | ||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | static int brb_pop(struct bop_ring_buffer *brb) | ||
154 | { | ||
155 | if (brb_empty(brb)) | ||
156 | return -ENODATA; | ||
157 | |||
150 | brb->begin = brb_next(brb, brb->begin); | 158 | brb->begin = brb_next(brb, brb->begin); |
151 | 159 | ||
152 | return 0; | 160 | return 0; |
@@ -211,7 +219,7 @@ static int apply_bops(struct sm_metadata *smm) | |||
211 | while (!brb_empty(&smm->uncommitted)) { | 219 | while (!brb_empty(&smm->uncommitted)) { |
212 | struct block_op bop; | 220 | struct block_op bop; |
213 | 221 | ||
214 | r = brb_pop(&smm->uncommitted, &bop); | 222 | r = brb_peek(&smm->uncommitted, &bop); |
215 | if (r) { | 223 | if (r) { |
216 | DMERR("bug in bop ring buffer"); | 224 | DMERR("bug in bop ring buffer"); |
217 | break; | 225 | break; |
@@ -220,6 +228,8 @@ static int apply_bops(struct sm_metadata *smm) | |||
220 | r = commit_bop(smm, &bop); | 228 | r = commit_bop(smm, &bop); |
221 | if (r) | 229 | if (r) |
222 | break; | 230 | break; |
231 | |||
232 | brb_pop(&smm->uncommitted); | ||
223 | } | 233 | } |
224 | 234 | ||
225 | return r; | 235 | return r; |
@@ -681,7 +691,6 @@ static struct dm_space_map bootstrap_ops = { | |||
681 | static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) | 691 | static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) |
682 | { | 692 | { |
683 | int r, i; | 693 | int r, i; |
684 | enum allocation_event ev; | ||
685 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 694 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
686 | dm_block_t old_len = smm->ll.nr_blocks; | 695 | dm_block_t old_len = smm->ll.nr_blocks; |
687 | 696 | ||
@@ -703,11 +712,12 @@ static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) | |||
703 | * allocate any new blocks. | 712 | * allocate any new blocks. |
704 | */ | 713 | */ |
705 | do { | 714 | do { |
706 | for (i = old_len; !r && i < smm->begin; i++) { | 715 | for (i = old_len; !r && i < smm->begin; i++) |
707 | r = sm_ll_inc(&smm->ll, i, &ev); | 716 | r = add_bop(smm, BOP_INC, i); |
708 | if (r) | 717 | |
709 | goto out; | 718 | if (r) |
710 | } | 719 | goto out; |
720 | |||
711 | old_len = smm->begin; | 721 | old_len = smm->begin; |
712 | 722 | ||
713 | r = apply_bops(smm); | 723 | r = apply_bops(smm); |
@@ -752,7 +762,6 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
752 | { | 762 | { |
753 | int r; | 763 | int r; |
754 | dm_block_t i; | 764 | dm_block_t i; |
755 | enum allocation_event ev; | ||
756 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 765 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
757 | 766 | ||
758 | smm->begin = superblock + 1; | 767 | smm->begin = superblock + 1; |
@@ -780,7 +789,7 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
780 | * allocated blocks that they were built from. | 789 | * allocated blocks that they were built from. |
781 | */ | 790 | */ |
782 | for (i = superblock; !r && i < smm->begin; i++) | 791 | for (i = superblock; !r && i < smm->begin; i++) |
783 | r = sm_ll_inc(&smm->ll, i, &ev); | 792 | r = add_bop(smm, BOP_INC, i); |
784 | 793 | ||
785 | if (r) | 794 | if (r) |
786 | return r; | 795 | return r; |