On Fri, Nov 23, 2018 at 09:42:43AM +0100, Johannes Thumshirn wrote: > 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);
I though a transaction abort would be here, as the state is not consistent. Also I'm not sure what I as a user would get from such error message after calling link(). If the error handling in the error handling fails, there's not much left to do and the abort either happened earlier in the callees or is necessary here.