btrfs: do not consider send context as valid when trying to flush qgroups
At qgroup.c:try_flush_qgroup() we are asserting that current->journal_info is either NULL or has the value BTRFS_SEND_TRANS_STUB. However allowing for BTRFS_SEND_TRANS_STUB makes no sense because: 1) It is misleading, because send operations are read-only and do not ever need to reserve qgroup space; 2) We already assert that current->journal_info != BTRFS_SEND_TRANS_STUB at transaction.c:start_transaction(); 3) On a kernel without CONFIG_BTRFS_ASSERT=y set, it would result in a crash if try_flush_qgroup() is ever called in a send context, because at transaction.c:start_transaction we cast current->journal_info into a struct btrfs_trans_handle pointer and then dereference it. So just do allow a send context at try_flush_qgroup() and update the comment about it. 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>
This commit is contained in:
Родитель
adbd914dcd
Коммит
ffb7c2e923
|
@ -3545,11 +3545,15 @@ static int try_flush_qgroup(struct btrfs_root *root)
|
|||
struct btrfs_trans_handle *trans;
|
||||
int ret;
|
||||
|
||||
/* Can't hold an open transaction or we run the risk of deadlocking */
|
||||
ASSERT(current->journal_info == NULL ||
|
||||
current->journal_info == BTRFS_SEND_TRANS_STUB);
|
||||
if (WARN_ON(current->journal_info &&
|
||||
current->journal_info != BTRFS_SEND_TRANS_STUB))
|
||||
/*
|
||||
* Can't hold an open transaction or we run the risk of deadlocking,
|
||||
* and can't either be under the context of a send operation (where
|
||||
* current->journal_info is set to BTRFS_SEND_TRANS_STUB), as that
|
||||
* would result in a crash when starting a transaction and does not
|
||||
* make sense either (send is a read-only operation).
|
||||
*/
|
||||
ASSERT(current->journal_info == NULL);
|
||||
if (WARN_ON(current->journal_info))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче