* hurts the fsync performance for workloads with a data
* size that exceeds or is close to the system's memory).
*/
- remove_extent_mapping(map, em);
+ remove_extent_mapping(btrfs_inode, em);
/* once for the rb tree */
free_extent_map(em);
next:
}
/*
- * Remove an extent_map from the extent tree.
+ * Remove an extent_map from its inode's extent tree.
*
- * @tree: extent tree to remove from
+ * @inode: the inode the extent map belongs to
* @em: extent map being removed
*
- * Remove @em from @tree. No reference counts are dropped, and no checks
- * are done to see if the range is in use.
+ * Remove @em from the extent tree of @inode. No reference counts are dropped,
+ * and no checks are done to see if the range is in use.
*/
-void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em)
+void remove_extent_mapping(struct btrfs_inode *inode, struct extent_map *em)
{
+ struct extent_map_tree *tree = &inode->extent_tree;
+
lockdep_assert_held_write(&tree->lock);
WARN_ON(em->flags & EXTENT_FLAG_PINNED);
* if needed. This avoids searching the tree, from the root down to the first
* extent map, before each deletion.
*/
-static void drop_all_extent_maps_fast(struct extent_map_tree *tree)
+static void drop_all_extent_maps_fast(struct btrfs_inode *inode)
{
+ struct extent_map_tree *tree = &inode->extent_tree;
+
write_lock(&tree->lock);
while (!RB_EMPTY_ROOT(&tree->map.rb_root)) {
struct extent_map *em;
node = rb_first_cached(&tree->map);
em = rb_entry(node, struct extent_map, rb_node);
em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING);
- remove_extent_mapping(tree, em);
+ remove_extent_mapping(inode, em);
free_extent_map(em);
cond_resched_rwlock_write(&tree->lock);
}
WARN_ON(end < start);
if (end == (u64)-1) {
if (start == 0 && !skip_pinned) {
- drop_all_extent_maps_fast(em_tree);
+ drop_all_extent_maps_fast(inode);
return;
}
len = (u64)-1;
ASSERT(!split);
btrfs_set_inode_full_sync(inode);
}
- remove_extent_mapping(em_tree, em);
+ remove_extent_mapping(inode, em);
}
/*
void extent_map_tree_init(struct extent_map_tree *tree);
struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
u64 start, u64 len);
-void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
+void remove_extent_mapping(struct btrfs_inode *inode, struct extent_map *em);
int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
u64 new_logical);
#include "../disk-io.h"
#include "../block-group.h"
-static int free_extent_map_tree(struct extent_map_tree *em_tree)
+static int free_extent_map_tree(struct btrfs_inode *inode)
{
+ struct extent_map_tree *em_tree = &inode->extent_tree;
struct extent_map *em;
struct rb_node *node;
int ret = 0;
while (!RB_EMPTY_ROOT(&em_tree->map.rb_root)) {
node = rb_first_cached(&em_tree->map);
em = rb_entry(node, struct extent_map, rb_node);
- remove_extent_mapping(em_tree, em);
+ remove_extent_mapping(inode, em);
#ifdef CONFIG_BTRFS_DEBUG
if (refcount_read(&em->refs) != 1) {
}
free_extent_map(em);
out:
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
}
free_extent_map(em);
out:
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
}
free_extent_map(em);
out:
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
}
free_extent_map(em);
out:
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
if (ret)
goto out;
out:
- ret2 = free_extent_map_tree(&inode->extent_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
ret = 0;
out:
free_extent_map(em);
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;
ret2 = unpin_extent_cache(inode, 0, SZ_16K, 0);
if (ret == 0)
ret = ret2;
- ret2 = free_extent_map_tree(em_tree);
+ ret2 = free_extent_map_tree(inode);
if (ret == 0)
ret = ret2;