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 de6de8e60b46..02fae7f7e42c 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, | |||
951 | BUG_ON(ret); /* -ENOMEM */ | 951 | BUG_ON(ret); /* -ENOMEM */ |
952 | } | 952 | } |
953 | if (new_flags != 0) { | 953 | if (new_flags != 0) { |
954 | int level = btrfs_header_level(buf); | ||
955 | |||
954 | ret = btrfs_set_disk_extent_flags(trans, root, | 956 | ret = btrfs_set_disk_extent_flags(trans, root, |
955 | buf->start, | 957 | buf->start, |
956 | buf->len, | 958 | buf->len, |
957 | new_flags, 0); | 959 | new_flags, level, 0); |
958 | if (ret) | 960 | if (ret) |
959 | return ret; | 961 | return ret; |
960 | } | 962 | } |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 2720d5555883..d6dd49b51ba8 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, | |||
3075 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, | 3075 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, |
3076 | struct btrfs_root *root, | 3076 | struct btrfs_root *root, |
3077 | u64 bytenr, u64 num_bytes, u64 flags, | 3077 | u64 bytenr, u64 num_bytes, u64 flags, |
3078 | int is_data); | 3078 | int level, int is_data); |
3079 | int btrfs_free_extent(struct btrfs_trans_handle *trans, | 3079 | int btrfs_free_extent(struct btrfs_trans_handle *trans, |
3080 | struct btrfs_root *root, | 3080 | struct btrfs_root *root, |
3081 | u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, | 3081 | 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 f75fcaf79aeb..70b962cc177d 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h | |||
@@ -60,6 +60,7 @@ struct btrfs_delayed_ref_node { | |||
60 | struct btrfs_delayed_extent_op { | 60 | struct btrfs_delayed_extent_op { |
61 | struct btrfs_disk_key key; | 61 | struct btrfs_disk_key key; |
62 | u64 flags_to_set; | 62 | u64 flags_to_set; |
63 | int level; | ||
63 | unsigned int update_key:1; | 64 | unsigned int update_key:1; |
64 | unsigned int update_flags:1; | 65 | unsigned int update_flags:1; |
65 | unsigned int is_data:1; | 66 | unsigned int is_data:1; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 2305b5c5cf00..c4c94b30c729 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, | |||
2070 | u32 item_size; | 2070 | u32 item_size; |
2071 | int ret; | 2071 | int ret; |
2072 | int err = 0; | 2072 | int err = 0; |
2073 | int metadata = (node->type == BTRFS_TREE_BLOCK_REF_KEY || | 2073 | int metadata = !extent_op->is_data; |
2074 | node->type == BTRFS_SHARED_BLOCK_REF_KEY); | ||
2075 | 2074 | ||
2076 | if (trans->aborted) | 2075 | if (trans->aborted) |
2077 | return 0; | 2076 | return 0; |
@@ -2086,11 +2085,8 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans, | |||
2086 | key.objectid = node->bytenr; | 2085 | key.objectid = node->bytenr; |
2087 | 2086 | ||
2088 | if (metadata) { | 2087 | if (metadata) { |
2089 | struct btrfs_delayed_tree_ref *tree_ref; | ||
2090 | |||
2091 | tree_ref = btrfs_delayed_node_to_tree_ref(node); | ||
2092 | key.type = BTRFS_METADATA_ITEM_KEY; | 2088 | key.type = BTRFS_METADATA_ITEM_KEY; |
2093 | key.offset = tree_ref->level; | 2089 | key.offset = extent_op->level; |
2094 | } else { | 2090 | } else { |
2095 | key.type = BTRFS_EXTENT_ITEM_KEY; | 2091 | key.type = BTRFS_EXTENT_ITEM_KEY; |
2096 | key.offset = node->num_bytes; | 2092 | key.offset = node->num_bytes; |
@@ -2719,7 +2715,7 @@ out: | |||
2719 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, | 2715 | int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, |
2720 | struct btrfs_root *root, | 2716 | struct btrfs_root *root, |
2721 | u64 bytenr, u64 num_bytes, u64 flags, | 2717 | u64 bytenr, u64 num_bytes, u64 flags, |
2722 | int is_data) | 2718 | int level, int is_data) |
2723 | { | 2719 | { |
2724 | struct btrfs_delayed_extent_op *extent_op; | 2720 | struct btrfs_delayed_extent_op *extent_op; |
2725 | int ret; | 2721 | int ret; |
@@ -2732,6 +2728,7 @@ int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, | |||
2732 | extent_op->update_flags = 1; | 2728 | extent_op->update_flags = 1; |
2733 | extent_op->update_key = 0; | 2729 | extent_op->update_key = 0; |
2734 | extent_op->is_data = is_data ? 1 : 0; | 2730 | extent_op->is_data = is_data ? 1 : 0; |
2731 | extent_op->level = level; | ||
2735 | 2732 | ||
2736 | ret = btrfs_add_delayed_extent_op(root->fs_info, trans, bytenr, | 2733 | ret = btrfs_add_delayed_extent_op(root->fs_info, trans, bytenr, |
2737 | num_bytes, extent_op); | 2734 | num_bytes, extent_op); |
@@ -6763,6 +6760,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
6763 | extent_op->update_key = 1; | 6760 | extent_op->update_key = 1; |
6764 | extent_op->update_flags = 1; | 6761 | extent_op->update_flags = 1; |
6765 | extent_op->is_data = 0; | 6762 | extent_op->is_data = 0; |
6763 | extent_op->level = level; | ||
6766 | 6764 | ||
6767 | ret = btrfs_add_delayed_tree_ref(root->fs_info, trans, | 6765 | ret = btrfs_add_delayed_tree_ref(root->fs_info, trans, |
6768 | ins.objectid, | 6766 | ins.objectid, |
@@ -6934,7 +6932,8 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans, | |||
6934 | ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc); | 6932 | ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc); |
6935 | BUG_ON(ret); /* -ENOMEM */ | 6933 | BUG_ON(ret); /* -ENOMEM */ |
6936 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, | 6934 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, |
6937 | eb->len, flag, 0); | 6935 | eb->len, flag, |
6936 | btrfs_header_level(eb), 0); | ||
6938 | BUG_ON(ret); /* -ENOMEM */ | 6937 | BUG_ON(ret); /* -ENOMEM */ |
6939 | wc->flags[level] |= flag; | 6938 | wc->flags[level] |= flag; |
6940 | } | 6939 | } |