Skip to content

Commit

Permalink
btrfs: send: use btrfs_file_extent_end() in send_write_or_clone()
Browse files Browse the repository at this point in the history
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: Filipe Manana <[email protected]>
Signed-off-by: Omar Sandoval <[email protected]>
Reviewed-by: David Sterba <[email protected]>
Signed-off-by: David Sterba <[email protected]>
  • Loading branch information
osandov authored and kdave committed Oct 7, 2020
1 parent 8c7d9fe commit c9a949a
Showing 1 changed file with 11 additions and 33 deletions.
44 changes: 11 additions & 33 deletions fs/btrfs/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -5400,51 +5400,29 @@ static int send_write_or_clone(struct send_ctx *sctx,
struct clone_root *clone_root)
{
int ret = 0;
struct btrfs_file_extent_item *ei;
u64 offset = key->offset;
u64 len;
u8 type;
u64 end;
u64 bs = sctx->send_root->fs_info->sb->s_blocksize;

ei = btrfs_item_ptr(path->nodes[0], path->slots[0],
struct btrfs_file_extent_item);
type = btrfs_file_extent_type(path->nodes[0], ei);
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;
}
end = min_t(u64, btrfs_file_extent_end(path), sctx->cur_inode_size);
if (offset >= end)
return 0;

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 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);
data_offset = btrfs_file_extent_offset(path->nodes[0], ei);
ret = clone_range(sctx, clone_root, disk_byte, data_offset,
offset, len);
offset, end - offset);
} else {
ret = send_extent_data(sctx, offset, len);
ret = send_extent_data(sctx, offset, end - offset);
}
sctx->cur_inode_next_write_offset = offset + len;
out:
sctx->cur_inode_next_write_offset = end;
return ret;
}

Expand Down

0 comments on commit c9a949a

Please sign in to comment.