diff options
author | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2012-06-27 09:23:09 -0400 |
---|---|---|
committer | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2012-06-27 10:34:38 -0400 |
commit | 9345457f4a539a40056431aeb6f068750857472f (patch) | |
tree | 1637c2a734c85ee1d4808b2a5b36a57cd295df27 /fs | |
parent | 8ca78f3eda4bf1799e8c4ba02035623fd7a347df (diff) |
Btrfs: support root level changes in __resolve_indirect_ref
With the tree mod log, we can have a tree that's two levels high, but
btrfs_search_old_slot may still return a path with the tree root at level
one instead. __resolve_indirect_ref must care for this and accept parents in
a lower level than expected.
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/backref.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 7301cdb4b2cb..cf0df904347f 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -301,10 +301,14 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info, | |||
301 | goto out; | 301 | goto out; |
302 | 302 | ||
303 | eb = path->nodes[level]; | 303 | eb = path->nodes[level]; |
304 | if (!eb) { | 304 | while (!eb) { |
305 | WARN_ON(1); | 305 | if (!level) { |
306 | ret = 1; | 306 | WARN_ON(1); |
307 | goto out; | 307 | ret = 1; |
308 | goto out; | ||
309 | } | ||
310 | level--; | ||
311 | eb = path->nodes[level]; | ||
308 | } | 312 | } |
309 | 313 | ||
310 | ret = add_all_parents(root, path, parents, level, &ref->key_for_search, | 314 | ret = add_all_parents(root, path, parents, level, &ref->key_for_search, |