Patch "btrfs: fix extent map logging bit not cleared for split maps after dropping range" has been added to the 6.2-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    btrfs: fix extent map logging bit not cleared for split maps after dropping range

to the 6.2-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     btrfs-fix-extent-map-logging-bit-not-cleared-for-spl.patch
and it can be found in the queue-6.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit fb730ba713850f82d1549d67b8fe56d16b8ef05e
Author: Filipe Manana <fdmanana@xxxxxxxx>
Date:   Mon Feb 27 12:53:56 2023 +0000

    btrfs: fix extent map logging bit not cleared for split maps after dropping range
    
    [ Upstream commit e4cc1483f35940c9288c332dd275f6fad485f8d2 ]
    
    At btrfs_drop_extent_map_range() we are clearing the EXTENT_FLAG_LOGGING
    bit on a 'flags' variable that was not initialized. This makes static
    checkers complain about it, so initialize the 'flags' variable before
    clearing the bit.
    
    In practice this has no consequences, because EXTENT_FLAG_LOGGING should
    not be set when btrfs_drop_extent_map_range() is called, as an fsync locks
    the inode in exclusive mode, locks the inode's mmap semaphore in exclusive
    mode too and it always flushes all delalloc.
    
    Also add a comment about why we clear EXTENT_FLAG_LOGGING on a copy of the
    flags of the split extent map.
    
    Reported-by: Dan Carpenter <error27@xxxxxxxxx>
    Link: https://lore.kernel.org/linux-btrfs/Y%2FyipSVozUDEZKow@kili/
    Fixes: db21370bffbc ("btrfs: drop extent map range more efficiently")
    Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index be94030e1dfbf..138afa955370b 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -763,7 +763,13 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 			goto next;
 		}
 
+		flags = em->flags;
 		clear_bit(EXTENT_FLAG_PINNED, &em->flags);
+		/*
+		 * In case we split the extent map, we want to preserve the
+		 * EXTENT_FLAG_LOGGING flag on our extent map, but we don't want
+		 * it on the new extent maps.
+		 */
 		clear_bit(EXTENT_FLAG_LOGGING, &flags);
 		modified = !list_empty(&em->list);
 
@@ -774,7 +780,6 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 		if (em->start >= start && em_end <= end)
 			goto remove_em;
 
-		flags = em->flags;
 		gen = em->generation;
 		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux