diff options
author | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2012-04-13 12:28:00 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2012-04-18 19:22:21 +0200 |
commit | aefc1eb13ebbb86c5ffade8a9e2425cd71032d7e (patch) | |
tree | 36acddddf6f4b50877b22e683704bc2cbaf4d3b5 | |
parent | 4735fb282830c0966b301dabcccf4753fa6604bb (diff) | |
download | linux-aefc1eb13ebbb86c5ffade8a9e2425cd71032d7e.tar.gz linux-aefc1eb13ebbb86c5ffade8a9e2425cd71032d7e.tar.bz2 linux-aefc1eb13ebbb86c5ffade8a9e2425cd71032d7e.zip |
Btrfs: don't call free_extent_buffer twice in iterate_irefs
Avoid calling free_extent_buffer more than once when the iterator function
returns non-zero. The only code that uses this is scrub repair for corrupted
nodatasum blocks.
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
-rw-r--r-- | fs/btrfs/backref.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index b332ff04c5ee..fb56bcc80377 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -1247,7 +1247,7 @@ static int iterate_irefs(u64 inum, struct btrfs_root *fs_root, struct btrfs_path *path, iterate_irefs_t *iterate, void *ctx) { - int ret; + int ret = 0; int slot; u32 cur; u32 len; @@ -1259,7 +1259,7 @@ static int iterate_irefs(u64 inum, struct btrfs_root *fs_root, struct btrfs_inode_ref *iref; struct btrfs_key found_key; - while (1) { + while (!ret) { ret = inode_ref_info(inum, parent ? parent+1 : 0, fs_root, path, &found_key); if (ret < 0) @@ -1288,10 +1288,8 @@ static int iterate_irefs(u64 inum, struct btrfs_root *fs_root, (unsigned long long)found_key.objectid, (unsigned long long)fs_root->objectid); ret = iterate(parent, iref, eb, ctx); - if (ret) { - free_extent_buffer(eb); + if (ret) break; - } len = sizeof(*iref) + name_len; iref = (struct btrfs_inode_ref *)((char *)iref + len); } |