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