Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: Btrfs: try to free metadata pages when we free btree blocks Btrfs: add extra flushing for renames and truncates Btrfs: make sure btrfs_update_delayed_ref doesn't increase ref_mod Btrfs: optimize fsyncs on old files Btrfs: tree logging unlink/rename fixes Btrfs: Make sure i_nlink doesn't hit zero too soon during log replay Btrfs: limit balancing work while flushing delayed refs Btrfs: readahead checksums during btrfs_finish_ordered_io Btrfs: leave btree locks spinning more often Btrfs: Only let very young transactions grow during commit Btrfs: Check for a blocking lock before taking the spin Btrfs: reduce stack in cow_file_range Btrfs: reduce stalls during transaction commit Btrfs: process the delayed reference queue in clusters Btrfs: try to cleanup delayed refs while freeing extents Btrfs: reduce stack usage in some crucial tree balancing functions Btrfs: do extent allocation and reference count updates in the background Btrfs: don't preallocate metadata blocks during btrfs_search_slot
This commit is contained in:
@@ -45,6 +45,13 @@ struct btrfs_ordered_sum;
|
||||
|
||||
#define BTRFS_MAX_LEVEL 8
|
||||
|
||||
/*
|
||||
* files bigger than this get some pre-flushing when they are added
|
||||
* to the ordered operations list. That way we limit the total
|
||||
* work done by the commit
|
||||
*/
|
||||
#define BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT (8 * 1024 * 1024)
|
||||
|
||||
/* holds pointers to all of the tree roots */
|
||||
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
|
||||
|
||||
@@ -401,15 +408,16 @@ struct btrfs_path {
|
||||
int locks[BTRFS_MAX_LEVEL];
|
||||
int reada;
|
||||
/* keep some upper locks as we walk down */
|
||||
int keep_locks;
|
||||
int skip_locking;
|
||||
int lowest_level;
|
||||
|
||||
/*
|
||||
* set by btrfs_split_item, tells search_slot to keep all locks
|
||||
* and to force calls to keep space in the nodes
|
||||
*/
|
||||
int search_for_split;
|
||||
unsigned int search_for_split:1;
|
||||
unsigned int keep_locks:1;
|
||||
unsigned int skip_locking:1;
|
||||
unsigned int leave_spinning:1;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -688,15 +696,18 @@ struct btrfs_fs_info {
|
||||
struct rb_root block_group_cache_tree;
|
||||
|
||||
struct extent_io_tree pinned_extents;
|
||||
struct extent_io_tree pending_del;
|
||||
struct extent_io_tree extent_ins;
|
||||
|
||||
/* logical->physical extent mapping */
|
||||
struct btrfs_mapping_tree mapping_tree;
|
||||
|
||||
u64 generation;
|
||||
u64 last_trans_committed;
|
||||
u64 last_trans_new_blockgroup;
|
||||
|
||||
/*
|
||||
* this is updated to the current trans every time a full commit
|
||||
* is required instead of the faster short fsync log commits
|
||||
*/
|
||||
u64 last_trans_log_full_commit;
|
||||
u64 open_ioctl_trans;
|
||||
unsigned long mount_opt;
|
||||
u64 max_extent;
|
||||
@@ -717,12 +728,21 @@ struct btrfs_fs_info {
|
||||
struct mutex tree_log_mutex;
|
||||
struct mutex transaction_kthread_mutex;
|
||||
struct mutex cleaner_mutex;
|
||||
struct mutex extent_ins_mutex;
|
||||
struct mutex pinned_mutex;
|
||||
struct mutex chunk_mutex;
|
||||
struct mutex drop_mutex;
|
||||
struct mutex volume_mutex;
|
||||
struct mutex tree_reloc_mutex;
|
||||
|
||||
/*
|
||||
* this protects the ordered operations list only while we are
|
||||
* processing all of the entries on it. This way we make
|
||||
* sure the commit code doesn't find the list temporarily empty
|
||||
* because another function happens to be doing non-waiting preflush
|
||||
* before jumping into the main commit.
|
||||
*/
|
||||
struct mutex ordered_operations_mutex;
|
||||
|
||||
struct list_head trans_list;
|
||||
struct list_head hashers;
|
||||
struct list_head dead_roots;
|
||||
@@ -737,9 +757,28 @@ struct btrfs_fs_info {
|
||||
* ordered extents
|
||||
*/
|
||||
spinlock_t ordered_extent_lock;
|
||||
|
||||
/*
|
||||
* all of the data=ordered extents pending writeback
|
||||
* these can span multiple transactions and basically include
|
||||
* every dirty data page that isn't from nodatacow
|
||||
*/
|
||||
struct list_head ordered_extents;
|
||||
|
||||
/*
|
||||
* all of the inodes that have delalloc bytes. It is possible for
|
||||
* this list to be empty even when there is still dirty data=ordered
|
||||
* extents waiting to finish IO.
|
||||
*/
|
||||
struct list_head delalloc_inodes;
|
||||
|
||||
/*
|
||||
* special rename and truncate targets that must be on disk before
|
||||
* we're allowed to commit. This is basically the ext3 style
|
||||
* data=ordered list.
|
||||
*/
|
||||
struct list_head ordered_operations;
|
||||
|
||||
/*
|
||||
* there is a pool of worker threads for checksumming during writes
|
||||
* and a pool for checksumming after reads. This is because readers
|
||||
@@ -781,6 +820,11 @@ struct btrfs_fs_info {
|
||||
atomic_t throttle_gen;
|
||||
|
||||
u64 total_pinned;
|
||||
|
||||
/* protected by the delalloc lock, used to keep from writing
|
||||
* metadata until there is a nice batch
|
||||
*/
|
||||
u64 dirty_metadata_bytes;
|
||||
struct list_head dirty_cowonly_roots;
|
||||
|
||||
struct btrfs_fs_devices *fs_devices;
|
||||
@@ -1704,18 +1748,15 @@ static inline struct dentry *fdentry(struct file *file)
|
||||
}
|
||||
|
||||
/* extent-tree.c */
|
||||
int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, unsigned long count);
|
||||
int btrfs_lookup_extent(struct btrfs_root *root, u64 start, u64 len);
|
||||
int btrfs_lookup_extent_ref(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, u64 bytenr,
|
||||
u64 num_bytes, u32 *refs);
|
||||
int btrfs_update_pinned_extents(struct btrfs_root *root,
|
||||
u64 bytenr, u64 num, int pin);
|
||||
int btrfs_drop_leaf_ref(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, struct extent_buffer *leaf);
|
||||
int btrfs_cross_ref_exist(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, u64 objectid, u64 bytenr);
|
||||
int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root);
|
||||
int btrfs_copy_pinned(struct btrfs_root *root, struct extent_io_tree *copy);
|
||||
struct btrfs_block_group_cache *btrfs_lookup_block_group(
|
||||
struct btrfs_fs_info *info,
|
||||
@@ -1777,7 +1818,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
|
||||
u64 root_objectid, u64 ref_generation,
|
||||
u64 owner_objectid);
|
||||
int btrfs_update_extent_ref(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, u64 bytenr,
|
||||
struct btrfs_root *root, u64 bytenr, u64 num_bytes,
|
||||
u64 orig_parent, u64 parent,
|
||||
u64 root_objectid, u64 ref_generation,
|
||||
u64 owner_objectid);
|
||||
@@ -1838,7 +1879,7 @@ int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
|
||||
int btrfs_cow_block(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, struct extent_buffer *buf,
|
||||
struct extent_buffer *parent, int parent_slot,
|
||||
struct extent_buffer **cow_ret, u64 prealloc_dest);
|
||||
struct extent_buffer **cow_ret);
|
||||
int btrfs_copy_root(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root,
|
||||
struct extent_buffer *buf,
|
||||
|
Reference in New Issue
Block a user