initial version of reference cache
Subsystems (2)
I miss two new created files in previous patch, please use this one. Thanks
---
Makefile +2 -1
@@ -6,7 +6,8 @@ btrfs-y := super.o ctree.o extent-tree.o hash.o file-item.o inode-item.o inode-map.o disk-io.o \ transaction.o bit-radix.o inode.o file.o tree-defrag.o \ extent_map.o sysfs.o struct-funcs.o xattr.o ordered-data.o \ - extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o + extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o \ + ref-cache.o btrfs-$(CONFIG_FS_POSIX_ACL) += acl.o else
ctree.c +2 -2
@@ -165,7 +165,7 @@ int btrfs_copy_root(struct btrfs_trans_hbtrfs_clear_header_flag (cow,BTRFS_HEADER_FLAG_WRITTEN );WARN_ON (btrfs_header_generation (buf) > trans->transid); - ret =btrfs_inc_ref (trans, new_root, buf); + ret =btrfs_inc_ref (trans, new_root, buf,0 );kfree (new_root);if (ret)
@@ -232,7 +232,7 @@ int __btrfs_cow_block(struct btrfs_transWARN_ON (btrfs_header_generation (buf) > trans->transid);if (btrfs_header_generation (buf) != trans->transid) { different_trans =1 ; - ret =btrfs_inc_ref (trans, root, buf); + ret =btrfs_inc_ref (trans, root, buf,1 );if (ret)return ret; }else {
ctree.h +7 -1
@@ -592,6 +592,10 @@ struct btrfs_fs_info {u64 last_alloc;u64 last_data_alloc; +spinlock_t ref_cache_lock; +u64 total_ref_cache_size; +u64 running_ref_cache_size; +u64 avail_data_alloc_bits;u64 avail_metadata_alloc_bits;u64 avail_system_alloc_bits;
@@ -613,6 +617,8 @@ struct btrfs_root {spinlock_t node_lock;struct extent_buffer *commit_root; +struct btrfs_leaf_ref_tree *ref_tree; +struct btrfs_root_item root_item;struct btrfs_key root_key;struct btrfs_fs_info *fs_info;
@@ -1430,7 +1436,7 @@ int btrfs_reserve_extent(struct btrfs_tr u64 search_end, struct btrfs_key *ins, u64 data);int btrfs_inc_ref (struct btrfs_trans_handle *trans,struct btrfs_root *root, -struct extent_buffer *buf); +struct extent_buffer *buf,int cache_ref); int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 bytenr, u64 num_bytes, u64 root_objectid, u64 ref_generation,
disk-io.c +14 -0
@@ -716,6 +716,7 @@ static int __setup_root(u32 nodesize, u3 root->node =NULL ; root->inode =NULL ; root->commit_root =NULL ; + root->ref_tree =NULL ; root->sectorsize = sectorsize; root->nodesize = nodesize; root->leafsize = leafsize;
@@ -1165,12 +1166,19 @@ static int transaction_kthread(void *argvfs_check_frozen (root->fs_info->sb,SB_FREEZE_WRITE );mutex_lock (&root->fs_info->transaction_kthread_mutex); +printk ("btrfs: total reference cache size %Lu\n" , + root->fs_info->total_ref_cache_size); +mutex_lock (&root->fs_info->trans_mutex); cur = root->fs_info->running_transaction;if (!cur) {mutex_unlock (&root->fs_info->trans_mutex); goto sleep; } + +printk ("btrfs: running reference cache size %Lu\n" , + root->fs_info->running_ref_cache_size); + now =get_seconds ();if (now < cur->start_time || now - cur->start_time <30 ) {mutex_unlock (&root->fs_info->trans_mutex);
@@ -1233,6 +1241,7 @@ struct btrfs_root *open_ctree(struct supspin_lock_init (&fs_info->hash_lock);spin_lock_init (&fs_info->delalloc_lock);spin_lock_init (&fs_info->new_trans_lock); +spin_lock_init (&fs_info->ref_cache_lock);init_completion (&fs_info->kobj_unregister); fs_info->tree_root = tree_root;
@@ -1699,6 +1708,11 @@ int close_ctree(struct btrfs_root *root)printk ("btrfs: at unmount delalloc count %Lu\n" , fs_info->delalloc_bytes); } +if (fs_info->total_ref_cache_size) { +printk ("btrfs: at umount reference cache size %Lu\n" , + fs_info->total_ref_cache_size); + } +if (fs_info->extent_root->node)free_extent_buffer (fs_info->extent_root->node);
extent-tree.c +106 -12
188 lines not on this page · raw message
ref-cache.c new file +195 -0
195 lines not on this page · raw message
ref-cache.h new file +71 -0
71 lines not on this page · raw message
transaction.c +50 -18
147 lines not on this page · raw message