diff options
author | Yan Zheng <zheng.yan@oracle.com> | 2009-06-11 09:27:31 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-06-11 09:27:37 -0400 |
commit | 0e3c5d410ff0598d3311304983756aa6194724e9 (patch) | |
tree | ef8d039bf869fecb3b3fc3f79df85522fc935ac0 /extent-tree.c | |
parent | 0030f1d3aead310aa3a1d951311d47b3a819716b (diff) |
Check duplicate backrefs for both data and metadata
lookup_inline_extent_backref only checks for duplicate backref for data extent.
It assumes backrefs for tree block never conflict. This patch makes
lookup_inline_extent_backref check duplicate backrefs for both data and tree
block, so that we can detect potential bug earlier.
Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'extent-tree.c')
-rw-r--r-- | extent-tree.c | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/extent-tree.c b/extent-tree.c index 3ec57fa5..b2f9bb22 100644 --- a/extent-tree.c +++ b/extent-tree.c @@ -1061,12 +1061,6 @@ static int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, #endif BUG_ON(item_size < sizeof(*ei)); - if (owner < BTRFS_FIRST_FREE_OBJECTID && insert && - item_size + extra_size >= BTRFS_MAX_EXTENT_ITEM_SIZE(root)) { - err = -EAGAIN; - goto out; - } - ei = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_item); flags = btrfs_extent_flags(leaf, ei); @@ -1139,8 +1133,8 @@ static int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, * For simplicity, we just do not add new inline back * ref if there is any back ref item. */ - if (owner >= BTRFS_FIRST_FREE_OBJECTID && - find_next_key(path, &key) == 0 && key.objectid == bytenr) { + if (find_next_key(path, &key) == 0 && key.objectid == bytenr && + key.type < BTRFS_BLOCK_GROUP_ITEM_KEY) { err = -EAGAIN; goto out; } |