btrfs: remove unnecessary early exits in delalloc folio lock and unlock
authorQu Wenruo <wqu@suse.com>
Thu, 3 Apr 2025 23:50:21 +0000 (10:20 +1030)
committerDavid Sterba <dsterba@suse.com>
Thu, 15 May 2025 12:30:43 +0000 (14:30 +0200)
Inside functions unlock_delalloc_folio() and lock_delalloc_folios(), we
have the following early exits:

if (index == locked_folio->index && end_index == index)
return;

This allows us to exit early if the range is inside the same locked
folio.

However the current check relies on page sized folios, if we have a large
folio that contains @index but not at @index, then the early exit will
no longer trigger.

Furthermore without the above early check, the existing code can handle it
well, as both __process_folios_contig() and lock_delalloc_folios() will
skip any folio page lock/unlock if it's on the locked folio.

Here we remove the early exits and let the existing code handle the
same index case, to make the code a little simpler.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 791a9972b2e63c4d325a4c1f2dcf585dc56c43b1..12a668dd5e5ec700f95d2a937b4f0efa78bcf6dc 100644 (file)
@@ -224,12 +224,7 @@ static noinline void unlock_delalloc_folio(const struct inode *inode,
                                           const struct folio *locked_folio,
                                           u64 start, u64 end)
 {
-       unsigned long index = start >> PAGE_SHIFT;
-       unsigned long end_index = end >> PAGE_SHIFT;
-
        ASSERT(locked_folio);
-       if (index == locked_folio->index && end_index == index)
-               return;
 
        __process_folios_contig(inode->i_mapping, locked_folio, start, end,
                                PAGE_UNLOCK);
@@ -246,9 +241,6 @@ static noinline int lock_delalloc_folios(struct inode *inode,
        u64 processed_end = start;
        struct folio_batch fbatch;
 
-       if (index == locked_folio->index && index == end_index)
-               return 0;
-
        folio_batch_init(&fbatch);
        while (index <= end_index) {
                unsigned int found_folios, i;