diff options
-rw-r--r-- | fs/btrfs/ulist.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/btrfs/ulist.c b/fs/btrfs/ulist.c index 7b417e20efe2..b0a523b2c60e 100644 --- a/fs/btrfs/ulist.c +++ b/fs/btrfs/ulist.c | |||
@@ -205,6 +205,10 @@ int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, | |||
205 | u64 new_alloced = ulist->nodes_alloced + 128; | 205 | u64 new_alloced = ulist->nodes_alloced + 128; |
206 | struct ulist_node *new_nodes; | 206 | struct ulist_node *new_nodes; |
207 | void *old = NULL; | 207 | void *old = NULL; |
208 | int i; | ||
209 | |||
210 | for (i = 0; i < ulist->nnodes; i++) | ||
211 | rb_erase(&ulist->nodes[i].rb_node, &ulist->root); | ||
208 | 212 | ||
209 | /* | 213 | /* |
210 | * if nodes_alloced == ULIST_SIZE no memory has been allocated | 214 | * if nodes_alloced == ULIST_SIZE no memory has been allocated |
@@ -224,6 +228,17 @@ int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, | |||
224 | 228 | ||
225 | ulist->nodes = new_nodes; | 229 | ulist->nodes = new_nodes; |
226 | ulist->nodes_alloced = new_alloced; | 230 | ulist->nodes_alloced = new_alloced; |
231 | |||
232 | /* | ||
233 | * krealloc actually uses memcpy, which does not copy rb_node | ||
234 | * pointers, so we have to do it ourselves. Otherwise we may | ||
235 | * be bitten by crashes. | ||
236 | */ | ||
237 | for (i = 0; i < ulist->nnodes; i++) { | ||
238 | ret = ulist_rbtree_insert(ulist, &ulist->nodes[i]); | ||
239 | if (ret < 0) | ||
240 | return ret; | ||
241 | } | ||
227 | } | 242 | } |
228 | ulist->nodes[ulist->nnodes].val = val; | 243 | ulist->nodes[ulist->nnodes].val = val; |
229 | ulist->nodes[ulist->nnodes].aux = aux; | 244 | ulist->nodes[ulist->nnodes].aux = aux; |