mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 22:51:37 +00:00
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:
commit
c226fd659f
24 changed files with 2828 additions and 1688 deletions
|
@ -668,14 +668,31 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
|
|||
static int btree_writepage(struct page *page, struct writeback_control *wbc)
|
||||
{
|
||||
struct extent_io_tree *tree;
|
||||
tree = &BTRFS_I(page->mapping->host)->io_tree;
|
||||
struct btrfs_root *root = BTRFS_I(page->mapping->host)->root;
|
||||
struct extent_buffer *eb;
|
||||
int was_dirty;
|
||||
|
||||
if (current->flags & PF_MEMALLOC) {
|
||||
redirty_page_for_writepage(wbc, page);
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
tree = &BTRFS_I(page->mapping->host)->io_tree;
|
||||
if (!(current->flags & PF_MEMALLOC)) {
|
||||
return extent_write_full_page(tree, page,
|
||||
btree_get_extent, wbc);
|
||||
}
|
||||
return extent_write_full_page(tree, page, btree_get_extent, wbc);
|
||||
|
||||
redirty_page_for_writepage(wbc, page);
|
||||
eb = btrfs_find_tree_block(root, page_offset(page),
|
||||
PAGE_CACHE_SIZE);
|
||||
WARN_ON(!eb);
|
||||
|
||||
was_dirty = test_and_set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags);
|
||||
if (!was_dirty) {
|
||||
spin_lock(&root->fs_info->delalloc_lock);
|
||||
root->fs_info->dirty_metadata_bytes += PAGE_CACHE_SIZE;
|
||||
spin_unlock(&root->fs_info->delalloc_lock);
|
||||
}
|
||||
free_extent_buffer(eb);
|
||||
|
||||
unlock_page(page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int btree_writepages(struct address_space *mapping,
|
||||
|
@ -684,15 +701,15 @@ static int btree_writepages(struct address_space *mapping,
|
|||
struct extent_io_tree *tree;
|
||||
tree = &BTRFS_I(mapping->host)->io_tree;
|
||||
if (wbc->sync_mode == WB_SYNC_NONE) {
|
||||
struct btrfs_root *root = BTRFS_I(mapping->host)->root;
|
||||
u64 num_dirty;
|
||||
u64 start = 0;
|
||||
unsigned long thresh = 32 * 1024 * 1024;
|
||||
|
||||
if (wbc->for_kupdate)
|
||||
return 0;
|
||||
|
||||
num_dirty = count_range_bits(tree, &start, (u64)-1,
|
||||
thresh, EXTENT_DIRTY);
|
||||
/* this is a bit racy, but that's ok */
|
||||
num_dirty = root->fs_info->dirty_metadata_bytes;
|
||||
if (num_dirty < thresh)
|
||||
return 0;
|
||||
}
|
||||
|
@ -859,9 +876,17 @@ int clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,
|
|||
root->fs_info->running_transaction->transid) {
|
||||
btrfs_assert_tree_locked(buf);
|
||||
|
||||
/* ugh, clear_extent_buffer_dirty can be expensive */
|
||||
btrfs_set_lock_blocking(buf);
|
||||
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &buf->bflags)) {
|
||||
spin_lock(&root->fs_info->delalloc_lock);
|
||||
if (root->fs_info->dirty_metadata_bytes >= buf->len)
|
||||
root->fs_info->dirty_metadata_bytes -= buf->len;
|
||||
else
|
||||
WARN_ON(1);
|
||||
spin_unlock(&root->fs_info->delalloc_lock);
|
||||
}
|
||||
|
||||
/* ugh, clear_extent_buffer_dirty needs to lock the page */
|
||||
btrfs_set_lock_blocking(buf);
|
||||
clear_extent_buffer_dirty(&BTRFS_I(btree_inode)->io_tree,
|
||||
buf);
|
||||
}
|
||||
|
@ -1471,12 +1496,6 @@ static int transaction_kthread(void *arg)
|
|||
vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
|
||||
mutex_lock(&root->fs_info->transaction_kthread_mutex);
|
||||
|
||||
if (root->fs_info->total_ref_cache_size > 20 * 1024 * 1024) {
|
||||
printk(KERN_INFO "btrfs: total reference cache "
|
||||
"size %llu\n",
|
||||
root->fs_info->total_ref_cache_size);
|
||||
}
|
||||
|
||||
mutex_lock(&root->fs_info->trans_mutex);
|
||||
cur = root->fs_info->running_transaction;
|
||||
if (!cur) {
|
||||
|
@ -1493,6 +1512,7 @@ static int transaction_kthread(void *arg)
|
|||
mutex_unlock(&root->fs_info->trans_mutex);
|
||||
trans = btrfs_start_transaction(root, 1);
|
||||
ret = btrfs_commit_transaction(trans, root);
|
||||
|
||||
sleep:
|
||||
wake_up_process(root->fs_info->cleaner_kthread);
|
||||
mutex_unlock(&root->fs_info->transaction_kthread_mutex);
|
||||
|
@ -1552,6 +1572,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|||
INIT_LIST_HEAD(&fs_info->dead_roots);
|
||||
INIT_LIST_HEAD(&fs_info->hashers);
|
||||
INIT_LIST_HEAD(&fs_info->delalloc_inodes);
|
||||
INIT_LIST_HEAD(&fs_info->ordered_operations);
|
||||
spin_lock_init(&fs_info->delalloc_lock);
|
||||
spin_lock_init(&fs_info->new_trans_lock);
|
||||
spin_lock_init(&fs_info->ref_cache_lock);
|
||||
|
@ -1611,10 +1632,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|||
|
||||
extent_io_tree_init(&fs_info->pinned_extents,
|
||||
fs_info->btree_inode->i_mapping, GFP_NOFS);
|
||||
extent_io_tree_init(&fs_info->pending_del,
|
||||
fs_info->btree_inode->i_mapping, GFP_NOFS);
|
||||
extent_io_tree_init(&fs_info->extent_ins,
|
||||
fs_info->btree_inode->i_mapping, GFP_NOFS);
|
||||
fs_info->do_barriers = 1;
|
||||
|
||||
INIT_LIST_HEAD(&fs_info->dead_reloc_roots);
|
||||
|
@ -1627,9 +1644,9 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|||
insert_inode_hash(fs_info->btree_inode);
|
||||
|
||||
mutex_init(&fs_info->trans_mutex);
|
||||
mutex_init(&fs_info->ordered_operations_mutex);
|
||||
mutex_init(&fs_info->tree_log_mutex);
|
||||
mutex_init(&fs_info->drop_mutex);
|
||||
mutex_init(&fs_info->extent_ins_mutex);
|
||||
mutex_init(&fs_info->pinned_mutex);
|
||||
mutex_init(&fs_info->chunk_mutex);
|
||||
mutex_init(&fs_info->transaction_kthread_mutex);
|
||||
|
@ -2358,8 +2375,7 @@ void btrfs_mark_buffer_dirty(struct extent_buffer *buf)
|
|||
struct btrfs_root *root = BTRFS_I(buf->first_page->mapping->host)->root;
|
||||
u64 transid = btrfs_header_generation(buf);
|
||||
struct inode *btree_inode = root->fs_info->btree_inode;
|
||||
|
||||
btrfs_set_lock_blocking(buf);
|
||||
int was_dirty;
|
||||
|
||||
btrfs_assert_tree_locked(buf);
|
||||
if (transid != root->fs_info->generation) {
|
||||
|
@ -2370,7 +2386,13 @@ void btrfs_mark_buffer_dirty(struct extent_buffer *buf)
|
|||
(unsigned long long)root->fs_info->generation);
|
||||
WARN_ON(1);
|
||||
}
|
||||
set_extent_buffer_dirty(&BTRFS_I(btree_inode)->io_tree, buf);
|
||||
was_dirty = set_extent_buffer_dirty(&BTRFS_I(btree_inode)->io_tree,
|
||||
buf);
|
||||
if (!was_dirty) {
|
||||
spin_lock(&root->fs_info->delalloc_lock);
|
||||
root->fs_info->dirty_metadata_bytes += buf->len;
|
||||
spin_unlock(&root->fs_info->delalloc_lock);
|
||||
}
|
||||
}
|
||||
|
||||
void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)
|
||||
|
@ -2410,6 +2432,7 @@ int btrfs_read_buffer(struct extent_buffer *buf, u64 parent_transid)
|
|||
int btree_lock_page_hook(struct page *page)
|
||||
{
|
||||
struct inode *inode = page->mapping->host;
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
|
||||
struct extent_buffer *eb;
|
||||
unsigned long len;
|
||||
|
@ -2425,6 +2448,16 @@ int btree_lock_page_hook(struct page *page)
|
|||
|
||||
btrfs_tree_lock(eb);
|
||||
btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
|
||||
|
||||
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) {
|
||||
spin_lock(&root->fs_info->delalloc_lock);
|
||||
if (root->fs_info->dirty_metadata_bytes >= eb->len)
|
||||
root->fs_info->dirty_metadata_bytes -= eb->len;
|
||||
else
|
||||
WARN_ON(1);
|
||||
spin_unlock(&root->fs_info->delalloc_lock);
|
||||
}
|
||||
|
||||
btrfs_tree_unlock(eb);
|
||||
free_extent_buffer(eb);
|
||||
out:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue