aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorYan <zheng.yan@oracle.com>2008-07-30 16:29:20 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:05 -0400
commitbcc63abbf3e9bf948a1b0129b3e6120ec7d7f698 (patch)
tree1c66dc210f948f79c86786368d2c75b57482875d /fs/btrfs/disk-io.c
parent33958dc6d38fb4ca7e62273855fcb2db7e616263 (diff)
Btrfs: implement memory reclaim for leaf reference cache
The memory reclaiming issue happens when snapshot exists. In that case, some cache entries may not be used during old snapshot dropping, so they will remain in the cache until umount. The patch adds a field to struct btrfs_leaf_ref to record create time. Besides, the patch makes all dead roots of a given snapshot linked together in order of create time. After a old snapshot was completely dropped, we check the dead root list and remove all cache entries created before the oldest dead root in the list. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ec1ba8ddb35f..e826730d750f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -735,8 +735,9 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
735 735
736 INIT_LIST_HEAD(&root->dirty_list); 736 INIT_LIST_HEAD(&root->dirty_list);
737 INIT_LIST_HEAD(&root->orphan_list); 737 INIT_LIST_HEAD(&root->orphan_list);
738 INIT_LIST_HEAD(&root->dead_list);
738 spin_lock_init(&root->node_lock); 739 spin_lock_init(&root->node_lock);
739 spin_lock_init(&root->orphan_lock); 740 spin_lock_init(&root->list_lock);
740 mutex_init(&root->objectid_mutex); 741 mutex_init(&root->objectid_mutex);
741 742
742 btrfs_leaf_ref_tree_init(&root->ref_tree_struct); 743 btrfs_leaf_ref_tree_init(&root->ref_tree_struct);
@@ -1717,7 +1718,7 @@ int close_ctree(struct btrfs_root *root)
1717 printk("btrfs: at umount reference cache size %Lu\n", 1718 printk("btrfs: at umount reference cache size %Lu\n",
1718 fs_info->total_ref_cache_size); 1719 fs_info->total_ref_cache_size);
1719 } 1720 }
1720 1721
1721 if (fs_info->extent_root->node) 1722 if (fs_info->extent_root->node)
1722 free_extent_buffer(fs_info->extent_root->node); 1723 free_extent_buffer(fs_info->extent_root->node);
1723 1724