Commit cd241a8f authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: move can_cow_file_range_inline() outside of the extent lock

These checks aren't reliant on the extent lock.  Move this up into
cow_file_range_inline(), and then update encoded writes to call this
check before calling __cow_file_range_inline().  This will allow us to
skip the extent lock if we're not able to inline the given extent.
Reviewed-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0ab54099
...@@ -661,6 +661,9 @@ static bool can_cow_file_range_inline(struct btrfs_inode *inode, ...@@ -661,6 +661,9 @@ static bool can_cow_file_range_inline(struct btrfs_inode *inode,
* conditionally insert an inline extent into the file. This * conditionally insert an inline extent into the file. This
* does the checks required to make sure the data is small enough * does the checks required to make sure the data is small enough
* to fit as an inline extent. * to fit as an inline extent.
*
* If being used directly, you must have already checked we're allowed to cow
* the range by getting true from can_cow_file_range_inline().
*/ */
static noinline int __cow_file_range_inline(struct btrfs_inode *inode, u64 offset, static noinline int __cow_file_range_inline(struct btrfs_inode *inode, u64 offset,
u64 size, size_t compressed_size, u64 size, size_t compressed_size,
...@@ -676,9 +679,6 @@ static noinline int __cow_file_range_inline(struct btrfs_inode *inode, u64 offse ...@@ -676,9 +679,6 @@ static noinline int __cow_file_range_inline(struct btrfs_inode *inode, u64 offse
int ret; int ret;
struct btrfs_path *path; struct btrfs_path *path;
if (!can_cow_file_range_inline(inode, offset, size, compressed_size))
return 1;
path = btrfs_alloc_path(); path = btrfs_alloc_path();
if (!path) if (!path)
return -ENOMEM; return -ENOMEM;
...@@ -750,6 +750,9 @@ static noinline int cow_file_range_inline(struct btrfs_inode *inode, u64 offset, ...@@ -750,6 +750,9 @@ static noinline int cow_file_range_inline(struct btrfs_inode *inode, u64 offset,
u64 size = min_t(u64, i_size_read(&inode->vfs_inode), end + 1); u64 size = min_t(u64, i_size_read(&inode->vfs_inode), end + 1);
int ret; int ret;
if (!can_cow_file_range_inline(inode, offset, size, compressed_size))
return 1;
lock_extent(&inode->io_tree, offset, end, &cached); lock_extent(&inode->io_tree, offset, end, &cached);
ret = __cow_file_range_inline(inode, offset, size, compressed_size, ret = __cow_file_range_inline(inode, offset, size, compressed_size,
compress_type, compressed_folio, compress_type, compressed_folio,
...@@ -10287,7 +10290,8 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from, ...@@ -10287,7 +10290,8 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from,
/* Try an inline extent first. */ /* Try an inline extent first. */
if (encoded->unencoded_len == encoded->len && if (encoded->unencoded_len == encoded->len &&
encoded->unencoded_offset == 0) { encoded->unencoded_offset == 0 &&
can_cow_file_range_inline(inode, start, encoded->len, orig_count)) {
ret = __cow_file_range_inline(inode, start, encoded->len, ret = __cow_file_range_inline(inode, start, encoded->len,
orig_count, compression, folios[0], orig_count, compression, folios[0],
true); true);
......
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