aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/tree-log.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index f05fca778cb4..ab7168ee618f 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -2996,6 +2996,26 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,
2996 2996
2997} 2997}
2998 2998
2999static int log_inode_item(struct btrfs_trans_handle *trans,
3000 struct btrfs_root *log, struct btrfs_path *path,
3001 struct inode *inode)
3002{
3003 struct btrfs_inode_item *inode_item;
3004 struct btrfs_key key;
3005 int ret;
3006
3007 memcpy(&key, &BTRFS_I(inode)->location, sizeof(key));
3008 ret = btrfs_insert_empty_item(trans, log, path, &key,
3009 sizeof(*inode_item));
3010 if (ret && ret != -EEXIST)
3011 return ret;
3012 inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
3013 struct btrfs_inode_item);
3014 fill_inode_item(trans, path->nodes[0], inode_item, inode, 0);
3015 btrfs_release_path(path);
3016 return 0;
3017}
3018
2999static noinline int copy_items(struct btrfs_trans_handle *trans, 3019static noinline int copy_items(struct btrfs_trans_handle *trans,
3000 struct inode *inode, 3020 struct inode *inode,
3001 struct btrfs_path *dst_path, 3021 struct btrfs_path *dst_path,
@@ -3433,17 +3453,24 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3433 &BTRFS_I(inode)->runtime_flags); 3453 &BTRFS_I(inode)->runtime_flags);
3434 ret = btrfs_truncate_inode_items(trans, log, 3454 ret = btrfs_truncate_inode_items(trans, log,
3435 inode, 0, 0); 3455 inode, 0, 0);
3436 } else { 3456 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
3457 &BTRFS_I(inode)->runtime_flags)) {
3437 if (inode_only == LOG_INODE_ALL) 3458 if (inode_only == LOG_INODE_ALL)
3438 fast_search = true; 3459 fast_search = true;
3439 if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, 3460 max_key.type = BTRFS_XATTR_ITEM_KEY;
3440 &BTRFS_I(inode)->runtime_flags))
3441 max_key.type = BTRFS_XATTR_ITEM_KEY;
3442 else
3443 max_key.type = BTRFS_INODE_ITEM_KEY;
3444 ret = drop_objectid_items(trans, log, path, ino, 3461 ret = drop_objectid_items(trans, log, path, ino,
3445 max_key.type); 3462 max_key.type);
3463 } else {
3464 if (inode_only == LOG_INODE_ALL)
3465 fast_search = true;
3466 ret = log_inode_item(trans, log, dst_path, inode);
3467 if (ret) {
3468 err = ret;
3469 goto out_unlock;
3470 }
3471 goto log_extents;
3446 } 3472 }
3473
3447 } 3474 }
3448 if (ret) { 3475 if (ret) {
3449 err = ret; 3476 err = ret;
@@ -3522,6 +3549,7 @@ next_slot:
3522 ins_nr = 0; 3549 ins_nr = 0;
3523 } 3550 }
3524 3551
3552log_extents:
3525 if (fast_search) { 3553 if (fast_search) {
3526 btrfs_release_path(path); 3554 btrfs_release_path(path);
3527 btrfs_release_path(dst_path); 3555 btrfs_release_path(dst_path);