• Qu Wenruo's avatar
    btrfs: slightly loosen the requirement for qgroup removal · a776bf5f
    Qu Wenruo authored
    [BUG]
    Currently if one is utilizing "qgroups/drop_subtree_threshold" sysfs,
    and a snapshot with level higher than that value is dropped, we will
    not be able to delete the qgroup until next qgroup rescan:
    
      uuid=ffffffff-eeee-dddd-cccc-000000000000
    
      wipefs -fa $dev
      mkfs.btrfs -f $dev -O quota -s 4k -n 4k -U $uuid
      mount $dev $mnt
    
      btrfs subvolume create $mnt/subv1/
      for (( i = 0; i < 1024; i++ )); do
      	xfs_io -f -c "pwrite 0 2k" $mnt/subv1/file_$i > /dev/null
      done
      sync
      btrfs subvolume snapshot $mnt/subv1 $mnt/snapshot
      btrfs quota enable $mnt
      btrfs quota rescan -w $mnt
      sync
      echo 1 > /sys/fs/btrfs/$uuid/qgroups/drop_subtree_threshold
      btrfs subvolume delete $mnt/snapshot
      btrfs subvolume sync $mnt
      btrfs qgroup show -prce --sync $mnt
      btrfs qgroup destroy 0/257 $mnt
      umount $mnt
    
    The final qgroup removal would fail with the following error:
    
      ERROR: unable to destroy quota group: Device or resource busy
    
    [CAUSE]
    The above script would generate a subvolume of level 2, then snapshot
    it, enable qgroup, set the drop_subtree_threshold, then drop the
    snapshot.
    
    Since the subvolume drop would meet the threshold, qgroup would be
    marked inconsistent and skip accounting to avoid hanging the system at
    transaction commit.
    
    But currently we do not allow a qgroup with any rfer/excl numbers to be
    dropped, and this is not really compatible with the new
    drop_subtree_threshold behavior.
    
    [FIX]
    Only require the strict zero rfer/excl/rfer_cmpr/excl_cmpr for squota
    mode.  This is due to the fact that squota can never go inconsistent,
    and it can have dropped subvolume but with non-zero qgroup numbers for
    future accounting.
    
    For full qgroup mode, we only check if there is a subvolume for it.
    Reviewed-by: default avatarBoris Burkov <boris@bur.io>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a776bf5f
qgroup.c 131 KB