From 32f8147e5297ab773d69ab82d651f445aac349f7 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Thu, 11 Oct 2012 15:53:56 -0400 Subject: [PATCH] --- yaml --- r: 346735 b: refs/heads/master c: e99761514999f64aff1985460967f93d9e8417f4 h: refs/heads/master i: 346733: 9cee7f7e90bbf0280a2b1dd2b85e2df88d3befed 346731: a557920946b990c46a793867abc732a9151c9f1d 346727: 65caced43df005a7ae29326c7e57083ea86c496b 346719: bd956ad4eca2065a0a2be748c01563c44e222798 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/btrfs_inode.h | 1 + trunk/fs/btrfs/inode.c | 1 + trunk/fs/btrfs/tree-log.c | 10 ++++++++-- trunk/fs/btrfs/xattr.c | 1 + 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index a0bcc8daba1c..f75e013351c9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5f3ab90a72f98adbf00c50ac2d4d2b47cf4a9685 +refs/heads/master: e99761514999f64aff1985460967f93d9e8417f4 diff --git a/trunk/fs/btrfs/btrfs_inode.h b/trunk/fs/btrfs/btrfs_inode.h index ed8ca7ca5eff..2411baf35220 100644 --- a/trunk/fs/btrfs/btrfs_inode.h +++ b/trunk/fs/btrfs/btrfs_inode.h @@ -39,6 +39,7 @@ #define BTRFS_INODE_HAS_ORPHAN_ITEM 5 #define BTRFS_INODE_HAS_ASYNC_EXTENT 6 #define BTRFS_INODE_NEEDS_FULL_SYNC 7 +#define BTRFS_INODE_COPY_EVERYTHING 8 /* in memory btrfs inode */ struct btrfs_inode { diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 0446cbe8bcaf..123815f3b454 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -5083,6 +5083,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, inode_inc_iversion(inode); inode->i_ctime = CURRENT_TIME; ihold(inode); + set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags); err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); diff --git a/trunk/fs/btrfs/tree-log.c b/trunk/fs/btrfs/tree-log.c index 40b9efd20e43..f05fca778cb4 100644 --- a/trunk/fs/btrfs/tree-log.c +++ b/trunk/fs/btrfs/tree-log.c @@ -3429,14 +3429,20 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, } else { if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &BTRFS_I(inode)->runtime_flags)) { + clear_bit(BTRFS_INODE_COPY_EVERYTHING, + &BTRFS_I(inode)->runtime_flags); ret = btrfs_truncate_inode_items(trans, log, inode, 0, 0); } else { if (inode_only == LOG_INODE_ALL) fast_search = true; - max_key.type = BTRFS_XATTR_ITEM_KEY; + if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, + &BTRFS_I(inode)->runtime_flags)) + max_key.type = BTRFS_XATTR_ITEM_KEY; + else + max_key.type = BTRFS_INODE_ITEM_KEY; ret = drop_objectid_items(trans, log, path, ino, - BTRFS_XATTR_ITEM_KEY); + max_key.type); } } if (ret) { diff --git a/trunk/fs/btrfs/xattr.c b/trunk/fs/btrfs/xattr.c index aef6bb3c5f5c..446a6848c554 100644 --- a/trunk/fs/btrfs/xattr.c +++ b/trunk/fs/btrfs/xattr.c @@ -208,6 +208,7 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans, inode_inc_iversion(inode); inode->i_ctime = CURRENT_TIME; + set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags); ret = btrfs_update_inode(trans, root, inode); BUG_ON(ret); out: