aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/btrfs_inode.h1
-rw-r--r--fs/btrfs/inode.c1
-rw-r--r--fs/btrfs/tree-log.c10
-rw-r--r--fs/btrfs/xattr.c1
4 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index ed8ca7ca5eff..2411baf35220 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -39,6 +39,7 @@
39#define BTRFS_INODE_HAS_ORPHAN_ITEM 5 39#define BTRFS_INODE_HAS_ORPHAN_ITEM 5
40#define BTRFS_INODE_HAS_ASYNC_EXTENT 6 40#define BTRFS_INODE_HAS_ASYNC_EXTENT 6
41#define BTRFS_INODE_NEEDS_FULL_SYNC 7 41#define BTRFS_INODE_NEEDS_FULL_SYNC 7
42#define BTRFS_INODE_COPY_EVERYTHING 8
42 43
43/* in memory btrfs inode */ 44/* in memory btrfs inode */
44struct btrfs_inode { 45struct btrfs_inode {
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 0446cbe8bcaf..123815f3b454 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5083,6 +5083,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
5083 inode_inc_iversion(inode); 5083 inode_inc_iversion(inode);
5084 inode->i_ctime = CURRENT_TIME; 5084 inode->i_ctime = CURRENT_TIME;
5085 ihold(inode); 5085 ihold(inode);
5086 set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
5086 5087
5087 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); 5088 err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index);
5088 5089
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 40b9efd20e43..f05fca778cb4 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -3429,14 +3429,20 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3429 } else { 3429 } else {
3430 if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, 3430 if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
3431 &BTRFS_I(inode)->runtime_flags)) { 3431 &BTRFS_I(inode)->runtime_flags)) {
3432 clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3433 &BTRFS_I(inode)->runtime_flags);
3432 ret = btrfs_truncate_inode_items(trans, log, 3434 ret = btrfs_truncate_inode_items(trans, log,
3433 inode, 0, 0); 3435 inode, 0, 0);
3434 } else { 3436 } else {
3435 if (inode_only == LOG_INODE_ALL) 3437 if (inode_only == LOG_INODE_ALL)
3436 fast_search = true; 3438 fast_search = true;
3437 max_key.type = BTRFS_XATTR_ITEM_KEY; 3439 if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3440 &BTRFS_I(inode)->runtime_flags))
3441 max_key.type = BTRFS_XATTR_ITEM_KEY;
3442 else
3443 max_key.type = BTRFS_INODE_ITEM_KEY;
3438 ret = drop_objectid_items(trans, log, path, ino, 3444 ret = drop_objectid_items(trans, log, path, ino,
3439 BTRFS_XATTR_ITEM_KEY); 3445 max_key.type);
3440 } 3446 }
3441 } 3447 }
3442 if (ret) { 3448 if (ret) {
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index aef6bb3c5f5c..446a6848c554 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -208,6 +208,7 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
208 208
209 inode_inc_iversion(inode); 209 inode_inc_iversion(inode);
210 inode->i_ctime = CURRENT_TIME; 210 inode->i_ctime = CURRENT_TIME;
211 set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
211 ret = btrfs_update_inode(trans, root, inode); 212 ret = btrfs_update_inode(trans, root, inode);
212 BUG_ON(ret); 213 BUG_ON(ret);
213out: 214out: