Signed-off-by: Matt Helsley <matthltc@xxxxxxxxxx> Cc: Chris Mason <chris.mason@xxxxxxxxxx> Cc: linux-btrfs@xxxxxxxxxxxxxxx --- fs/btrfs/inode.c | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bb5064b..ce923eb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4776,14 +4776,15 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, unsigned long nr = 0; int err; int drop_inode = 0; - - if (inode->i_nlink == 0) - return -ENOENT; + int adopted = 0; /* do not allow sys_link's with other subvols of the same device */ if (root->objectid != BTRFS_I(inode)->root->objectid) return -EPERM; + if (inode->i_nlink == 0) + /* Not orphaned by truncate -- getting back in the game! */ + adopted = 1; btrfs_inc_nlink(inode); inode->i_ctime = CURRENT_TIME; @@ -4804,7 +4805,15 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, btrfs_set_trans_block_group(trans, dir); ihold(inode); - err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); + if (adopted) { + /* inode->i_nlink was 0 -- we were an orphan */ + err = btrfs_orphan_del(trans, inode); + if (err) + drop_inode = 1; + } + + if (!err) + err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); if (err) { drop_inode = 1; -- 1.6.3.3 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers