diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2013-09-04 10:49:39 +0200 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2013-09-04 10:49:57 +0200 |
| commit | efd15f5f4ff63f6ac5d80850686e3d2cc8c4481b (patch) | |
| tree | 40024adbe77a3d660662e639fd765097133d648c /fs/btrfs/ulist.c | |
| parent | 6c2794a2984f4c17a58117a68703cc7640f01c5a (diff) | |
| parent | 58c59bc997d86593f0bea41845885917cf304d22 (diff) | |
Merge branch 'master' into for-3.12/upstream
Sync with Linus' tree to be able to apply fixup patch on top
of 9d9a04ee75 ("HID: apple: Add support for the 2013 Macbook Air")
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'fs/btrfs/ulist.c')
| -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 7b417e20efe..b0a523b2c60 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, u64 new_alloced = ulist->nodes_alloced + 128; struct ulist_node *new_nodes; void *old = NULL; + int i; + + for (i = 0; i < ulist->nnodes; i++) + rb_erase(&ulist->nodes[i].rb_node, &ulist->root); /* * 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, ulist->nodes = new_nodes; ulist->nodes_alloced = new_alloced; + + /* + * krealloc actually uses memcpy, which does not copy rb_node + * pointers, so we have to do it ourselves. Otherwise we may + * be bitten by crashes. + */ + for (i = 0; i < ulist->nnodes; i++) { + ret = ulist_rbtree_insert(ulist, &ulist->nodes[i]); + if (ret < 0) + return ret; + } } ulist->nodes[ulist->nnodes].val = val; ulist->nodes[ulist->nnodes].aux = aux; |
