Skip to content

Commit f735b37

Browse files
Qu Wenruokdave
Qu Wenruo
authored andcommitted
btrfs-progs: extent-tree: Add add_merge_cache_extent function
This add_merge_cache_extent() function will try to merge adjusted cache_extent. This is used for later btrfs-convert ext2 free space cache. Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 466e066 commit f735b37

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

extent-cache.c

+57
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,60 @@ void free_extent_cache_tree(struct cache_tree *tree)
282282
{
283283
cache_tree_free_extents(tree, free_extent_cache);
284284
}
285+
286+
int add_merge_cache_extent(struct cache_tree *tree, u64 start, u64 size)
287+
{
288+
struct cache_extent *cache;
289+
struct cache_extent *next = NULL;
290+
struct cache_extent *prev = NULL;
291+
int next_merged = 0;
292+
int prev_merged = 0;
293+
int ret = 0;
294+
295+
if (cache_tree_empty(tree))
296+
goto insert;
297+
298+
cache = search_cache_extent(tree, start);
299+
if (!cache) {
300+
/*
301+
* Either the tree is completely empty, or the no range after
302+
* start.
303+
* Either way, the last cache_extent should be prev.
304+
*/
305+
prev = last_cache_extent(tree);
306+
} else if (start <= cache->start) {
307+
next = cache;
308+
prev = prev_cache_extent(cache);
309+
} else {
310+
prev = cache;
311+
next = next_cache_extent(cache);
312+
}
313+
314+
/*
315+
* Ensure the range to be inserted won't cover with existings
316+
* Or we will need extra loop to do merge
317+
*/
318+
BUG_ON(next && start + size > next->start);
319+
BUG_ON(prev && prev->start + prev->size > start);
320+
321+
if (next && start + size == next->start) {
322+
next_merged = 1;
323+
next->size = next->start + next->size - start;
324+
next->start = start;
325+
}
326+
if (prev && prev->start + prev->size == start) {
327+
prev_merged = 1;
328+
if (next_merged) {
329+
next->size = next->start + next->size - prev->start;
330+
next->start = prev->start;
331+
remove_cache_extent(tree, prev);
332+
free(prev);
333+
} else {
334+
prev->size = start + size - prev->start;
335+
}
336+
}
337+
insert:
338+
if (!prev_merged && !next_merged)
339+
ret = add_cache_extent(tree, start, size);
340+
return ret;
341+
}

extent-cache.h

+8
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,12 @@ int add_cache_extent2(struct cache_tree *tree,
110110
u64 objectid, u64 start, u64 size);
111111
int insert_cache_extent2(struct cache_tree *tree, struct cache_extent *pe);
112112

113+
/*
114+
* Insert a cache_extent range [start, start + size).
115+
*
116+
* This function may merge with existing cache_extent.
117+
* NOTE: caller must ensure the inserted range won't cover with any existing
118+
* range.
119+
*/
120+
int add_merge_cache_extent(struct cache_tree *tree, u64 start, u64 size);
113121
#endif

0 commit comments

Comments
 (0)