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; |
