• Qu Wenruo's avatar
    Revert "btrfs: qgroups: Retry after commit on getting EDQUOT" · 0b78877a
    Qu Wenruo authored
    This reverts commit 48a89bc4.
    
    The idea to commit transaction and free some space after hitting qgroup
    limit is good, although the problem is it can easily cause deadlocks.
    
    One deadlock example is caused by trying to flush data while still
    holding it:
    
    Call Trace:
     __schedule+0x49d/0x10f0
     schedule+0xc6/0x290
     schedule_timeout+0x187/0x1c0
     wait_for_completion+0x204/0x3a0
     btrfs_wait_ordered_extents+0xa40/0xaf0 [btrfs]
     qgroup_reserve+0x913/0xa10 [btrfs]
     btrfs_qgroup_reserve_data+0x3ef/0x580 [btrfs]
     btrfs_check_data_free_space+0x96/0xd0 [btrfs]
     __btrfs_buffered_write+0x3ac/0xd40 [btrfs]
     btrfs_file_write_iter+0x62a/0xba0 [btrfs]
     __vfs_write+0x320/0x430
     vfs_write+0x107/0x270
     SyS_write+0xbf/0x150
     do_syscall_64+0x1b0/0x3d0
     entry_SYSCALL64_slow_path+0x25/0x25
    
    Another can be caused by trying to commit one transaction while nesting
    with trans handle held by ourselves:
    
    btrfs_start_transaction()
    |- btrfs_qgroup_reserve_meta_pertrans()
       |- qgroup_reserve()
          |- btrfs_join_transaction()
          |- btrfs_commit_transaction()
    
    The retry is causing more problems than exppected when limit is enabled.
    At least a graceful EDQUOT is way better than deadlock.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0b78877a
qgroup.c 82.2 KB