]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: qgroup: set quota enabled bit if quota disable fails flushing reservations
authorFilipe Manana <fdmanana@suse.com>
Tue, 1 Jul 2025 10:39:44 +0000 (11:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:36:30 +0000 (18:36 +0200)
commit e41c75ca3189341e76e6af64b857c05b68a1d7db upstream.

Before waiting for the rescan worker to finish and flushing reservations,
we clear the BTRFS_FS_QUOTA_ENABLED flag from fs_info. If we fail flushing
reservations we leave with the flag not set which is not correct since
quotas are still enabled - we must set back the flag on error paths, such
as when we fail to start a transaction, except for error paths that abort
a transaction. The reservation flushing happens very early before we do
any operation that actually disables quotas and before we start a
transaction, so set back BTRFS_FS_QUOTA_ENABLED if it fails.

Fixes: af0e2aab3b70 ("btrfs: qgroup: flush reservations during quota disable")
CC: stable@vger.kernel.org # 6.12+
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/qgroup.c

index d6fa36674270f78cf16e0af6db666d5a0693ff3a..3aa6996b0b39609f96e7c5adeca29eb529381be8 100644 (file)
@@ -1354,11 +1354,14 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)
 
        /*
         * We have nothing held here and no trans handle, just return the error
-        * if there is one.
+        * if there is one and set back the quota enabled bit since we didn't
+        * actually disable quotas.
         */
        ret = flush_reservations(fs_info);
-       if (ret)
+       if (ret) {
+               set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
                return ret;
+       }
 
        /*
         * 1 For the root item