btrfs: stop using lock_extent in btrfs_buffer_uptodate
authorChristoph Hellwig <hch@lst.de>
Wed, 3 May 2023 15:24:39 +0000 (17:24 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:28 +0000 (13:59 +0200)
The only other place that locks extents on the btree inode is
read_extent_buffer_subpage while reading in the partial page for a
buffer.  This means locking the extent in btrfs_buffer_uptodate does not
synchronize with anything on non-subpage file systems, and on subpage
file systems it only waits for a parallel read(-ahead) to finish,
which seems to be counter to what the callers actually expect.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index 384c811..a3366fe 100644 (file)
@@ -112,11 +112,6 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
  */
 int btrfs_buffer_uptodate(struct extent_buffer *eb, u64 parent_transid, int atomic)
 {
-       struct inode *btree_inode = eb->pages[0]->mapping->host;
-       struct extent_io_tree *io_tree = &BTRFS_I(btree_inode)->io_tree;
-       struct extent_state *cached_state = NULL;
-       int ret = 1;
-
        if (!extent_buffer_uptodate(eb))
                return 0;
 
@@ -126,7 +121,6 @@ int btrfs_buffer_uptodate(struct extent_buffer *eb, u64 parent_transid, int atom
        if (atomic)
                return -EAGAIN;
 
-       lock_extent(io_tree, eb->start, eb->start + eb->len - 1, &cached_state);
        if (!extent_buffer_uptodate(eb) ||
            btrfs_header_generation(eb) != parent_transid) {
                btrfs_err_rl(eb->fs_info,
@@ -134,11 +128,9 @@ int btrfs_buffer_uptodate(struct extent_buffer *eb, u64 parent_transid, int atom
                        eb->start, eb->read_mirror,
                        parent_transid, btrfs_header_generation(eb));
                clear_extent_buffer_uptodate(eb);
-               ret = 0;
+               return 0;
        }
-       unlock_extent(io_tree, eb->start, eb->start + eb->len - 1,
-                     &cached_state);
-       return ret;
+       return 1;
 }
 
 static bool btrfs_supported_super_csum(u16 csum_type)