Btrfs: make sure to copy everything if we rename
Linux-MTD Mailing List
linux-mtd at lists.infradead.org
Fri Nov 22 17:59:03 EST 2013
Gitweb: http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=6cfab851f42edcfa72763b3cb8dc26b8fd74e203
Commit: 6cfab851f42edcfa72763b3cb8dc26b8fd74e203
Parent: 4724b106b9b8e8b802ca6f6d8a2f74feb8a3c375
Author: Josef Bacik <jbacik at fusionio.com>
AuthorDate: Tue Nov 12 16:25:58 2013 -0500
Committer: Chris Mason <chris.mason at fusionio.com>
CommitDate: Wed Nov 20 20:41:24 2013 -0500
Btrfs: make sure to copy everything if we rename
If we rename a file that is already in the log and we fsync again we will lose
the new name. This is because we just log the inode update and not the new ref.
To fix this we just need to check if we are logging the new name of the inode
and copy all the metadata instead of just updating the inode itself. With this
patch my testcase now passes. Thanks,
Signed-off-by: Josef Bacik <jbacik at fusionio.com>
Signed-off-by: Chris Mason <chris.mason at fusionio.com>
---
fs/btrfs/tree-log.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 744553c..b0c7134 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -3697,7 +3697,8 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
ret = btrfs_truncate_inode_items(trans, log,
inode, 0, 0);
} else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
- &BTRFS_I(inode)->runtime_flags)) {
+ &BTRFS_I(inode)->runtime_flags) ||
+ inode_only == LOG_INODE_EXISTS) {
if (inode_only == LOG_INODE_ALL)
fast_search = true;
max_key.type = BTRFS_XATTR_ITEM_KEY;
More information about the linux-mtd-cvs
mailing list