]>
Commit | Line | Data |
---|---|---|
c9b0b55d MT |
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 |