btrfs: use cached_state for btrfs_check_nocow_lock
authorJosef Bacik <josef@toxicpanda.com>
Fri, 30 Sep 2022 20:45:10 +0000 (16:45 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 5 Dec 2022 17:00:36 +0000 (18:00 +0100)
Now that try_lock_extent() takes a cached_state, plumb the cached_state
through btrfs_try_lock_ordered_range() and then use a cached_state in
btrfs_check_nocow_lock everywhere to avoid extra tree searches on the
extent_io_tree.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/file.c
fs/btrfs/ordered-data.c
fs/btrfs/ordered-data.h

index 98107466572b34ac2374e4041ed505bfe3a819de..493cae66e5e6711ec11ab180875a1c7c61f41a52 100644 (file)
@@ -1373,6 +1373,7 @@ int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
 {
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        struct btrfs_root *root = inode->root;
+       struct extent_state *cached_state = NULL;
        u64 lockstart, lockend;
        u64 num_bytes;
        int ret;
@@ -1389,12 +1390,14 @@ int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
        num_bytes = lockend - lockstart + 1;
 
        if (nowait) {
-               if (!btrfs_try_lock_ordered_range(inode, lockstart, lockend)) {
+               if (!btrfs_try_lock_ordered_range(inode, lockstart, lockend,
+                                                 &cached_state)) {
                        btrfs_drew_write_unlock(&root->snapshot_lock);
                        return -EAGAIN;
                }
        } else {
-               btrfs_lock_and_flush_ordered_range(inode, lockstart, lockend, NULL);
+               btrfs_lock_and_flush_ordered_range(inode, lockstart, lockend,
+                                                  &cached_state);
        }
        ret = can_nocow_extent(&inode->vfs_inode, lockstart, &num_bytes,
                        NULL, NULL, NULL, nowait, false);
@@ -1403,7 +1406,7 @@ int btrfs_check_nocow_lock(struct btrfs_inode *inode, loff_t pos,
        else
                *write_bytes = min_t(size_t, *write_bytes ,
                                     num_bytes - pos + lockstart);
-       unlock_extent(&inode->io_tree, lockstart, lockend, NULL);
+       unlock_extent(&inode->io_tree, lockstart, lockend, &cached_state);
 
        return ret;
 }
index b648c9d4ea0fcae2a2ec42a0e7798c01e5a5ffc7..de2b716d3e7bd4876f01019a09015322996fd600 100644 (file)
@@ -1069,11 +1069,12 @@ void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,
  * Return true if btrfs_lock_ordered_range does not return any extents,
  * otherwise false.
  */
-bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end)
+bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end,
+                                 struct extent_state **cached_state)
 {
        struct btrfs_ordered_extent *ordered;
 
-       if (!try_lock_extent(&inode->io_tree, start, end, NULL))
+       if (!try_lock_extent(&inode->io_tree, start, end, cached_state))
                return false;
 
        ordered = btrfs_lookup_ordered_range(inode, start, end - start + 1);
@@ -1081,7 +1082,7 @@ bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end)
                return true;
 
        btrfs_put_ordered_extent(ordered);
-       unlock_extent(&inode->io_tree, start, end, NULL);
+       unlock_extent(&inode->io_tree, start, end, cached_state);
 
        return false;
 }
index f59f2dbdb25edeed2c0efd9318c8645d6ba8be8b..89f82b78f590f3322c645746133474abf52b06b0 100644 (file)
@@ -206,7 +206,8 @@ void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr,
 void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,
                                        u64 end,
                                        struct extent_state **cached_state);
-bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end);
+bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end,
+                                 struct extent_state **cached_state);
 int btrfs_split_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pre,
                               u64 post);
 int __init ordered_data_init(void);