From patchwork Wed Jul 8 06:24:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 11650687 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1D5CB14DD for ; Wed, 8 Jul 2020 06:25:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0390420720 for ; Wed, 8 Jul 2020 06:25:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729208AbgGHGZZ (ORCPT ); Wed, 8 Jul 2020 02:25:25 -0400 Received: from mx2.suse.de ([195.135.220.15]:56226 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726321AbgGHGZZ (ORCPT ); Wed, 8 Jul 2020 02:25:25 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D9968AFBF for ; Wed, 8 Jul 2020 06:25:23 +0000 (UTC) From: Qu Wenruo To: linux-btrfs@vger.kernel.org Subject: [PATCH v3 0/3] btrfs: qgroup: Fix the long existing regression of btrfs/153 Date: Wed, 8 Jul 2020 14:24:44 +0800 Message-Id: <20200708062447.81341-1-wqu@suse.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Since commit c6887cd11149 ("Btrfs: don't do nocow check unless we have to"), btrfs/153 always fails with early EDQUOT. This is caused by the fact that: - We always reserved data space for even NODATACOW buffered write This is mostly to improve performance, and not pratical to revert. - Btrfs qgroup data and meta reserved space share the same limit So it's not ensured to return EDQUOT just for that data reservation, metadata reservation can also get EDQUOT, means we can't go the same solution as that commit. This patchset will solve it by doing extra qgroup space flushing when EDQUOT is hit. This is a little like what we do in ticketing space reservation system, but since there are very limited ways for qgroup to reclaim space, currently it's still handled in qgroup realm, not reusing the ticketing system yet. By this, this patch could solve the btrfs/153 problem, while still keep btrfs qgroup space usage under the limit. The only cost is, when we're near qgroup limit, we will cause more dirty inodes flush and transaction commit, much like what we do when the metadata space is near exhausted. So the cost should be still acceptable. Changelog: v2: - Use existing ulist infrastructure Thanks to the advice from Josef, we can just iterate the ulist nodes inside the failure range to remove the offending nodes. And since already dirtied range won't show up in the current extent changeset, we won't clear existing range. This saves around 100 new lines - Remove the use of "Revert" in the 3rd cleanup patch We're not reverting to fix some regression, but just remove some deprecated mechanism which was designed to partially solve the problem. v3: - Fix a variable shadowing bug In the 2nd patch, there was a variable shadowing bug, which overrides the @start and @len parameter. - Update the commit message for the first patch To make the cause more obvious - Use cleaner if condition before try_flush_qgroup() Qu Wenruo (3): btrfs: qgroup: allow btrfs_qgroup_reserve_data() to revert the range it just set without releasing other existing ranges btrfs: qgroup: try to flush qgroup space when we get -EDQUOT btrfs: qgroup: remove the ASYNC_COMMIT mechanism in favor of qgroup reserve retry-after-EDQUOT fs/btrfs/ctree.h | 6 +- fs/btrfs/disk-io.c | 2 +- fs/btrfs/qgroup.c | 234 ++++++++++++++++++++++++++++++----------- fs/btrfs/transaction.c | 1 - fs/btrfs/transaction.h | 14 --- 5 files changed, 172 insertions(+), 85 deletions(-)