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 | 32 |
1 files changed, 22 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 53091295fce9..fca6dbcf9a47 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,17 @@ 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 | struct block_op *bop; | ||
| 156 | |||
| 157 | if (brb_empty(brb)) | ||
| 158 | return -ENODATA; | ||
| 159 | |||
| 160 | bop = brb->bops + brb->begin; | ||
| 150 | brb->begin = brb_next(brb, brb->begin); | 161 | brb->begin = brb_next(brb, brb->begin); |
| 151 | 162 | ||
| 152 | return 0; | 163 | return 0; |
| @@ -211,7 +222,7 @@ static int apply_bops(struct sm_metadata *smm) | |||
| 211 | while (!brb_empty(&smm->uncommitted)) { | 222 | while (!brb_empty(&smm->uncommitted)) { |
| 212 | struct block_op bop; | 223 | struct block_op bop; |
| 213 | 224 | ||
| 214 | r = brb_pop(&smm->uncommitted, &bop); | 225 | r = brb_peek(&smm->uncommitted, &bop); |
| 215 | if (r) { | 226 | if (r) { |
| 216 | DMERR("bug in bop ring buffer"); | 227 | DMERR("bug in bop ring buffer"); |
| 217 | break; | 228 | break; |
| @@ -220,6 +231,8 @@ static int apply_bops(struct sm_metadata *smm) | |||
| 220 | r = commit_bop(smm, &bop); | 231 | r = commit_bop(smm, &bop); |
| 221 | if (r) | 232 | if (r) |
| 222 | break; | 233 | break; |
| 234 | |||
| 235 | brb_pop(&smm->uncommitted); | ||
| 223 | } | 236 | } |
| 224 | 237 | ||
| 225 | return r; | 238 | return r; |
| @@ -683,7 +696,6 @@ static struct dm_space_map bootstrap_ops = { | |||
| 683 | static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) | 696 | static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) |
| 684 | { | 697 | { |
| 685 | int r, i; | 698 | int r, i; |
| 686 | enum allocation_event ev; | ||
| 687 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 699 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
| 688 | dm_block_t old_len = smm->ll.nr_blocks; | 700 | dm_block_t old_len = smm->ll.nr_blocks; |
| 689 | 701 | ||
| @@ -705,11 +717,12 @@ static int sm_metadata_extend(struct dm_space_map *sm, dm_block_t extra_blocks) | |||
| 705 | * allocate any new blocks. | 717 | * allocate any new blocks. |
| 706 | */ | 718 | */ |
| 707 | do { | 719 | do { |
| 708 | for (i = old_len; !r && i < smm->begin; i++) { | 720 | for (i = old_len; !r && i < smm->begin; i++) |
| 709 | r = sm_ll_inc(&smm->ll, i, &ev); | 721 | r = add_bop(smm, BOP_INC, i); |
| 710 | if (r) | 722 | |
| 711 | goto out; | 723 | if (r) |
| 712 | } | 724 | goto out; |
| 725 | |||
| 713 | old_len = smm->begin; | 726 | old_len = smm->begin; |
| 714 | 727 | ||
| 715 | r = apply_bops(smm); | 728 | r = apply_bops(smm); |
| @@ -754,7 +767,6 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
| 754 | { | 767 | { |
| 755 | int r; | 768 | int r; |
| 756 | dm_block_t i; | 769 | dm_block_t i; |
| 757 | enum allocation_event ev; | ||
| 758 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); | 770 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
| 759 | 771 | ||
| 760 | smm->begin = superblock + 1; | 772 | smm->begin = superblock + 1; |
| @@ -782,7 +794,7 @@ int dm_sm_metadata_create(struct dm_space_map *sm, | |||
| 782 | * allocated blocks that they were built from. | 794 | * allocated blocks that they were built from. |
| 783 | */ | 795 | */ |
| 784 | for (i = superblock; !r && i < smm->begin; i++) | 796 | for (i = superblock; !r && i < smm->begin; i++) |
| 785 | r = sm_ll_inc(&smm->ll, i, &ev); | 797 | r = add_bop(smm, BOP_INC, i); |
| 786 | 798 | ||
| 787 | if (r) | 799 | if (r) |
| 788 | return r; | 800 | return r; |
