Merge branch 'for-linus-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
Pull btrfs fixes from Chris Mason: "Filipe fixed up a hard to trigger ENOSPC regression from our merge window pull, and we have a few other smaller fixes" * 'for-linus-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: Btrfs: fix quick exhaustion of the system array in the superblock btrfs: its btrfs_err() instead of btrfs_error() btrfs: Avoid NULL pointer dereference of free_extent_buffer when read_tree_block() fail btrfs: Fix lockdep warning of btrfs_run_delayed_iputs()
This commit is contained in:
commit
acea568fa9
|
@ -378,7 +378,7 @@ int btrfs_dev_replace_start(struct btrfs_root *root,
|
|||
|
||||
ret = btrfs_kobj_add_device(tgt_device->fs_devices, tgt_device);
|
||||
if (ret)
|
||||
btrfs_error(root->fs_info, ret, "kobj add dev failed");
|
||||
btrfs_err(root->fs_info, "kobj add dev failed %d\n", ret);
|
||||
|
||||
printk_in_rcu(KERN_INFO
|
||||
"BTRFS: dev_replace from %s (devid %llu) to %s started\n",
|
||||
|
|
|
@ -2842,6 +2842,7 @@ int open_ctree(struct super_block *sb,
|
|||
!extent_buffer_uptodate(chunk_root->node)) {
|
||||
printk(KERN_ERR "BTRFS: failed to read chunk root on %s\n",
|
||||
sb->s_id);
|
||||
chunk_root->node = NULL;
|
||||
goto fail_tree_roots;
|
||||
}
|
||||
btrfs_set_root_node(&chunk_root->root_item, chunk_root->node);
|
||||
|
@ -2879,7 +2880,7 @@ int open_ctree(struct super_block *sb,
|
|||
!extent_buffer_uptodate(tree_root->node)) {
|
||||
printk(KERN_WARNING "BTRFS: failed to read tree root on %s\n",
|
||||
sb->s_id);
|
||||
|
||||
tree_root->node = NULL;
|
||||
goto recovery_tree_root;
|
||||
}
|
||||
|
||||
|
|
|
@ -4227,6 +4227,24 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans,
|
|||
space_info->chunk_alloc = 0;
|
||||
spin_unlock(&space_info->lock);
|
||||
mutex_unlock(&fs_info->chunk_mutex);
|
||||
/*
|
||||
* When we allocate a new chunk we reserve space in the chunk block
|
||||
* reserve to make sure we can COW nodes/leafs in the chunk tree or
|
||||
* add new nodes/leafs to it if we end up needing to do it when
|
||||
* inserting the chunk item and updating device items as part of the
|
||||
* second phase of chunk allocation, performed by
|
||||
* btrfs_finish_chunk_alloc(). So make sure we don't accumulate a
|
||||
* large number of new block groups to create in our transaction
|
||||
* handle's new_bgs list to avoid exhausting the chunk block reserve
|
||||
* in extreme cases - like having a single transaction create many new
|
||||
* block groups when starting to write out the free space caches of all
|
||||
* the block groups that were made dirty during the lifetime of the
|
||||
* transaction.
|
||||
*/
|
||||
if (trans->chunk_bytes_reserved >= (2 * 1024 * 1024ull)) {
|
||||
btrfs_create_pending_block_groups(trans, trans->root);
|
||||
btrfs_trans_release_chunk_metadata(trans);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -2152,7 +2152,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
|
|||
|
||||
kmem_cache_free(btrfs_trans_handle_cachep, trans);
|
||||
|
||||
if (current != root->fs_info->transaction_kthread)
|
||||
if (current != root->fs_info->transaction_kthread &&
|
||||
current != root->fs_info->cleaner_kthread)
|
||||
btrfs_run_delayed_iputs(root);
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue