diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 43fdb2992956..1f7f39b10bd0 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -6,6 +6,7 @@  #include <linux/slab.h>  #include <linux/iversion.h> +#include "misc.h"  #include "delayed-inode.h"  #include "disk-io.h"  #include "transaction.h" @@ -474,6 +475,9 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)  	struct rb_root_cached *root;  	struct btrfs_delayed_root *delayed_root; +	/* Not associated with any delayed_node */ +	if (!delayed_item->delayed_node) +		return;  	delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root;  	BUG_ON(!delayed_root); @@ -555,7 +559,7 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,  	src_rsv = trans->block_rsv;  	dst_rsv = &fs_info->delayed_block_rsv; -	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); +	num_bytes = btrfs_calc_insert_metadata_size(fs_info, 1);  	/*  	 * Here we migrate space rsv from transaction rsv, since have already @@ -609,7 +613,7 @@ static int btrfs_delayed_inode_reserve_metadata(  	src_rsv = trans->block_rsv;  	dst_rsv = &fs_info->delayed_block_rsv; -	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); +	num_bytes = btrfs_calc_metadata_size(fs_info, 1);  	/*  	 * btrfs_dirty_inode will update the inode under btrfs_join_transaction @@ -1525,7 +1529,12 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,  	 * we have reserved enough space when we start a new transaction,  	 * so reserving metadata failure is impossible.  	 */ -	BUG_ON(ret); +	if (ret < 0) { +		btrfs_err(trans->fs_info, +"metadata reservation failed for delayed dir item deltiona, should have been reserved"); +		btrfs_release_delayed_item(item); +		goto end; +	}  	mutex_lock(&node->mutex);  	ret = __btrfs_add_delayed_deletion_item(node, item); @@ -1534,7 +1543,8 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,  			  "err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)",  			  index, node->root->root_key.objectid,  			  node->inode_id, ret); -		BUG(); +		btrfs_delayed_item_release_metadata(dir->root, item); +		btrfs_release_delayed_item(item);  	}  	mutex_unlock(&node->mutex);  end:  |