err holds the return value of either btrfs_del_root_ref() or
btrfs_del_inode_ref() but it hasn't been checked since it's
introduction with commit fe66a05a0679 (Btrfs: improve error handling
for btrfs_insert_dir_item callers) in 2012.

Instead of silently ignoring the return values, print a message so the user
knows what kind of error has encountered.

Link: https://lore.kernel.org/linux-btrfs/20181119141323.gc24...@twin.jikos.cz
Signed-off-by: Johannes Thumshirn <jthumsh...@suse.de>
---

Changes to v1:
* Only print an error message and let the callers abort the transaction (Dave)
---
 fs/btrfs/inode.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 9becf8543489..8ca2f82b35a3 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6351,6 +6351,7 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
        struct btrfs_root *root = parent_inode->root;
        u64 ino = btrfs_ino(inode);
        u64 parent_ino = btrfs_ino(parent_inode);
+       int err;
 
        if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) {
                memcpy(&key, &inode->root->root_key, sizeof(key));
@@ -6395,17 +6396,25 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
 fail_dir_item:
        if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) {
                u64 local_index;
-               int err;
+
                err = btrfs_del_root_ref(trans, key.objectid,
                                         root->root_key.objectid, parent_ino,
                                         &local_index, name, name_len);
+               if (err)
+                       btrfs_info(trans->fs_info,
+                  "failed to delete reference to %.*s, root %llu ref %llu",
+                                  name_len, name, key.objectid,
+                                  root->root_key.objectid);
 
        } else if (add_backref) {
                u64 local_index;
-               int err;
 
                err = btrfs_del_inode_ref(trans, root, name, name_len,
                                          ino, parent_ino, &local_index);
+               if (err)
+                       btrfs_info(trans->fs_info,
+          "failed to delete reference to %.*s, inode %llu parent %llu",
+                                  name_len, name, ino, parent_ino);
        }
        return ret;
 }
-- 
2.16.4

Reply via email to