btrfs-progs: convert: expose intersect_with_reserved() to main.c

We currently open code a similar operation in create_image_file_range().
By exposing intersect_with_reserved() outside of source-fs.c and
slightly changing its semantics to return the entire range instead of
just the end address, we can reuse it in create_image_file_range().

Author: Thomas Hebb <tommyhebb@gmail.com>
Pull-request: #494
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Thomas Hebb 2022-06-26 17:23:00 -07:00 committed by David Sterba
parent cfae74f6bb
commit 9509b85449
2 changed files with 10 additions and 8 deletions

View File

@ -57,7 +57,7 @@ int ext2_acl_count(size_t size)
} }
} }
static u64 intersect_with_reserved(u64 bytenr, u64 num_bytes) const struct simple_range *intersect_with_reserved(u64 bytenr, u64 num_bytes)
{ {
int i; int i;
@ -66,9 +66,9 @@ static u64 intersect_with_reserved(u64 bytenr, u64 num_bytes)
if (bytenr < range_end(range) && if (bytenr < range_end(range) &&
bytenr + num_bytes > range->start) bytenr + num_bytes > range->start)
return range_end(range); return range;
} }
return 0; return NULL;
} }
void init_convert_context(struct btrfs_convert_context *cctx) void init_convert_context(struct btrfs_convert_context *cctx)
@ -93,15 +93,15 @@ int block_iterate_proc(u64 disk_block, u64 file_block,
struct blk_iterate_data *idata) struct blk_iterate_data *idata)
{ {
int ret = 0; int ret = 0;
u64 reserved_boundary; const struct simple_range *reserved;
int do_barrier; int do_barrier;
struct btrfs_root *root = idata->root; struct btrfs_root *root = idata->root;
struct btrfs_block_group *cache; struct btrfs_block_group *cache;
u32 sectorsize = root->fs_info->sectorsize; u32 sectorsize = root->fs_info->sectorsize;
u64 bytenr = disk_block * sectorsize; u64 bytenr = disk_block * sectorsize;
reserved_boundary = intersect_with_reserved(bytenr, sectorsize); reserved = intersect_with_reserved(bytenr, sectorsize);
do_barrier = reserved_boundary || disk_block >= idata->boundary; do_barrier = reserved || disk_block >= idata->boundary;
if ((idata->num_blocks > 0 && do_barrier) || if ((idata->num_blocks > 0 && do_barrier) ||
(file_block > idata->first_block + idata->num_blocks) || (file_block > idata->first_block + idata->num_blocks) ||
(disk_block != idata->disk_block + idata->num_blocks)) { (disk_block != idata->disk_block + idata->num_blocks)) {
@ -121,8 +121,8 @@ int block_iterate_proc(u64 disk_block, u64 file_block,
goto fail; goto fail;
} }
if (reserved_boundary) { if (reserved) {
bytenr = reserved_boundary; bytenr = range_end(reserved);
} else { } else {
cache = btrfs_lookup_block_group(root->fs_info, bytenr); cache = btrfs_lookup_block_group(root->fs_info, bytenr);
BUG_ON(!cache); BUG_ON(!cache);

View File

@ -31,6 +31,8 @@ struct task_info;
extern const struct simple_range btrfs_reserved_ranges[3]; extern const struct simple_range btrfs_reserved_ranges[3];
const struct simple_range *intersect_with_reserved(u64 bytenr, u64 num_bytes);
struct task_ctx { struct task_ctx {
pthread_mutex_t mutex; pthread_mutex_t mutex;
u64 max_copy_inodes; u64 max_copy_inodes;