Qu Wenruo ae5e070eac btrfs: qgroup: don't try to wait flushing if we're already holding a transaction
There is a chance of racing for qgroup flushing which may lead to
deadlock:

	Thread A		|	Thread B
   (not holding trans handle)	|  (holding a trans handle)
--------------------------------+--------------------------------
__btrfs_qgroup_reserve_meta()   | __btrfs_qgroup_reserve_meta()
|- try_flush_qgroup()		| |- try_flush_qgroup()
   |- QGROUP_FLUSHING bit set   |    |
   |				|    |- test_and_set_bit()
   |				|    |- wait_event()
   |- btrfs_join_transaction()	|
   |- btrfs_commit_transaction()|

			!!! DEAD LOCK !!!

Since thread A wants to commit transaction, but thread B is holding a
transaction handle, blocking the commit.
At the same time, thread B is waiting for thread A to finish its commit.

This is just a hot fix, and would lead to more EDQUOT when we're near
the qgroup limit.

The proper fix would be to make all metadata/data reservations happen
without holding a transaction handle.

CC: stable@vger.kernel.org # 5.9+
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-12-18 14:50:07 +01:00
..
2020-10-16 11:11:22 -07:00
2020-10-19 14:28:30 -07:00
2020-11-19 22:38:29 -05:00
2020-09-21 08:59:26 -07:00
2020-11-14 11:26:04 -08:00
2020-11-20 11:47:22 -08:00
\n
2020-10-15 14:56:15 -07:00
2020-10-01 11:15:31 +02:00
2020-09-10 14:03:31 -07:00
2020-10-05 10:38:33 -06:00
2020-10-19 14:28:30 -07:00
\n
2020-10-15 15:03:10 -07:00
2020-10-16 12:21:15 -07:00
2020-10-13 12:12:44 -07:00
2020-08-04 21:02:38 -04:00
2020-10-16 11:11:15 -07:00
2020-09-22 23:45:57 -04:00
2020-07-31 08:16:01 +02:00
2020-08-07 11:33:24 -07:00
2020-10-23 11:33:41 -07:00
2020-05-14 16:44:24 +02:00
2020-08-12 10:58:01 -07:00
2020-10-23 11:33:41 -07:00
2020-07-31 08:16:00 +02:00
2020-11-06 10:05:18 -08:00
2020-10-24 12:40:18 -07:00
2020-09-26 22:55:05 -04:00
2020-08-27 16:06:47 -04:00
2020-06-09 15:40:50 -07:00
2020-07-31 08:16:01 +02:00