Commit cdc627e6 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: cleanup duplicated parameters related to can_nocow_file_extent_args

The following functions and structures can be simplified using the
btrfs_file_extent structure:

- can_nocow_extent()
  No need to return ram_bytes/orig_block_len through the parameter list,
  the @file_extent parameter contains all the needed info.

- can_nocow_file_extent_args
  The following members are no longer needed:

  * disk_bytenr
    This one is confusing as it's not really the
    btrfs_file_extent_item::disk_bytenr, but where the IO would be,
    thus it's file_extent::disk_bytenr + file_extent::offset now.

  * num_bytes
    Now file_extent::num_bytes.

  * extent_offset
    Now file_extent::offset.

  * disk_num_bytes
    Now file_extent::disk_num_bytes.
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c77a8c61
...@@ -528,8 +528,7 @@ struct btrfs_file_extent { ...@@ -528,8 +528,7 @@ struct btrfs_file_extent {
}; };
noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
u64 *orig_block_len, struct btrfs_file_extent *file_extent,
u64 *ram_bytes, struct btrfs_file_extent *file_extent,
bool nowait, bool strict); bool nowait, bool strict);
void btrfs_del_delalloc_inode(struct btrfs_inode *inode); void btrfs_del_delalloc_inode(struct btrfs_inode *inode);
......
...@@ -1104,7 +1104,7 @@ int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos, ...@@ -1104,7 +1104,7 @@ int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
&cached_state); &cached_state);
} }
ret = can_nocow_extent(&inode->vfs_inode, lockstart, &num_bytes, ret = can_nocow_extent(&inode->vfs_inode, lockstart, &num_bytes,
NULL, NULL, NULL, nowait, false); NULL, nowait, false);
if (ret <= 0) if (ret <= 0)
btrfs_drew_write_unlock(&root->snapshot_lock); btrfs_drew_write_unlock(&root->snapshot_lock);
else else
......
...@@ -1861,15 +1861,10 @@ struct can_nocow_file_extent_args { ...@@ -1861,15 +1861,10 @@ struct can_nocow_file_extent_args {
*/ */
bool free_path; bool free_path;
/* Output fields. Only set when can_nocow_file_extent() returns 1. */ /*
* Output fields. Only set when can_nocow_file_extent() returns 1.
u64 disk_bytenr; * The expected file extent for the NOCOW write.
u64 disk_num_bytes; */
u64 extent_offset;
/* Number of bytes that can be written to in NOCOW mode. */
u64 num_bytes;
/* The expected file extent for the NOCOW write. */
struct btrfs_file_extent file_extent; struct btrfs_file_extent file_extent;
}; };
...@@ -1892,6 +1887,7 @@ static int can_nocow_file_extent(struct btrfs_path *path, ...@@ -1892,6 +1887,7 @@ static int can_nocow_file_extent(struct btrfs_path *path,
struct btrfs_root *root = inode->root; struct btrfs_root *root = inode->root;
struct btrfs_file_extent_item *fi; struct btrfs_file_extent_item *fi;
struct btrfs_root *csum_root; struct btrfs_root *csum_root;
u64 io_start;
u64 extent_end; u64 extent_end;
u8 extent_type; u8 extent_type;
int can_nocow = 0; int can_nocow = 0;
...@@ -1904,11 +1900,6 @@ static int can_nocow_file_extent(struct btrfs_path *path, ...@@ -1904,11 +1900,6 @@ static int can_nocow_file_extent(struct btrfs_path *path,
if (extent_type == BTRFS_FILE_EXTENT_INLINE) if (extent_type == BTRFS_FILE_EXTENT_INLINE)
goto out; goto out;
/* Can't access these fields unless we know it's not an inline extent. */
args->disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
args->disk_num_bytes = btrfs_file_extent_disk_num_bytes(leaf, fi);
args->extent_offset = btrfs_file_extent_offset(leaf, fi);
if (!(inode->flags & BTRFS_INODE_NODATACOW) && if (!(inode->flags & BTRFS_INODE_NODATACOW) &&
extent_type == BTRFS_FILE_EXTENT_REG) extent_type == BTRFS_FILE_EXTENT_REG)
goto out; goto out;
...@@ -1924,7 +1915,7 @@ static int can_nocow_file_extent(struct btrfs_path *path, ...@@ -1924,7 +1915,7 @@ static int can_nocow_file_extent(struct btrfs_path *path,
goto out; goto out;
/* An explicit hole, must COW. */ /* An explicit hole, must COW. */
if (args->disk_bytenr == 0) if (btrfs_file_extent_disk_bytenr(leaf, fi) == 0)
goto out; goto out;
/* Compressed/encrypted/encoded extents must be COWed. */ /* Compressed/encrypted/encoded extents must be COWed. */
...@@ -1949,8 +1940,8 @@ static int can_nocow_file_extent(struct btrfs_path *path, ...@@ -1949,8 +1940,8 @@ static int can_nocow_file_extent(struct btrfs_path *path,
btrfs_release_path(path); btrfs_release_path(path);
ret = btrfs_cross_ref_exist(root, btrfs_ino(inode), ret = btrfs_cross_ref_exist(root, btrfs_ino(inode),
key->offset - args->extent_offset, key->offset - args->file_extent.offset,
args->disk_bytenr, args->strict, path); args->file_extent.disk_bytenr, args->strict, path);
WARN_ON_ONCE(ret > 0 && is_freespace_inode); WARN_ON_ONCE(ret > 0 && is_freespace_inode);
if (ret != 0) if (ret != 0)
goto out; goto out;
...@@ -1971,21 +1962,18 @@ static int can_nocow_file_extent(struct btrfs_path *path, ...@@ -1971,21 +1962,18 @@ static int can_nocow_file_extent(struct btrfs_path *path,
atomic_read(&root->snapshot_force_cow)) atomic_read(&root->snapshot_force_cow))
goto out; goto out;
args->disk_bytenr += args->extent_offset; args->file_extent.num_bytes = min(args->end + 1, extent_end) - args->start;
args->disk_bytenr += args->start - key->offset;
args->num_bytes = min(args->end + 1, extent_end) - args->start;
args->file_extent.num_bytes = args->num_bytes;
args->file_extent.offset += args->start - key->offset; args->file_extent.offset += args->start - key->offset;
io_start = args->file_extent.disk_bytenr + args->file_extent.offset;
/* /*
* Force COW if csums exist in the range. This ensures that csums for a * Force COW if csums exist in the range. This ensures that csums for a
* given extent are either valid or do not exist. * given extent are either valid or do not exist.
*/ */
csum_root = btrfs_csum_root(root->fs_info, args->disk_bytenr); csum_root = btrfs_csum_root(root->fs_info, io_start);
ret = btrfs_lookup_csums_list(csum_root, args->disk_bytenr, ret = btrfs_lookup_csums_list(csum_root, io_start,
args->disk_bytenr + args->num_bytes - 1, io_start + args->file_extent.num_bytes - 1,
NULL, nowait); NULL, nowait);
WARN_ON_ONCE(ret > 0 && is_freespace_inode); WARN_ON_ONCE(ret > 0 && is_freespace_inode);
if (ret != 0) if (ret != 0)
...@@ -2044,7 +2032,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2044,7 +2032,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
struct extent_buffer *leaf; struct extent_buffer *leaf;
struct extent_state *cached_state = NULL; struct extent_state *cached_state = NULL;
u64 extent_end; u64 extent_end;
u64 ram_bytes;
u64 nocow_end; u64 nocow_end;
int extent_type; int extent_type;
bool is_prealloc; bool is_prealloc;
...@@ -2123,7 +2110,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2123,7 +2110,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
ret = -EUCLEAN; ret = -EUCLEAN;
goto error; goto error;
} }
ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
extent_end = btrfs_file_extent_end(path); extent_end = btrfs_file_extent_end(path);
/* /*
...@@ -2143,7 +2129,9 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2143,7 +2129,9 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
goto must_cow; goto must_cow;
ret = 0; ret = 0;
nocow_bg = btrfs_inc_nocow_writers(fs_info, nocow_args.disk_bytenr); nocow_bg = btrfs_inc_nocow_writers(fs_info,
nocow_args.file_extent.disk_bytenr +
nocow_args.file_extent.offset);
if (!nocow_bg) { if (!nocow_bg) {
must_cow: must_cow:
/* /*
...@@ -2179,16 +2167,18 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2179,16 +2167,18 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
} }
} }
nocow_end = cur_offset + nocow_args.num_bytes - 1; nocow_end = cur_offset + nocow_args.file_extent.num_bytes - 1;
lock_extent(&inode->io_tree, cur_offset, nocow_end, &cached_state); lock_extent(&inode->io_tree, cur_offset, nocow_end, &cached_state);
is_prealloc = extent_type == BTRFS_FILE_EXTENT_PREALLOC; is_prealloc = extent_type == BTRFS_FILE_EXTENT_PREALLOC;
if (is_prealloc) { if (is_prealloc) {
struct extent_map *em; struct extent_map *em;
em = create_io_em(inode, cur_offset, nocow_args.num_bytes, em = create_io_em(inode, cur_offset,
nocow_args.disk_num_bytes, /* orig_block_len */ nocow_args.file_extent.num_bytes,
ram_bytes, BTRFS_COMPRESS_NONE, nocow_args.file_extent.disk_num_bytes,
nocow_args.file_extent.ram_bytes,
BTRFS_COMPRESS_NONE,
&nocow_args.file_extent, &nocow_args.file_extent,
BTRFS_ORDERED_PREALLOC); BTRFS_ORDERED_PREALLOC);
if (IS_ERR(em)) { if (IS_ERR(em)) {
...@@ -2202,8 +2192,11 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2202,8 +2192,11 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
} }
ordered = btrfs_alloc_ordered_extent(inode, cur_offset, ordered = btrfs_alloc_ordered_extent(inode, cur_offset,
nocow_args.num_bytes, nocow_args.num_bytes, nocow_args.file_extent.num_bytes,
nocow_args.disk_bytenr, nocow_args.num_bytes, 0, nocow_args.file_extent.num_bytes,
nocow_args.file_extent.disk_bytenr +
nocow_args.file_extent.offset,
nocow_args.file_extent.num_bytes, 0,
is_prealloc is_prealloc
? (1 << BTRFS_ORDERED_PREALLOC) ? (1 << BTRFS_ORDERED_PREALLOC)
: (1 << BTRFS_ORDERED_NOCOW), : (1 << BTRFS_ORDERED_NOCOW),
...@@ -7176,8 +7169,7 @@ static bool btrfs_extent_readonly(struct btrfs_fs_info *fs_info, u64 bytenr) ...@@ -7176,8 +7169,7 @@ static bool btrfs_extent_readonly(struct btrfs_fs_info *fs_info, u64 bytenr)
* any ordered extents. * any ordered extents.
*/ */
noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
u64 *orig_block_len, struct btrfs_file_extent *file_extent,
u64 *ram_bytes, struct btrfs_file_extent *file_extent,
bool nowait, bool strict) bool nowait, bool strict)
{ {
struct btrfs_fs_info *fs_info = inode_to_fs_info(inode); struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
...@@ -7228,8 +7220,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, ...@@ -7228,8 +7220,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
fi = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item); fi = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item);
found_type = btrfs_file_extent_type(leaf, fi); found_type = btrfs_file_extent_type(leaf, fi);
if (ram_bytes)
*ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
nocow_args.start = offset; nocow_args.start = offset;
nocow_args.end = offset + *len - 1; nocow_args.end = offset + *len - 1;
...@@ -7247,14 +7237,16 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, ...@@ -7247,14 +7237,16 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
} }
ret = 0; ret = 0;
if (btrfs_extent_readonly(fs_info, nocow_args.disk_bytenr)) if (btrfs_extent_readonly(fs_info,
nocow_args.file_extent.disk_bytenr +
nocow_args.file_extent.offset))
goto out; goto out;
if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) && if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
found_type == BTRFS_FILE_EXTENT_PREALLOC) { found_type == BTRFS_FILE_EXTENT_PREALLOC) {
u64 range_end; u64 range_end;
range_end = round_up(offset + nocow_args.num_bytes, range_end = round_up(offset + nocow_args.file_extent.num_bytes,
root->fs_info->sectorsize) - 1; root->fs_info->sectorsize) - 1;
ret = test_range_bit_exists(io_tree, offset, range_end, EXTENT_DELALLOC); ret = test_range_bit_exists(io_tree, offset, range_end, EXTENT_DELALLOC);
if (ret) { if (ret) {
...@@ -7263,12 +7255,10 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, ...@@ -7263,12 +7255,10 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
} }
} }
if (orig_block_len)
*orig_block_len = nocow_args.disk_num_bytes;
if (file_extent) if (file_extent)
memcpy(file_extent, &nocow_args.file_extent, sizeof(*file_extent)); memcpy(file_extent, &nocow_args.file_extent, sizeof(*file_extent));
*len = nocow_args.num_bytes; *len = nocow_args.file_extent.num_bytes;
ret = 1; ret = 1;
out: out:
btrfs_free_path(path); btrfs_free_path(path);
...@@ -7453,7 +7443,7 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map, ...@@ -7453,7 +7443,7 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
struct btrfs_file_extent file_extent; struct btrfs_file_extent file_extent;
struct extent_map *em = *map; struct extent_map *em = *map;
int type; int type;
u64 block_start, orig_block_len, ram_bytes; u64 block_start;
struct btrfs_block_group *bg; struct btrfs_block_group *bg;
bool can_nocow = false; bool can_nocow = false;
bool space_reserved = false; bool space_reserved = false;
...@@ -7481,7 +7471,6 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map, ...@@ -7481,7 +7471,6 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
block_start = extent_map_block_start(em) + (start - em->start); block_start = extent_map_block_start(em) + (start - em->start);
if (can_nocow_extent(inode, start, &len, if (can_nocow_extent(inode, start, &len,
&orig_block_len, &ram_bytes,
&file_extent, false, false) == 1) { &file_extent, false, false) == 1) {
bg = btrfs_inc_nocow_writers(fs_info, block_start); bg = btrfs_inc_nocow_writers(fs_info, block_start);
if (bg) if (bg)
...@@ -7508,8 +7497,8 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map, ...@@ -7508,8 +7497,8 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
space_reserved = true; space_reserved = true;
em2 = btrfs_create_dio_extent(BTRFS_I(inode), dio_data, start, len, em2 = btrfs_create_dio_extent(BTRFS_I(inode), dio_data, start, len,
orig_block_len, file_extent.disk_num_bytes,
ram_bytes, type, file_extent.ram_bytes, type,
&file_extent); &file_extent);
btrfs_dec_nocow_writers(bg); btrfs_dec_nocow_writers(bg);
if (type == BTRFS_ORDERED_PREALLOC) { if (type == BTRFS_ORDERED_PREALLOC) {
...@@ -10680,7 +10669,7 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file, ...@@ -10680,7 +10669,7 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
free_extent_map(em); free_extent_map(em);
em = NULL; em = NULL;
ret = can_nocow_extent(inode, start, &len, NULL, NULL, NULL, false, true); ret = can_nocow_extent(inode, start, &len, NULL, false, true);
if (ret < 0) { if (ret < 0) {
goto out; goto out;
} else if (ret) { } else if (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