[PATCH 06/10] Support relinking unlinked files in btrfs
Matt Helsley
matthltc at us.ibm.com
Mon Feb 28 20:05:12 PST 2011
Signed-off-by: Matt Helsley <matthltc at us.ibm.com>
Cc: Chris Mason <chris.mason at oracle.com>
Cc: linux-btrfs at vger.kernel.org
---
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
More information about the Containers
mailing list