Patch "btrfs: qgroup: always free reserved space for extent records" has been added to the 6.7-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: qgroup: always free reserved space for extent records

to the 6.7-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-qgroup-always-free-reserved-space-for-extent-r.patch
and it can be found in the queue-6.7 subdirectory.

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



commit 655405399e253e3912b2395e56c9c7a9db14998a
Author: Qu Wenruo <wqu@xxxxxxxx>
Date:   Fri Feb 23 18:13:38 2024 +1030

    btrfs: qgroup: always free reserved space for extent records
    
    [ Upstream commit d139ded8b9cdb897bb9539eb33311daf9a177fd2 ]
    
    [BUG]
    If qgroup is marked inconsistent (e.g. caused by operations needing full
    subtree rescan, like creating a snapshot and assign to a higher level
    qgroup), btrfs would immediately start leaking its data reserved space.
    
    The following script can easily reproduce it:
    
      mkfs.btrfs -O quota -f $dev
      mount $dev $mnt
      btrfs subvolume create $mnt/subv1
      btrfs qgroup create 1/0 $mnt
    
      # This snapshot creation would mark qgroup inconsistent,
      # as the ownership involves different higher level qgroup, thus
      # we have to rescan both source and snapshot, which can be very
      # time consuming, thus here btrfs just choose to mark qgroup
      # inconsistent, and let users to determine when to do the rescan.
      btrfs subv snapshot -i 1/0 $mnt/subv1 $mnt/snap1
    
      # Now this write would lead to qgroup rsv leak.
      xfs_io -f -c "pwrite 0 64k" $mnt/file1
    
      # And at unmount time, btrfs would report 64K DATA rsv space leaked.
      umount $mnt
    
    And we would have the following dmesg output for the unmount:
    
      BTRFS info (device dm-1): last unmount of filesystem 14a3d84e-f47b-4f72-b053-a8a36eef74d3
      BTRFS warning (device dm-1): qgroup 0/5 has unreleased space, type 0 rsv 65536
    
    [CAUSE]
    Since commit e15e9f43c7ca ("btrfs: introduce
    BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING to skip qgroup accounting"),
    we introduce a mode for btrfs qgroup to skip the timing consuming
    backref walk, if the qgroup is already inconsistent.
    
    But this skip also covered the data reserved freeing, thus the qgroup
    reserved space for each newly created data extent would not be freed,
    thus cause the leakage.
    
    [FIX]
    Make the data extent reserved space freeing mandatory.
    
    The qgroup reserved space handling is way cheaper compared to the
    backref walking part, and we always have the super sensitive leak
    detector, thus it's definitely worth to always free the qgroup
    reserved data space.
    
    Reported-by: Fabian Vogt <fvogt@xxxxxxxx>
    Fixes: e15e9f43c7ca ("btrfs: introduce BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING to skip qgroup accounting")
    CC: stable@xxxxxxxxxxxxxxx # 6.1+
    Link: https://bugzilla.suse.com/show_bug.cgi?id=1216196
    Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx>
    Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index bbfa44b89bc45..1dcf5bb8dfa6f 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -2959,11 +2959,6 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans)
 				ctx.roots = NULL;
 			}
 
-			/* Free the reserved data space */
-			btrfs_qgroup_free_refroot(fs_info,
-					record->data_rsv_refroot,
-					record->data_rsv,
-					BTRFS_QGROUP_RSV_DATA);
 			/*
 			 * Use BTRFS_SEQ_LAST as time_seq to do special search,
 			 * which doesn't lock tree or delayed_refs and search
@@ -2987,6 +2982,11 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans)
 			record->old_roots = NULL;
 			new_roots = NULL;
 		}
+		/* Free the reserved data space */
+		btrfs_qgroup_free_refroot(fs_info,
+				record->data_rsv_refroot,
+				record->data_rsv,
+				BTRFS_QGROUP_RSV_DATA);
 cleanup:
 		ulist_free(record->old_roots);
 		ulist_free(new_roots);




[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