Commit a95249b3 authored by Josef Bacik's avatar Josef Bacik Committed by Chris Mason

Btrfs: don't bother copying if we're only logging the inode

We don't copy inode items anwyay, we just copy them straight into the log
from the in memory inode.  So if we know we're only logging the inode, don't
bother dropping anything, just try to insert it and either if it succeeds or
we get EEXIST we can update the inode item in the log and carry on.  Thanks,
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent e9976151
...@@ -2996,6 +2996,26 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, ...@@ -2996,6 +2996,26 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,
} }
static int log_inode_item(struct btrfs_trans_handle *trans,
struct btrfs_root *log, struct btrfs_path *path,
struct inode *inode)
{
struct btrfs_inode_item *inode_item;
struct btrfs_key key;
int ret;
memcpy(&key, &BTRFS_I(inode)->location, sizeof(key));
ret = btrfs_insert_empty_item(trans, log, path, &key,
sizeof(*inode_item));
if (ret && ret != -EEXIST)
return ret;
inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0],
struct btrfs_inode_item);
fill_inode_item(trans, path->nodes[0], inode_item, inode, 0);
btrfs_release_path(path);
return 0;
}
static noinline int copy_items(struct btrfs_trans_handle *trans, static noinline int copy_items(struct btrfs_trans_handle *trans,
struct inode *inode, struct inode *inode,
struct btrfs_path *dst_path, struct btrfs_path *dst_path,
...@@ -3433,17 +3453,24 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, ...@@ -3433,17 +3453,24 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
&BTRFS_I(inode)->runtime_flags); &BTRFS_I(inode)->runtime_flags);
ret = btrfs_truncate_inode_items(trans, log, ret = btrfs_truncate_inode_items(trans, log,
inode, 0, 0); inode, 0, 0);
} else { } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING,
&BTRFS_I(inode)->runtime_flags)) {
if (inode_only == LOG_INODE_ALL) if (inode_only == LOG_INODE_ALL)
fast_search = true; fast_search = true;
if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, max_key.type = BTRFS_XATTR_ITEM_KEY;
&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, ret = drop_objectid_items(trans, log, path, ino,
max_key.type); max_key.type);
} else {
if (inode_only == LOG_INODE_ALL)
fast_search = true;
ret = log_inode_item(trans, log, dst_path, inode);
if (ret) {
err = ret;
goto out_unlock;
}
goto log_extents;
} }
} }
if (ret) { if (ret) {
err = ret; err = ret;
...@@ -3522,6 +3549,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, ...@@ -3522,6 +3549,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
ins_nr = 0; ins_nr = 0;
} }
log_extents:
if (fast_search) { if (fast_search) {
btrfs_release_path(path); btrfs_release_path(path);
btrfs_release_path(dst_path); btrfs_release_path(dst_path);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment