提交 3d41d702 编写于 作者: F Filipe David Borba Manana 提交者: Chris Mason

Btrfs: remove unnecessary tree search when logging inode

In tree-log.c:btrfs_log_inode(), we keep calling btrfs_search_forward()
until it returns a key whose objectid is higher than our inode or until
the key's type is higher than our maximum allowed type.

At the end of the loop, we increment our mininum search key's objectid
and type regardless of our desired target objectid and maximum desired
type, which causes another loop iteration that will call again
btrfs_search_forward() just to figure out we've gone beyond our maximum
key and exit the loop. Therefore while incrementing our minimum key,
don't do it blindly and exit the loop immiediately if the next search
key's objectid or type is beyond what we seek.

Also after incrementing the type, set the key's offset to 0, which was
missing and could make us loose some of the inode's items.
Signed-off-by: NFilipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: NJosef Bacik <jbacik@fusionio.com>
Signed-off-by: NChris Mason <chris.mason@fusionio.com>
上级 6174d3cb
......@@ -3764,14 +3764,14 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
}
btrfs_release_path(path);
if (min_key.offset < (u64)-1)
if (min_key.offset < (u64)-1) {
min_key.offset++;
else if (min_key.type < (u8)-1)
} else if (min_key.type < max_key.type) {
min_key.type++;
else if (min_key.objectid < (u64)-1)
min_key.objectid++;
else
min_key.offset = 0;
} else {
break;
}
}
if (ins_nr) {
ret = copy_items(trans, inode, dst_path, src, ins_start_slot,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册