Btrfs: log recovery, don't unlink inode always on error

If we get any error while doing a dir index/item lookup in the
log tree, we were always unlinking the corresponding inode in
the subvolume. It makes sense to unlink only if the lookup failed
to find the dir index/item, which corresponds to NULL or -ENOENT,
and not when other errors happen (like a transient -ENOMEM or -EIO).

Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
This commit is contained in:
Filipe David Borba Manana 2013-10-28 17:39:21 +00:00 committed by Chris Mason
parent 488111aa0e
commit 269d040ff2
1 changed files with 4 additions and 1 deletions

View File

@ -1832,7 +1832,7 @@ again:
dir_key->offset, dir_key->offset,
name, name_len, 0); name, name_len, 0);
} }
if (IS_ERR_OR_NULL(log_di)) { if (!log_di || (IS_ERR(log_di) && PTR_ERR(log_di) == -ENOENT)) {
btrfs_dir_item_key_to_cpu(eb, di, &location); btrfs_dir_item_key_to_cpu(eb, di, &location);
btrfs_release_path(path); btrfs_release_path(path);
btrfs_release_path(log_path); btrfs_release_path(log_path);
@ -1869,6 +1869,9 @@ again:
goto again; goto again;
ret = 0; ret = 0;
goto out; goto out;
} else if (IS_ERR(log_di)) {
kfree(name);
return PTR_ERR(log_di);
} }
btrfs_release_path(log_path); btrfs_release_path(log_path);
kfree(name); kfree(name);