aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/persistent-data/dm-space-map-metadata.c')
-rw-r--r--drivers/md/persistent-data/dm-space-map-metadata.c29
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
139static int brb_pop(struct bop_ring_buffer *brb, struct block_op *result) 139static 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
153static 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 = {
681static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) 691static 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;