]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
btrfs: only clear EXTENT_LOCK bit in extent_invalidatepage
authorQu Wenruo <wqu@suse.com>
Fri, 13 Nov 2020 12:51:39 +0000 (20:51 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:54:14 +0000 (15:54 +0100)
extent_invalidatepage() will try to clear all possible bits since it's
calling clear_extent_bit() with delete == 1.

This is currently fine, since for btree io tree, it only utilizes
EXTENT_LOCK bit.  But this could be a problem for later subpage support,
which will utilize extra io tree bit to represent additional info.

This patch will just convert that clear_extent_bit() to
unlock_extent_cached().

For current code since only EXTENT_LOCKED bit is utilized, this doesn't
change the behavior, but provides a much cleaner basis for incoming
subpage support.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 67faa7797d891a17520833dd5e5a28f4c01a9be8..cdccfdbbe3aafd158480d58d0e0ad4353ba7f501 100644 (file)
@@ -4431,14 +4431,22 @@ int extent_invalidatepage(struct extent_io_tree *tree,
        u64 end = start + PAGE_SIZE - 1;
        size_t blocksize = page->mapping->host->i_sb->s_blocksize;
 
+       /* This function is only called for the btree inode */
+       ASSERT(tree->owner == IO_TREE_BTREE_INODE_IO);
+
        start += ALIGN(offset, blocksize);
        if (start > end)
                return 0;
 
        lock_extent_bits(tree, start, end, &cached_state);
        wait_on_page_writeback(page);
-       clear_extent_bit(tree, start, end, EXTENT_LOCKED | EXTENT_DELALLOC |
-                        EXTENT_DO_ACCOUNTING, 1, 1, &cached_state);
+
+       /*
+        * Currently for btree io tree, only EXTENT_LOCKED is utilized,
+        * so here we only need to unlock the extent range to free any
+        * existing extent state.
+        */
+       unlock_extent_cached(tree, start, end, &cached_state);
        return 0;
 }