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