On 2020/2/12 上午5:40, Josef Bacik wrote: > btrfs_assert_delayed_root_empty() will check if the delayed root is > completely empty, but this is a fs wide check. On cleanup we may have > allowed other transactions to begin, for whatever reason, and thus the > delayed root is not empty. So remove this check from > cleanup_one_transation(). This however can stay in > btrfs_cleanup_transaction(), because it checks only after all of the > transactions have been properly cleaned up, and thus is valid. > > Signed-off-by: Josef Bacik Reviewed-by: Qu Wenruo Just a nitpick, to allow other user to verify the fix, would you mind to provide a specific reproducer? Like the error injection (I guess it's still memory allocation failure), the call chain. Thanks, Qu > --- > fs/btrfs/disk-io.c | 1 - > 1 file changed, 1 deletion(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 5b6140482cef..601ed3335cf6 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -4543,7 +4543,6 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, > wake_up(&fs_info->transaction_wait); > > btrfs_destroy_delayed_inodes(fs_info); > - btrfs_assert_delayed_root_empty(fs_info); > > btrfs_destroy_marked_extents(fs_info, &cur_trans->dirty_pages, > EXTENT_DIRTY); >