Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Btrfs: clean up code for merging extent maps

unpin_extent_cache() and add_extent_mapping() shares the same code
that merges extent maps.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>

authored by

Li Zefan and committed by
Chris Mason
4d2c8f62 ed64f066

+21 -38
+21 -38
fs/btrfs/extent_map.c
··· 183 183 return 0; 184 184 } 185 185 186 - int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len) 186 + static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em) 187 187 { 188 - int ret = 0; 189 188 struct extent_map *merge = NULL; 190 189 struct rb_node *rb; 191 - struct extent_map *em; 192 - 193 - write_lock(&tree->lock); 194 - em = lookup_extent_mapping(tree, start, len); 195 - 196 - WARN_ON(!em || em->start != start); 197 - 198 - if (!em) 199 - goto out; 200 - 201 - clear_bit(EXTENT_FLAG_PINNED, &em->flags); 202 190 203 191 if (em->start != 0) { 204 192 rb = rb_prev(&em->rb_node); ··· 213 225 merge->in_tree = 0; 214 226 free_extent_map(merge); 215 227 } 228 + } 229 + 230 + int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len) 231 + { 232 + int ret = 0; 233 + struct extent_map *em; 234 + 235 + write_lock(&tree->lock); 236 + em = lookup_extent_mapping(tree, start, len); 237 + 238 + WARN_ON(!em || em->start != start); 239 + 240 + if (!em) 241 + goto out; 242 + 243 + clear_bit(EXTENT_FLAG_PINNED, &em->flags); 244 + 245 + try_merge_map(tree, em); 216 246 217 247 free_extent_map(em); 218 248 out: ··· 253 247 struct extent_map *em) 254 248 { 255 249 int ret = 0; 256 - struct extent_map *merge = NULL; 257 250 struct rb_node *rb; 258 251 struct extent_map *exist; 259 252 ··· 268 263 goto out; 269 264 } 270 265 atomic_inc(&em->refs); 271 - if (em->start != 0) { 272 - rb = rb_prev(&em->rb_node); 273 - if (rb) 274 - merge = rb_entry(rb, struct extent_map, rb_node); 275 - if (rb && mergable_maps(merge, em)) { 276 - em->start = merge->start; 277 - em->len += merge->len; 278 - em->block_len += merge->block_len; 279 - em->block_start = merge->block_start; 280 - merge->in_tree = 0; 281 - rb_erase(&merge->rb_node, &tree->map); 282 - free_extent_map(merge); 283 - } 284 - } 285 - rb = rb_next(&em->rb_node); 286 - if (rb) 287 - merge = rb_entry(rb, struct extent_map, rb_node); 288 - if (rb && mergable_maps(em, merge)) { 289 - em->len += merge->len; 290 - em->block_len += merge->len; 291 - rb_erase(&merge->rb_node, &tree->map); 292 - merge->in_tree = 0; 293 - free_extent_map(merge); 294 - } 266 + 267 + try_merge_map(tree, em); 295 268 out: 296 269 return ret; 297 270 }