diff options
| -rw-r--r-- | fs/btrfs/ctree.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/ctree.h | 2 | ||||
| -rw-r--r-- | fs/btrfs/delayed-ref.h | 1 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 15 | 
4 files changed, 12 insertions, 10 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index de6de8e60b4..02fae7f7e42 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -951,10 +951,12 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,  			BUG_ON(ret); /* -ENOMEM */  		}  		if (new_flags != 0) { +			int level = btrfs_header_level(buf); +  			ret = btrfs_set_disk_extent_flags(trans, root,  							  buf->start,  							  buf->len, -							  new_flags, 0); +							  new_flags, level, 0);  			if (ret)  				return ret;  		} diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 2720d555588..d6dd49b51ba 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -3075,7 +3075,7 @@ int btrfs_dec_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,  int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans,  				struct btrfs_root *root,  				u64 bytenr, u64 num_bytes, u64 flags, -				int is_data); +				int level, int is_data);  int btrfs_free_extent(struct btrfs_trans_handle *trans,  		      struct btrfs_root *root,  		      u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index f75fcaf79ae..70b962cc177 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h @@ -60,6 +60,7 @@ struct btrfs_delayed_ref_node {  struct btrfs_delayed_extent_op {  	struct btrfs_disk_key key;  	u64 flags_to_set; +	int level;  	unsigned int update_key:1;  	unsigned int update_flags:1;  	unsigned int is_data:1; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 2305b5c5cf0..c4c94b30c72 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2070,8 +2070,7 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,  	u32 item_size;  	int ret;  	int err = 0; -	int metadata = (node->type == BTRFS_TREE_BLOCK_REF_KEY || -			node->type == BTRFS_SHARED_BLOCK_REF_KEY); +	int metadata = !extent_op->is_data;  	if (trans->aborted)  		return 0; @@ -2086,11 +2085,8 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,  	key.objectid = node->bytenr;  	if (metadata) { -		struct btrfs_delayed_tree_ref *tree_ref; - -		tree_ref = btrfs_delayed_node_to_tree_ref(node);  		key.type = BTRFS_METADATA_ITEM_KEY; -		key.offset = tree_ref->level; +		key.offset = extent_op->level;  	} else {  		key.type = BTRFS_EXTENT_ITEM_KEY;  		key.offset = node->num_bytes; @@ -2719,7 +2715,7 @@ out:  int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans,  				struct btrfs_root *root,  				u64 bytenr, u64 num_bytes, u64 flags, -				int is_data) +				int level, int is_data)  {  	struct btrfs_delayed_extent_op *extent_op;  	int ret; @@ -2732,6 +2728,7 @@ int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans,  	extent_op->update_flags = 1;  	extent_op->update_key = 0;  	extent_op->is_data = is_data ? 1 : 0; +	extent_op->level = level;  	ret = btrfs_add_delayed_extent_op(root->fs_info, trans, bytenr,  					  num_bytes, extent_op); @@ -6763,6 +6760,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,  			extent_op->update_key = 1;  		extent_op->update_flags = 1;  		extent_op->is_data = 0; +		extent_op->level = level;  		ret = btrfs_add_delayed_tree_ref(root->fs_info, trans,  					ins.objectid, @@ -6934,7 +6932,8 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans,  		ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc);  		BUG_ON(ret); /* -ENOMEM */  		ret = btrfs_set_disk_extent_flags(trans, root, eb->start, -						  eb->len, flag, 0); +						  eb->len, flag, +						  btrfs_header_level(eb), 0);  		BUG_ON(ret); /* -ENOMEM */  		wc->flags[level] |= flag;  	}  |