Commit c9a949af authored by Omar Sandoval's avatar Omar Sandoval Committed by David Sterba

btrfs: send: use btrfs_file_extent_end() in send_write_or_clone()

send_write_or_clone() basically has an open-coded copy of
btrfs_file_extent_end() except that it (incorrectly) aligns to PAGE_SIZE
instead of sectorsize. Fix and simplify the code by using
btrfs_file_extent_end().
Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 8c7d9fe0
...@@ -5400,51 +5400,29 @@ static int send_write_or_clone(struct send_ctx *sctx, ...@@ -5400,51 +5400,29 @@ static int send_write_or_clone(struct send_ctx *sctx,
struct clone_root *clone_root) struct clone_root *clone_root)
{ {
int ret = 0; int ret = 0;
struct btrfs_file_extent_item *ei;
u64 offset = key->offset; u64 offset = key->offset;
u64 len; u64 end;
u8 type;
u64 bs = sctx->send_root->fs_info->sb->s_blocksize; u64 bs = sctx->send_root->fs_info->sb->s_blocksize;
ei = btrfs_item_ptr(path->nodes[0], path->slots[0], end = min_t(u64, btrfs_file_extent_end(path), sctx->cur_inode_size);
struct btrfs_file_extent_item); if (offset >= end)
type = btrfs_file_extent_type(path->nodes[0], ei); return 0;
if (type == BTRFS_FILE_EXTENT_INLINE) {
len = btrfs_file_extent_ram_bytes(path->nodes[0], ei);
/*
* it is possible the inline item won't cover the whole page,
* but there may be items after this page. Make
* sure to send the whole thing
*/
len = PAGE_ALIGN(len);
} else {
len = btrfs_file_extent_num_bytes(path->nodes[0], ei);
}
if (offset >= sctx->cur_inode_size) {
ret = 0;
goto out;
}
if (offset + len > sctx->cur_inode_size)
len = sctx->cur_inode_size - offset;
if (len == 0) {
ret = 0;
goto out;
}
if (clone_root && IS_ALIGNED(offset + len, bs)) { if (clone_root && IS_ALIGNED(end, bs)) {
struct btrfs_file_extent_item *ei;
u64 disk_byte; u64 disk_byte;
u64 data_offset; u64 data_offset;
ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
struct btrfs_file_extent_item);
disk_byte = btrfs_file_extent_disk_bytenr(path->nodes[0], ei); disk_byte = btrfs_file_extent_disk_bytenr(path->nodes[0], ei);
data_offset = btrfs_file_extent_offset(path->nodes[0], ei); data_offset = btrfs_file_extent_offset(path->nodes[0], ei);
ret = clone_range(sctx, clone_root, disk_byte, data_offset, ret = clone_range(sctx, clone_root, disk_byte, data_offset,
offset, len); offset, end - offset);
} else { } else {
ret = send_extent_data(sctx, offset, len); ret = send_extent_data(sctx, offset, end - offset);
} }
sctx->cur_inode_next_write_offset = offset + len; sctx->cur_inode_next_write_offset = end;
out:
return ret; return ret;
} }
......
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