]> git.ipfire.org Git - people/amarx/ipfire-3.x.git/blob - btrfs-progs/patches/btrfs-progs-valgrind.patch
Merge remote-tracking branch 'stevee/unicode-ucd'
[people/amarx/ipfire-3.x.git] / btrfs-progs / patches / btrfs-progs-valgrind.patch
1 diff --git a/btrfsck.c b/btrfsck.c
2 index 63e44d1..1ae7487 100644
3 --- a/btrfsck.c
4 +++ b/btrfsck.c
5 @@ -2806,6 +2806,8 @@ static int check_extents(struct btrfs_root *root)
6 break;
7 }
8 ret = check_extent_refs(root, &extent_cache);
9 + free_cache_tree(&seen);
10 + free(bits);
11 return ret;
12 }
13
14 diff --git a/disk-io.c b/disk-io.c
15 index a6e1000..b903163 100644
16 --- a/disk-io.c
17 +++ b/disk-io.c
18 @@ -425,8 +425,10 @@ static int find_and_setup_log_root(struct btrfs_root *tree_root,
19 u64 blocknr = btrfs_super_log_root(disk_super);
20 struct btrfs_root *log_root = malloc(sizeof(struct btrfs_root));
21
22 - if (blocknr == 0)
23 + if (blocknr == 0) {
24 + free(log_root);
25 return 0;
26 + }
27
28 blocksize = btrfs_level_size(tree_root,
29 btrfs_super_log_root_level(disk_super));
30 @@ -605,7 +607,7 @@ struct btrfs_root *open_ctree_fd(int fp, const char *path, u64 sb_bytenr,
31 struct btrfs_root *chunk_root = malloc(sizeof(struct btrfs_root));
32 struct btrfs_root *dev_root = malloc(sizeof(struct btrfs_root));
33 struct btrfs_root *csum_root = malloc(sizeof(struct btrfs_root));
34 - struct btrfs_fs_info *fs_info = malloc(sizeof(*fs_info));
35 + struct btrfs_fs_info *fs_info = malloc(sizeof(struct btrfs_fs_info));
36 int ret;
37 struct btrfs_super_block *disk_super;
38 struct btrfs_fs_devices *fs_devices = NULL;
39 @@ -628,7 +630,7 @@ struct btrfs_root *open_ctree_fd(int fp, const char *path, u64 sb_bytenr,
40 BUG_ON(ret);
41 }
42
43 - memset(fs_info, 0, sizeof(*fs_info));
44 + memset(fs_info, 0, sizeof(struct btrfs_fs_info));
45 fs_info->tree_root = tree_root;
46 fs_info->extent_root = extent_root;
47 fs_info->chunk_root = chunk_root;
48 @@ -928,15 +930,19 @@ static int close_all_devices(struct btrfs_fs_info *fs_info)
49 {
50 struct list_head *list;
51 struct list_head *next;
52 + struct list_head *tmp;
53 struct btrfs_device *device;
54
55 - return 0;
56 -
57 list = &fs_info->fs_devices->devices;
58 - list_for_each(next, list) {
59 + list_for_each_safe(next, tmp, list) {
60 device = list_entry(next, struct btrfs_device, dev_list);
61 close(device->fd);
62 + list_del(&device->dev_list);
63 + free(device->name);
64 + free(device->label);
65 + free(device);
66 }
67 + free(fs_info->fs_devices);
68 return 0;
69 }
70
71 @@ -983,12 +989,14 @@ int close_ctree(struct btrfs_root *root)
72 extent_io_tree_cleanup(&fs_info->pinned_extents);
73 extent_io_tree_cleanup(&fs_info->pending_del);
74 extent_io_tree_cleanup(&fs_info->extent_ins);
75 + btrfs_mapping_tree_free(&fs_info->mapping_tree);
76
77 free(fs_info->tree_root);
78 free(fs_info->extent_root);
79 free(fs_info->chunk_root);
80 free(fs_info->dev_root);
81 free(fs_info->csum_root);
82 + free(fs_info->log_root_tree);
83 free(fs_info);
84
85 return 0;
86 diff --git a/extent-cache.c b/extent-cache.c
87 index b871e18..b424975 100644
88 --- a/extent-cache.c
89 +++ b/extent-cache.c
90 @@ -170,3 +170,14 @@ void remove_cache_extent(struct cache_tree *tree,
91 rb_erase(&pe->rb_node, &tree->root);
92 }
93
94 +void free_cache_tree(struct cache_tree *tree)
95 +{
96 + struct rb_node *node;
97 + struct cache_extent *cache;
98 +
99 + while ((node = rb_last(&tree->root)) != NULL) {
100 + cache = rb_entry(node, struct cache_extent, rb_node);
101 + remove_cache_extent(tree, cache);
102 + free(cache);
103 + }
104 +}
105 diff --git a/extent-cache.h b/extent-cache.h
106 index 7f2f2a6..1696bc2 100644
107 --- a/extent-cache.h
108 +++ b/extent-cache.h
109 @@ -43,6 +43,7 @@ struct cache_extent *find_cache_extent(struct cache_tree *tree,
110 int insert_cache_extent(struct cache_tree *tree, u64 start, u64 size);
111 int insert_existing_cache_extent(struct cache_tree *tree,
112 struct cache_extent *pe);
113 +void free_cache_tree(struct cache_tree *tree);
114
115 static inline int cache_tree_empty(struct cache_tree *tree)
116 {
117 diff --git a/extent-tree.c b/extent-tree.c
118 index b2f9bb2..e1d7ffd 100644
119 --- a/extent-tree.c
120 +++ b/extent-tree.c
121 @@ -2985,6 +2985,7 @@ out:
122
123 int btrfs_free_block_groups(struct btrfs_fs_info *info)
124 {
125 + struct btrfs_space_info *space_info;
126 u64 start;
127 u64 end;
128 u64 ptr;
129 @@ -3008,6 +3009,15 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
130 clear_extent_dirty(&info->free_space_cache, start,
131 end, GFP_NOFS);
132 }
133 +
134 + while (!list_empty(&info->space_info)) {
135 + space_info = list_entry(info->space_info.next,
136 + struct btrfs_space_info,
137 + list);
138 + list_del(&space_info->list);
139 + kfree(space_info);
140 + }
141 +
142 return 0;
143 }
144
145 diff --git a/extent_io.c b/extent_io.c
146 index 069c199..71e6826 100644
147 --- a/extent_io.c
148 +++ b/extent_io.c
149 @@ -572,6 +572,7 @@ static struct extent_buffer *__alloc_extent_buffer(struct extent_io_tree *tree,
150 BUG();
151 return NULL;
152 }
153 + memset(eb, 0, sizeof(struct extent_buffer) + blocksize);
154
155 eb->start = bytenr;
156 eb->len = blocksize;
157 diff --git a/volumes.c b/volumes.c
158 index 7671855..eee66a7 100644
159 --- a/volumes.c
160 +++ b/volumes.c
161 @@ -862,6 +862,20 @@ void btrfs_mapping_init(struct btrfs_mapping_tree *tree)
162 cache_tree_init(&tree->cache_tree);
163 }
164
165 +void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree)
166 +{
167 + struct cache_extent *cache;
168 + struct rb_node *node;
169 + struct map_lookup *map;
170 +
171 + while ((node = rb_last(&tree->cache_tree.root)) != NULL) {
172 + cache = rb_entry(node, struct cache_extent, rb_node);
173 + map = container_of(cache, struct map_lookup, ce);
174 + remove_cache_extent(&tree->cache_tree, cache);
175 + free(map);
176 + }
177 +}
178 +
179 int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len)
180 {
181 struct cache_extent *ce;
182 @@ -1340,7 +1354,7 @@ int btrfs_read_sys_array(struct btrfs_root *root)
183 if (!sb)
184 return -ENOMEM;
185 btrfs_set_buffer_uptodate(sb);
186 - write_extent_buffer(sb, super_copy, 0, BTRFS_SUPER_INFO_SIZE);
187 + write_extent_buffer(sb, super_copy, 0, sizeof(*super_copy));
188 array_size = btrfs_super_sys_array_size(super_copy);
189
190 /*
191 diff --git a/volumes.h b/volumes.h
192 index bb78751..e466b31 100644
193 --- a/volumes.h
194 +++ b/volumes.h
195 @@ -130,4 +130,5 @@ int btrfs_add_system_chunk(struct btrfs_trans_handle *trans,
196 struct btrfs_root *root, struct btrfs_key *key,
197 struct btrfs_chunk *chunk, int item_size);
198 int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
199 +void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree);
200 #endif