Btrfs: log recovery, don't unlink inode always on error
authorFilipe David Borba Manana <fdmanana@gmail.com>
Mon, 28 Oct 2013 17:39:21 +0000 (17:39 +0000)
committerChris Mason <chris.mason@fusionio.com>
Tue, 12 Nov 2013 03:10:48 +0000 (22:10 -0500)
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>
fs/btrfs/tree-log.c

index 18891c009641f8403953fd0867bec353f3a43c62..7927a5fa755cfaaeaac6328013a80832000658a2 100644 (file)
@@ -1832,7 +1832,7 @@ again:
                                                     dir_key->offset,
                                                     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_release_path(path);
                        btrfs_release_path(log_path);
@@ -1869,6 +1869,9 @@ again:
                                goto again;
                        ret = 0;
                        goto out;
+               } else if (IS_ERR(log_di)) {
+                       kfree(name);
+                       return PTR_ERR(log_di);
                }
                btrfs_release_path(log_path);
                kfree(name);