diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 1 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 1 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 10 | ||||
-rw-r--r-- | fs/btrfs/xattr.c | 1 |
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 */ |
44 | struct btrfs_inode { | 45 | struct 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); |
213 | out: | 214 | out: |