diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a807acc9a63e..4595a65db729 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -2130,15 +2130,28 @@ again: | |||
2130 | } | 2130 | } |
2131 | if (ret > 0) { | 2131 | if (ret > 0) { |
2132 | if (metadata) { | 2132 | if (metadata) { |
2133 | btrfs_release_path(path); | 2133 | if (path->slots[0] > 0) { |
2134 | metadata = 0; | 2134 | path->slots[0]--; |
2135 | btrfs_item_key_to_cpu(path->nodes[0], &key, | ||
2136 | path->slots[0]); | ||
2137 | if (key.objectid == node->bytenr && | ||
2138 | key.type == BTRFS_EXTENT_ITEM_KEY && | ||
2139 | key.offset == node->num_bytes) | ||
2140 | ret = 0; | ||
2141 | } | ||
2142 | if (ret > 0) { | ||
2143 | btrfs_release_path(path); | ||
2144 | metadata = 0; | ||
2135 | 2145 | ||
2136 | key.offset = node->num_bytes; | 2146 | key.objectid = node->bytenr; |
2137 | key.type = BTRFS_EXTENT_ITEM_KEY; | 2147 | key.offset = node->num_bytes; |
2138 | goto again; | 2148 | key.type = BTRFS_EXTENT_ITEM_KEY; |
2149 | goto again; | ||
2150 | } | ||
2151 | } else { | ||
2152 | err = -EIO; | ||
2153 | goto out; | ||
2139 | } | 2154 | } |
2140 | err = -EIO; | ||
2141 | goto out; | ||
2142 | } | 2155 | } |
2143 | 2156 | ||
2144 | leaf = path->nodes[0]; | 2157 | leaf = path->nodes[0]; |