From patchwork Wed Mar 13 01:53:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590838 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E65688C1E for ; Wed, 13 Mar 2024 01:53:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294799; cv=none; b=BA4mguK08wLRwBUMnZAvjI8OG2UogweMjIOyMa2Y8zmeZPkEOYhgc75o8hyysgNXs+LDq2l21qaRQK+fqQDoDr4l52BNi9kXcBtfS66UDq6ccqPBEbLjoi+ojoPJBSLvTVbu/4vhjb+nuGwlBIyijhAtolqPk2ZaLRJNbGkiyZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294799; c=relaxed/simple; bh=/oNeQjczj6Wi3tmbESMxUsIHNglu8K+c8U9kI2m1lLE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bDlSMD+IEEyXxYy3UR2xlgHvTBrsHFD3Pt01PxUQGKTmQ68MOU6eroQhg8PndZVYhhciHnUGapnHz3yfAAswLPxndAOE8aDu/ySWpWIURGxl2+YtO34QfaTsFUEG6h/EOrMTCmQpU6Rp9lmhsrYuQHIoUNzO5voeC0hXKcm1G/o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NTm5K1eH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NTm5K1eH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C24E9C433C7; Wed, 13 Mar 2024 01:53:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294798; bh=/oNeQjczj6Wi3tmbESMxUsIHNglu8K+c8U9kI2m1lLE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=NTm5K1eHrQ4WY8rw1+iKk11bdYaf5YwTPSnNlql9o5QWrrMOWFah1yewq+w+uT1Nw w0AOQRqmjHDq0OZttTZVqC+mRABv6q4veLCdqgSPK27kyAjYHV9yyFk3CsGbAcGpP+ aLVId5onaax5yR5PBbwKgd8QP8pHKE4oy7dA98GjZ9UO/rTtuS7HqY/8sjDY4vufMB M972zT7yMCKDaur8v322f9/m/eYhC2Gini3ZTFbEfEztWzIL0PrXpc35dzdudfwQXs NMEpEbW3zl/veJnKx61qtHbjtNUiKeFf21ejAaHW5vDmbWS8nhUkNEW3orQ4r4nKtQ wXReSvPZnlLmw== Date: Tue, 12 Mar 2024 18:53:18 -0700 Subject: [PATCH 01/67] xfs: use xfs_defer_pending objects to recover intent items From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431208.2061787.14831034059047125756.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 03f7767c9f6120ac933378fdec3bfd78bf07bc11 One thing I never quite got around to doing is porting the log intent item recovery code to reconstruct the deferred pending work state. As a result, each intent item open codes xfs_defer_finish_one in its recovery method, because that's what the EFI code did before xfs_defer.c even existed. This is a gross thing to have left unfixed -- if an EFI cannot proceed due to busy extents, we end up creating separate new EFIs for each unfinished work item, which is a change in behavior from what runtime would have done. Worse yet, Long Li pointed out that there's a UAF in the recovery code. The ->commit_pass2 function adds the intent item to the AIL and drops the refcount. The one remaining refcount is now owned by the recovery mechanism (aka the log intent items in the AIL) with the intent of giving the refcount to the intent done item in the ->iop_recover function. However, if something fails later in recovery, xlog_recover_finish will walk the recovered intent items in the AIL and release them. If the CIL hasn't been pushed before that point (which is possible since we don't force the log until later) then the intent done release will try to free its associated intent, which has already been freed. This patch starts to address this mess by having the ->commit_pass2 functions recreate the xfs_defer_pending state. The next few patches will fix the recovery functions. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 105 ++++++++++++++++++++++++++++++++++++++-------------- libxfs/xfs_defer.h | 5 ++ 2 files changed, 82 insertions(+), 28 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 7ff125c5fb92..bd6f14a2c0d2 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -240,23 +240,53 @@ xfs_defer_create_intents( return ret; } -STATIC void +static inline void xfs_defer_pending_abort( + struct xfs_mount *mp, + struct xfs_defer_pending *dfp) +{ + const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + + trace_xfs_defer_pending_abort(mp, dfp); + + if (dfp->dfp_intent && !dfp->dfp_done) { + ops->abort_intent(dfp->dfp_intent); + dfp->dfp_intent = NULL; + } +} + +static inline void +xfs_defer_pending_cancel_work( + struct xfs_mount *mp, + struct xfs_defer_pending *dfp) +{ + const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + struct list_head *pwi; + struct list_head *n; + + trace_xfs_defer_cancel_list(mp, dfp); + + list_del(&dfp->dfp_list); + list_for_each_safe(pwi, n, &dfp->dfp_work) { + list_del(pwi); + dfp->dfp_count--; + trace_xfs_defer_cancel_item(mp, dfp, pwi); + ops->cancel_item(pwi); + } + ASSERT(dfp->dfp_count == 0); + kmem_cache_free(xfs_defer_pending_cache, dfp); +} + +STATIC void +xfs_defer_pending_abort_list( struct xfs_mount *mp, struct list_head *dop_list) { struct xfs_defer_pending *dfp; - const struct xfs_defer_op_type *ops; /* Abort intent items that don't have a done item. */ - list_for_each_entry(dfp, dop_list, dfp_list) { - ops = defer_op_types[dfp->dfp_type]; - trace_xfs_defer_pending_abort(mp, dfp); - if (dfp->dfp_intent && !dfp->dfp_done) { - ops->abort_intent(dfp->dfp_intent); - dfp->dfp_intent = NULL; - } - } + list_for_each_entry(dfp, dop_list, dfp_list) + xfs_defer_pending_abort(mp, dfp); } /* Abort all the intents that were committed. */ @@ -266,7 +296,7 @@ xfs_defer_trans_abort( struct list_head *dop_pending) { trace_xfs_defer_trans_abort(tp, _RET_IP_); - xfs_defer_pending_abort(tp->t_mountp, dop_pending); + xfs_defer_pending_abort_list(tp->t_mountp, dop_pending); } /* @@ -384,27 +414,13 @@ xfs_defer_cancel_list( { struct xfs_defer_pending *dfp; struct xfs_defer_pending *pli; - struct list_head *pwi; - struct list_head *n; - const struct xfs_defer_op_type *ops; /* * Free the pending items. Caller should already have arranged * for the intent items to be released. */ - list_for_each_entry_safe(dfp, pli, dop_list, dfp_list) { - ops = defer_op_types[dfp->dfp_type]; - trace_xfs_defer_cancel_list(mp, dfp); - list_del(&dfp->dfp_list); - list_for_each_safe(pwi, n, &dfp->dfp_work) { - list_del(pwi); - dfp->dfp_count--; - trace_xfs_defer_cancel_item(mp, dfp, pwi); - ops->cancel_item(pwi); - } - ASSERT(dfp->dfp_count == 0); - kmem_cache_free(xfs_defer_pending_cache, dfp); - } + list_for_each_entry_safe(dfp, pli, dop_list, dfp_list) + xfs_defer_pending_cancel_work(mp, dfp); } /* @@ -660,6 +676,39 @@ xfs_defer_add( dfp->dfp_count++; } +/* + * Create a pending deferred work item to replay the recovered intent item + * and add it to the list. + */ +void +xfs_defer_start_recovery( + struct xfs_log_item *lip, + enum xfs_defer_ops_type dfp_type, + struct list_head *r_dfops) +{ + struct xfs_defer_pending *dfp; + + dfp = kmem_cache_zalloc(xfs_defer_pending_cache, + GFP_NOFS | __GFP_NOFAIL); + dfp->dfp_type = dfp_type; + dfp->dfp_intent = lip; + INIT_LIST_HEAD(&dfp->dfp_work); + list_add_tail(&dfp->dfp_list, r_dfops); +} + +/* + * Cancel a deferred work item created to recover a log intent item. @dfp + * will be freed after this function returns. + */ +void +xfs_defer_cancel_recovery( + struct xfs_mount *mp, + struct xfs_defer_pending *dfp) +{ + xfs_defer_pending_abort(mp, dfp); + xfs_defer_pending_cancel_work(mp, dfp); +} + /* * Move deferred ops from one transaction to another and reset the source to * initial state. This is primarily used to carry state forward across @@ -764,7 +813,7 @@ xfs_defer_ops_capture_abort( { unsigned short i; - xfs_defer_pending_abort(mp, &dfc->dfc_dfops); + xfs_defer_pending_abort_list(mp, &dfc->dfc_dfops); xfs_defer_cancel_list(mp, &dfc->dfc_dfops); for (i = 0; i < dfc->dfc_held.dr_bufs; i++) diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 8788ad5f6a73..5dce938ba3d5 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -125,6 +125,11 @@ void xfs_defer_ops_capture_abort(struct xfs_mount *mp, struct xfs_defer_capture *d); void xfs_defer_resources_rele(struct xfs_defer_resources *dres); +void xfs_defer_start_recovery(struct xfs_log_item *lip, + enum xfs_defer_ops_type dfp_type, struct list_head *r_dfops); +void xfs_defer_cancel_recovery(struct xfs_mount *mp, + struct xfs_defer_pending *dfp); + int __init xfs_defer_init_item_caches(void); void xfs_defer_destroy_item_caches(void); From patchwork Wed Mar 13 01:53:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590839 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F41A5AD21 for ; Wed, 13 Mar 2024 01:53:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294815; cv=none; b=sbOGoESg6OGWqItypViw9/XEth+WUpCjhMnH45L65+YYIOYkFrdifEswAjwaNAuFT7Hm+ERvWWwKCnu0w+zfRiDp/I/HYyup3J0Rj8pFAE6KScsyXV9pVG4+TLSt1Rbns359iX7qiKGaVXBBHAo6/2uGIJvYpCuoJfhwJ+jEB40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294815; c=relaxed/simple; bh=+86Rvgu/X+hG9PPDEOae0++zrzu5y2CeauEv1NFde7A=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=d8kn+ahnqgCFxnHj4838iIWntNlVyiNAe3g5i/eBqNFgcmvt76dCPPUzUKEKLbTGs8s3+wITooIPwq6/EF86tcLy8UchtUxYzsPnUaxpyyeyIl3le2LhR1axc8/OlKFeI/tsLLs63jX/iJxNvc5ZiJ5F4w7h5aTlgghKoIU3208= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qz3ylK8a; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qz3ylK8a" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6EE2AC433F1; Wed, 13 Mar 2024 01:53:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294814; bh=+86Rvgu/X+hG9PPDEOae0++zrzu5y2CeauEv1NFde7A=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=qz3ylK8aDO2v/vk9f4m4T8abmZW3CirWxtc+OAzKsMEygc8TslVr/QI4n2yx/i00n gVhngUDRirVNpiSlTF+p69gLtbHFAqo+E4C0IAwc5Sv/udfYSqpYnq6ray3oR1BQk+ nb/rLP6GnbLsqSmseONJB5KTk08rapwix+3hGbFnYzeGqtyGNiOd8ZwW1GwDNzXpGv VUTobbyU9j9cXBIig4B7vDGenNdhq9Ai7kuYHkfwlfj4Wwkapdyn5JnLhpa8cP8Hwu FkSJUi9ptBuw24yWLj6bEfMX0FzlR3C7mIXCb2czbzb95Tx99D3/X4kHqOprGiinvW i6u0GCygaq1Cw== Date: Tue, 12 Mar 2024 18:53:33 -0700 Subject: [PATCH 02/67] xfs: recreate work items when recovering intent items From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431222.2061787.13965134299124279099.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e70fb328d5277297ea2d9169a3a046de6412d777 Recreate work items for each xfs_defer_pending object when we are recovering intent items. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 3 +-- libxfs/xfs_defer.h | 9 +++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index bd6f14a2c0d2..4900a7d62e5e 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -671,9 +671,8 @@ xfs_defer_add( list_add_tail(&dfp->dfp_list, &tp->t_dfops); } - list_add_tail(li, &dfp->dfp_work); + xfs_defer_add_item(dfp, li); trace_xfs_defer_add_item(tp->t_mountp, dfp, li); - dfp->dfp_count++; } /* diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 5dce938ba3d5..bef5823f61fb 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -130,6 +130,15 @@ void xfs_defer_start_recovery(struct xfs_log_item *lip, void xfs_defer_cancel_recovery(struct xfs_mount *mp, struct xfs_defer_pending *dfp); +static inline void +xfs_defer_add_item( + struct xfs_defer_pending *dfp, + struct list_head *work) +{ + list_add_tail(work, &dfp->dfp_work); + dfp->dfp_count++; +} + int __init xfs_defer_init_item_caches(void); void xfs_defer_destroy_item_caches(void); From patchwork Wed Mar 13 01:53:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590840 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 201D0B652 for ; Wed, 13 Mar 2024 01:53:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294830; cv=none; b=IbieJ8ioXobiNL0gR+oUnYWP/91CET+cx/MEREsoioAgHngCmgcikOZV3W1vq41Lc1yvVKzBhcF5obKuBnjhiTpfIS7upYJQXbyhTZYro7EUGImtVELbNaQ5trEHQhQTNGmIxrhYxWqX2ZSGcNcDmKWTPmBid73QqFuYg7jhgk4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294830; c=relaxed/simple; bh=2VRqz4dA1BAhSOCzVF+h0tuDZV4Px4GWX13HoOXc+58=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CLMElPheDXuraBF9jmSzqfv4RiLMmlIcUP98paKsIkiA5fNNeumQ+mrdnTiobzJjk8tN+Kx6w8nDlSXPi01U+LzKu1zBLZnhMVhMAii0sNmT9nrLOAMrsaE+1K+1wJWrg7Wztb5Fc14MrwxOi3wLk6pgPS0hFp+LmksRdHA0eMw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AA0bTh5H; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AA0bTh5H" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EE46EC433F1; Wed, 13 Mar 2024 01:53:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294830; bh=2VRqz4dA1BAhSOCzVF+h0tuDZV4Px4GWX13HoOXc+58=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=AA0bTh5HOFiTGrFJ6TPiAEeiSB00+1bzvluMt8BVMO8GqzbxfBqGhehaVmSlnIq5+ IP25IsKC6Kcu3cEUWXhKEoVcmYlUXjoVc0Esl0Xx6V83O0b47UoU70O6fiRszY/YL6 98pYAJYwImVrrvpVxkVeAjZ1S7/Bv1E3Ou1QjRfzmMv0DNkwUFJ9B1vK5I9qYCrGe1 /+Vc99rXf6GXM+s00yVQLsr2M0qsDROlezi3fvIEzhzyvL3aLQKAuW/rUCQEhs1fvF ZgFeapXNW/DjyPwRtw7NhO1+LsUspOsO532uGSXVepDqE7YoNbIYejbUcebpeSn8WQ UZ9+N/jjQW5EQ== Date: Tue, 12 Mar 2024 18:53:49 -0700 Subject: [PATCH 03/67] xfs: use xfs_defer_finish_one to finish recovered work items From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431236.2061787.17936183721529625244.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e5f1a5146ec35f3ed5d7f5ac7807a10c0062b6b8 Get rid of the open-coded calls to xfs_defer_finish_one. This also means that the recovery transaction takes care of cleaning up the dfp, and we have solved (I hope) all the ownership issues in recovery. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 2 +- libxfs/xfs_defer.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 4900a7d62e5e..4ef9867cca0e 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -479,7 +479,7 @@ xfs_defer_relog( * Log an intent-done item for the first pending intent, and finish the work * items. */ -static int +int xfs_defer_finish_one( struct xfs_trans *tp, struct xfs_defer_pending *dfp) diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index bef5823f61fb..c1a648e99174 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -41,6 +41,7 @@ void xfs_defer_add(struct xfs_trans *tp, enum xfs_defer_ops_type type, struct list_head *h); int xfs_defer_finish_noroll(struct xfs_trans **tp); int xfs_defer_finish(struct xfs_trans **tp); +int xfs_defer_finish_one(struct xfs_trans *tp, struct xfs_defer_pending *dfp); void xfs_defer_cancel(struct xfs_trans *); void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp); From patchwork Wed Mar 13 01:54:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590841 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB646AD56 for ; Wed, 13 Mar 2024 01:54:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294845; cv=none; b=Vk5uZXakUMhjACNq/kPTmfbZgKzE+/NWvCdD+r6ZqffH1enz1NAsf0WsYZBVSyKhXaALynsgtnAziUWyrbxnN9vlTG9kKw17H3gpUDHVbbsOGKZHyi9Yv2XdK4zyocyvrgLbV49Sjx3uEs+oLbFBNm4vgXyP9YTcefLpgwUwqPE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294845; c=relaxed/simple; bh=8PCS3G9CoNY7IPNwi9QORJZ95h0vR0tM8lr86xjGsbM=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q/2Dvqn5+tm8Dp9O4Qm2HxTb9QtI4nMCySBxcCUD3GbLaR08yed7TWUe+xo7sbXVmkQWKpgvHujYY6xl56+HrCwIcC0Cc0+AxIDSlPkteCYO3qkOKe53nBRRtpeD4PkUK6bWUPpfYVm5MMxAOHqlZq5kfT0yj17SkZbiKFav0ig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cQRtqM2m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cQRtqM2m" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93DFCC433C7; Wed, 13 Mar 2024 01:54:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294845; bh=8PCS3G9CoNY7IPNwi9QORJZ95h0vR0tM8lr86xjGsbM=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=cQRtqM2mKe03fu9+AOQlspRolDoJ5YGpRif5GQ0xRbHFoI9KxMPe/w99tnKzmKpM1 EnXnrjomz0vKPaQ96OtnRHZdfHYgIv1eh/2OT0/9p2vuT9OXDpGchq9oHuPgo1cHeH lfifGudUm0zxd2feLkMlGwLJaxvmmtamipKiZ0MHtSG5a1fckzqNHfy6vVeJJS0DL+ xa/TjKAKHC5ijYhm1jzWvnNtJvRNZcXQmaibdPOiqUtOMwdSRTxLnNPnLPhHJdqMaK mRVLpAWHh856OdYQgfwDP7ZaGbYgtYE+DRHEnj9cK8JT/qMGAlynN+IqV3XBQeSNIL /E5JJu3jmxOhw== Date: Tue, 12 Mar 2024 18:54:05 -0700 Subject: [PATCH 04/67] xfs: move ->iop_recover to xfs_defer_op_type From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431251.2061787.13692691973902559724.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: db7ccc0bac2add5a41b66578e376b49328fc99d0 Finish off the series by moving the intent item recovery function pointer to the xfs_defer_op_type struct, since this is really a deferred work function now. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- include/xfs_trace.h | 2 ++ libxfs/xfs_defer.c | 17 +++++++++++++++++ libxfs/xfs_defer.h | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 7fd446ad42bf..c79a4bd74dcb 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -336,4 +336,6 @@ #define trace_xfs_fs_mark_healthy(a,b) ((void) 0) +#define trace_xlog_intent_recovery_failed(...) ((void) 0) + #endif /* __TRACE_H__ */ diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 4ef9867cca0e..54865b73b47f 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -708,6 +708,23 @@ xfs_defer_cancel_recovery( xfs_defer_pending_cancel_work(mp, dfp); } +/* Replay the deferred work item created from a recovered log intent item. */ +int +xfs_defer_finish_recovery( + struct xfs_mount *mp, + struct xfs_defer_pending *dfp, + struct list_head *capture_list) +{ + const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + int error; + + error = ops->recover_work(dfp, capture_list); + if (error) + trace_xlog_intent_recovery_failed(mp, error, + ops->recover_work); + return error; +} + /* * Move deferred ops from one transaction to another and reset the source to * initial state. This is primarily used to carry state forward across diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index c1a648e99174..ef86a7f9b059 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -57,6 +57,8 @@ struct xfs_defer_op_type { void (*finish_cleanup)(struct xfs_trans *tp, struct xfs_btree_cur *state, int error); void (*cancel_item)(struct list_head *item); + int (*recover_work)(struct xfs_defer_pending *dfp, + struct list_head *capture_list); unsigned int max_items; }; @@ -130,6 +132,8 @@ void xfs_defer_start_recovery(struct xfs_log_item *lip, enum xfs_defer_ops_type dfp_type, struct list_head *r_dfops); void xfs_defer_cancel_recovery(struct xfs_mount *mp, struct xfs_defer_pending *dfp); +int xfs_defer_finish_recovery(struct xfs_mount *mp, + struct xfs_defer_pending *dfp, struct list_head *capture_list); static inline void xfs_defer_add_item( From patchwork Wed Mar 13 01:54:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590842 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E18BBA2B for ; Wed, 13 Mar 2024 01:54:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294861; cv=none; b=UvtwIi9L3ZOhcDl+M1KNd604Oa/dlJyjS2HQYws5L2Ijt3zYBrtbaSXtNRRhjY21dVgRSbZZnA0ELXXcN+4tBlpn95Ib+dAgUg0HTj8oOkIYnxFd8BJAs7JK0qp1gRCVCCsJnrO1ZoIUv7DtH7/3tyEV+DnyPh2tmRK2bEmQ4rQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294861; c=relaxed/simple; bh=ZuurV066BV4kBhfj5hXsd9HPmpGfRWw0Jq5DAw6bWwg=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TlbyCB1/6EpA4LAr3tttB+sRGsKgofMi60ll8p724a4xSWKHwXY/hEQvsbs4DVNoJyM5P9RgMymdBaPNo2LvpfjQreWfQgkby9alO8KOYdf9Mk+7jNnlbJsyZRqRwVT7lVzPN7VudDhK2NWTnD1NTXhf0qzQ5shdQKnoCiTDTIk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=caFUuNFk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="caFUuNFk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 455AEC433C7; Wed, 13 Mar 2024 01:54:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294861; bh=ZuurV066BV4kBhfj5hXsd9HPmpGfRWw0Jq5DAw6bWwg=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=caFUuNFkdie+sTohKRs7Ai5k2scE/r8FCTuqIYfGVdIsqejUoEDbHVd+RkLOEp4TX 3Ymij9+wyhKEef0pv7gM7JfTWPZ7tUdEuCtFgIBMI7QzzCDqwLsywHno7J3KqdGhvq bxCi3fwTYduietqOTSBxARSAXFcA2C5nf7HFJ8sk1oktnQPoSOCFB0Uny/EOmC1mfu rqlbYlwNvGGteVkEN0vli4NNGBOhJBtR2rtx/qK2Gv35TU2Hl3C+DGKQEl5WCA5UVQ QHa4vWs/Q8xAFJ2OVNVaz/kBqBVdQ3UVnjNrbZwdus+2i5U9xqTAajeF7rnjeVuXtG SPZfchDrwDZsw== Date: Tue, 12 Mar 2024 18:54:20 -0700 Subject: [PATCH 05/67] xfs: hoist intent done flag setting to ->finish_item callsite From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431265.2061787.17302316296695672402.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 3dd75c8db1c1675a26d3e228bab349c1fc065867 Each log intent item's ->finish_item call chain inevitably includes some code to set the dirty flag of the transaction. If there's an associated log intent done item, it also sets the item's dirty flag and the transaction's INTENT_DONE flag. This is repeated throughout the codebase. Reduce the LOC by moving all that to xfs_defer_finish_one. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 54865b73b47f..6a9ce92419c0 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -186,6 +186,32 @@ static const struct xfs_defer_op_type *defer_op_types[] = { [XFS_DEFER_OPS_TYPE_ATTR] = &xfs_attr_defer_type, }; +/* Create a log intent done item for a log intent item. */ +static inline void +xfs_defer_create_done( + struct xfs_trans *tp, + struct xfs_defer_pending *dfp) +{ + const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + struct xfs_log_item *lip; + + /* + * Mark the transaction dirty, even on error. This ensures the + * transaction is aborted, which: + * + * 1.) releases the log intent item and frees the log done item + * 2.) shuts down the filesystem + */ + tp->t_flags |= XFS_TRANS_DIRTY; + lip = ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count); + if (!lip) + return; + + tp->t_flags |= XFS_TRANS_HAS_INTENT_DONE; + set_bit(XFS_LI_DIRTY, &lip->li_flags); + dfp->dfp_done = lip; +} + /* * Ensure there's a log intent item associated with this deferred work item if * the operation must be restarted on crash. Returns 1 if there's a log item; @@ -491,7 +517,7 @@ xfs_defer_finish_one( trace_xfs_defer_pending_finish(tp->t_mountp, dfp); - dfp->dfp_done = ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count); + xfs_defer_create_done(tp, dfp); list_for_each_safe(li, n, &dfp->dfp_work) { list_del(li); dfp->dfp_count--; From patchwork Wed Mar 13 01:54:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590843 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AFFAAD56 for ; Wed, 13 Mar 2024 01:54:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294877; cv=none; b=XxdssN3lpW5w21KhoTEK18AHA/HfpKQ/nOlkD7EjU9am/D97OjaZEGyCB9zN9TJQkagMwShds/cdm+k2wmtgu0rYV3tW3lGIM9r8JmnxoHADfNUcsqUfYVujC5DX0Xd7sZTkg36pUslOBKTEoSw2CXy6X4e7XMiq7kFYe/uOAW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294877; c=relaxed/simple; bh=+UMA8x/iZC0pbcoGnfWXvkNcT9u9zBzU9cTImSZKgiE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=O3puE5S5aGmsXoOfp4z1yVkENOAwSyDO+BItphd89H+Dr2JwqmKK3nG4RQ28DfiyxZRP6qvEziAXD/XfvwveBxSU/MQwwc+ym2GmQ3ECTnRCPIC74GD6QOE/mG2w3bXH/N3W6xFUx0kqjPXi4jjE/6/Hcb6ZiiWLas/UfPPXt34= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QaagVS6g; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QaagVS6g" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DBA43C433F1; Wed, 13 Mar 2024 01:54:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294876; bh=+UMA8x/iZC0pbcoGnfWXvkNcT9u9zBzU9cTImSZKgiE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=QaagVS6gZN1oVFJz/fCE8DrcBVxCID1n5ANHEy4Us1kfnJ7PBYw8sh1nvGKgO3apI NPV4HFEwZs276d/VVlWLi0D09qrJrr6Dd+wSxfdDQmuFIIWTd7deuR9FF+5GCLssFp cFxhBYJ5/w4NpqllTuY2azlj12WoNH9dk4nZzSz6MOJ8MjB0WZJLtojE1EbWMnrTEy XOOPUb0SK1hHeqIfveHNsH3oXbdhuqKGdpikra/w64eess0thcI9mtW4rkizeFZ18b j7a5ZfrktEBUS0MDbYODdpiCHHYTJZaMIAcOm9etyeu5BnBfLKNziMFd/i1R/pyQL+ EDyiCtRGWsdaw== Date: Tue, 12 Mar 2024 18:54:36 -0700 Subject: [PATCH 06/67] xfs: hoist ->create_intent boilerplate to its callsite From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431280.2061787.12889835241946985948.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: f3fd7f6fce1cc9b8eb59705b27f823330207b7c9 Hoist the dirty flag setting code out of each ->create_intent implementation up to the callsite to reduce boilerplate further. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 6a9ce92419c0..1be9554e1b86 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -235,6 +235,8 @@ xfs_defer_create_intent( if (IS_ERR(lip)) return PTR_ERR(lip); + tp->t_flags |= XFS_TRANS_DIRTY; + set_bit(XFS_LI_DIRTY, &lip->li_flags); dfp->dfp_intent = lip; return 1; } From patchwork Wed Mar 13 01:54:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590844 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02990B652 for ; Wed, 13 Mar 2024 01:54:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294893; cv=none; b=mnjroGLwb/JF+FNiRpbXi5D1Zqh2KSRW87hMF0NJeBiFiZvQy4DuRFT8E1CQOA6SJm51A0wrlheVBDLCnZIdSCy7XeVzZ2R9Rm00Zh4pfp3NaTUzSBCFJ6lfDtaVCI6aGE0xrYh3hdI6WRaX8J//Ph4+qOntveWBITsSZ2td1O4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294893; c=relaxed/simple; bh=4k0bZTVm60PnU4Yy9ReZC2WAQsmGqwMtu+CN0ZA5za4=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qj6Ys70uYQC15lW0blTgyz5OS556I9zxNhP4ryjydmz6EyLy9GUfRj9mIRvrCrhofTE8K00V1B/8dUW6L4LvNeT9Oy3XTc0GYCJtOo58S1RSkwOeY8Fhf9+FkKjHFo84p9DL24pG9vf+1i8YQAUTVXsmckzUAmz8ZalwNYDHsx8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=X0yUPhEd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="X0yUPhEd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 854E3C433C7; Wed, 13 Mar 2024 01:54:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294892; bh=4k0bZTVm60PnU4Yy9ReZC2WAQsmGqwMtu+CN0ZA5za4=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=X0yUPhEd9ThRJ98owucXKMz+zAJ/wTd4PzvIyiicCd88AWVX8MyOYU5Our5eA6Lq0 7Dd/uBsJ/sw0IkwzKjajOK4mdOH9jm5nWLtGEP48r1Ydicy30ztTWl4Mi6h7D8Aksq Xh+bXc8l0YaGCjxnCW9sOU+6pr1RhwHQce3/51nzKrWsvEjjtxuNOZzI2T6eH4EMJX QaZxtrWfLsd3ZU141RFbt/Q2SOm68gQcee4XA3G23AvI5rXhvLkW1jU7bVSSHAWqPu hGNwg0iWhrAYwltD+9Ox2nq1I4fhdhiATvFDi7Dxy0uKXh17x0KEIXZnVEQ/Q24fH2 Rj5pooKquarqA== Date: Tue, 12 Mar 2024 18:54:52 -0700 Subject: [PATCH 07/67] xfs: use xfs_defer_create_done for the relogging operation From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431294.2061787.11191434487692281302.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: bd3a88f6b71c7509566b44b7021581191cc11ae3 Now that we have a helper to handle creating a log intent done item and updating all the necessary state flags, use it to reduce boilerplate in the ->iop_relog implementations. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- include/xfs_trans.h | 2 +- libxfs/xfs_defer.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 8371bc7e8a43..ee250d521118 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -158,7 +158,7 @@ libxfs_trans_read_buf( } #define xfs_log_item_in_current_chkpt(lip) (false) -#define xfs_trans_item_relog(lip, tp) (NULL) +#define xfs_trans_item_relog(lip, dontcare, tp) (NULL) /* Contorted mess to make gcc shut up about unused vars. */ #define xlog_grant_push_threshold(log, need) \ diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 1be9554e1b86..43117099cc4c 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -495,7 +495,11 @@ xfs_defer_relog( trace_xfs_defer_relog_intent((*tpp)->t_mountp, dfp); XFS_STATS_INC((*tpp)->t_mountp, defer_relog); - dfp->dfp_intent = xfs_trans_item_relog(dfp->dfp_intent, *tpp); + + xfs_defer_create_done(*tpp, dfp); + dfp->dfp_intent = xfs_trans_item_relog(dfp->dfp_intent, + dfp->dfp_done, *tpp); + dfp->dfp_done = NULL; } if ((*tpp)->t_flags & XFS_TRANS_DIRTY) From patchwork Wed Mar 13 01:55:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590845 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A18FB652 for ; Wed, 13 Mar 2024 01:55:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294908; cv=none; b=O7pKrGUkng+jiIIXnpSIN3TnjwavtsRvM18KdrkJ/EdusjTZrFyW8bUu/+vVZmv84dP0306Jt9nKehnPFAFdSuzAwgdbwO1faBRBvsL4berAcnNmMxdtDuCU5u1rQcjHrYTE8+d3/vphMthYhbDmIBjOVRsDLAkhDl8CuZyD4qU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294908; c=relaxed/simple; bh=ULDR20Ykff54fhYfpobMhWNSMo6EvfXDGbCgyJRqnqM=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=S2YiB9pSA/BAGcRTksG50H/Cb5VYEJbSSjMLuhRGOfLrk494jYpOnXqc7idai+/LXnnECav1/AHzU6OcWSNs5HndfhJxGQPNAEDadAnubXoeMcD/+y8xQRoCF0sgqZv5XSSDVwRpRHyLACU2hYB6bBSQ/tBk8bU9Wm9ZTJQZ8gM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=np0Pnutw; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="np0Pnutw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 33CB1C433C7; Wed, 13 Mar 2024 01:55:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294908; bh=ULDR20Ykff54fhYfpobMhWNSMo6EvfXDGbCgyJRqnqM=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=np0PnutwdtHnAq0nU6+Rj5sP/OgJBecPoOWf4Em2oMyEFtsz/JWNAKOsxqx1Wq+Xa Jp1LpgU2q/Kd9RbMDdXtlxRxufsQxbvTsO3GgMwVYNERPcF4aNXDHsy9Nu6P7siBIO Fkrof/gim28mOlYIra7U+T3ZUQz0NwZaZ6MBeHXF/T+cC4aSpw3cNli4h1JN0pYEIy rPkOwZjoJZfJDrZyLptH0hNwoP/Lni4Od7XOgrv6YIa4ROWOGZqpwe0Ou70zQUTe3s 2Yfe4iovnkDeM2WREWZhnvqza8ANAogiosuyQVm49G3/bVeRM4bC4QO0CgWjKQOkGS Axnk2FZwRIFPw== Date: Tue, 12 Mar 2024 18:55:07 -0700 Subject: [PATCH 08/67] xfs: clean out XFS_LI_DIRTY setting boilerplate from ->iop_relog From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431309.2061787.2680477533721748462.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 3e0958be2156d90ef908a1a547b4e27a3ec38da9 Hoist this dirty flag setting to the ->iop_relog callsite to reduce boilerplate. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 43117099cc4c..42e1c9c0c9a4 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -469,6 +469,8 @@ xfs_defer_relog( ASSERT((*tpp)->t_flags & XFS_TRANS_PERM_LOG_RES); list_for_each_entry(dfp, dfops, dfp_list) { + struct xfs_log_item *lip; + /* * If the log intent item for this deferred op is not a part of * the current log checkpoint, relog the intent item to keep @@ -497,9 +499,12 @@ xfs_defer_relog( XFS_STATS_INC((*tpp)->t_mountp, defer_relog); xfs_defer_create_done(*tpp, dfp); - dfp->dfp_intent = xfs_trans_item_relog(dfp->dfp_intent, - dfp->dfp_done, *tpp); + lip = xfs_trans_item_relog(dfp->dfp_intent, dfp->dfp_done, + *tpp); + if (lip) + set_bit(XFS_LI_DIRTY, &lip->li_flags); dfp->dfp_done = NULL; + dfp->dfp_intent = lip; } if ((*tpp)->t_flags & XFS_TRANS_DIRTY) From patchwork Wed Mar 13 01:55:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590846 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4133EB652 for ; Wed, 13 Mar 2024 01:55:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294924; cv=none; b=GWRQYq261QB9txoaTC+F4MX7TRf237jf3k7J6p2zKbmOEljLNGgVkRSu7G2nQ/ZeI0Q2Ox9UyNaOfW+3e8uiYwuOUj7Yueo1+jBs86/l/OCvisw8n3gghKTBp7QXaLzRtM3OZboX5xnLpTyNfkiDeGV6HAsJMoG4Inbn8+6bheQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294924; c=relaxed/simple; bh=1U8BZNIyDLQI5OgH0DiLBWrHi61hMBsv9+eFhYCjQbU=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VVb1Y4MVW9Zs88TTYHbLaaRweKWGbLBEVt4bE2jfrFAOkinlULwL6OLvd5NNrZBPzG5HePI8Ra7PTM89zaXhraSN8Ou5c8Qwl4epyW9akj3Dc6Ckhow3ocoMSg2iK7AZrSxPobHUr9r0E6EoMDDJE2ZOpgZvmgX9gd0uYe9PohY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B8Uwjppt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B8Uwjppt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C1E3AC433C7; Wed, 13 Mar 2024 01:55:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294923; bh=1U8BZNIyDLQI5OgH0DiLBWrHi61hMBsv9+eFhYCjQbU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=B8UwjpptTkRTSSmXrD4DYO6icikkax1LSGhduBx2GBGrmX2jrk/8VIcrom25ZLsPO n/2DdZ27VYR3sgMwaCa0WSIffc+PQweZI5pkO7XTNdavtwzdCZWTK09naXMdkT99Dp azlxkWlK6LXN+qP9GM+PHSp7l7Fcl1nbhm7TSgkUS1cdOXGhK+JKLKRDXHPXFq1cBo 7365v2tsVJ3W/O1v/AcUlK3BgW+2m1t9eMY5Dp8h4cWfiQe9yxmT/AY1/xVZOP6Dh3 zJZE2OF69NeOhNkCXRE2mUhMhXykQ6u1Mepkkgi4phyksSwsNX/MeHj2Uy8ITconlT YcJP/EoBnIVNw== Date: Tue, 12 Mar 2024 18:55:23 -0700 Subject: [PATCH 09/67] xfs: hoist xfs_trans_add_item calls to defer ops functions From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431323.2061787.1840599759257133605.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: b28852a5bd08654634e4e32eb072fba14c5fae26 Remove even more repeated boilerplate. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 42e1c9c0c9a4..27f9938a08d7 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -208,6 +208,7 @@ xfs_defer_create_done( return; tp->t_flags |= XFS_TRANS_HAS_INTENT_DONE; + xfs_trans_add_item(tp, lip); set_bit(XFS_LI_DIRTY, &lip->li_flags); dfp->dfp_done = lip; } @@ -236,6 +237,7 @@ xfs_defer_create_intent( return PTR_ERR(lip); tp->t_flags |= XFS_TRANS_DIRTY; + xfs_trans_add_item(tp, lip); set_bit(XFS_LI_DIRTY, &lip->li_flags); dfp->dfp_intent = lip; return 1; @@ -501,8 +503,10 @@ xfs_defer_relog( xfs_defer_create_done(*tpp, dfp); lip = xfs_trans_item_relog(dfp->dfp_intent, dfp->dfp_done, *tpp); - if (lip) + if (lip) { + xfs_trans_add_item(*tpp, lip); set_bit(XFS_LI_DIRTY, &lip->li_flags); + } dfp->dfp_done = NULL; dfp->dfp_intent = lip; } From patchwork Wed Mar 13 01:55:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590847 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8CA48AD56 for ; Wed, 13 Mar 2024 01:55:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294939; cv=none; b=kVOVDa4/92GwZ565HwLNy2wiV/ufwomwsooT8+TdDTSEHnPkiaUDfS9FvIvZNo4qWhn2TNN+VDKVoCHHilrDMWN/cyGt4DemAvToMf/CxPjtopbyXudEzE7IJ0L4wwUOpvlt+3EevF3nZUZt23JOCfhBpT1qgK8BXRb8Be/ar6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294939; c=relaxed/simple; bh=gH6S4iVUkHQMaI7BkVg4g63Fclo57M+u/vyUC1hPNi4=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ME4Huo/yTx5gg/L7O6cj06S0PibWJBO/yBx0rXE3Sk+YHARHYMl8MLxZw3m24b4q3You7llwFtjihxKD5ucf3vcpbVMpcvJxftiRBVSKpzPnOu/8nTtVcBgbycRq7WUOixiUS/2C7Ibw/AtEAMieU2staELldmZqrdMtLHVwXl0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=s03Rtulb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="s03Rtulb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A2C8C433F1; Wed, 13 Mar 2024 01:55:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294939; bh=gH6S4iVUkHQMaI7BkVg4g63Fclo57M+u/vyUC1hPNi4=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=s03RtulbjlmlL0i0TJ+casuy+C9s6Iag+1eSn2H3HocU18EBHyiVEdI6abU3hanWp WKdxubSSvtxrJL8PDjmI4Mfu6IgDwU/MESOH9YHndwZW7nFSSF/bc/vOZnqu4FSvlv DSoygfS7W9Hoo+AxHrFw6fV0MsHTSN7+Lr7CUPboNfVe42VcUQ/cLRH2BhLDj1Txtk +timGvEdHpgZViU9ElxkMbK/S6TmxCacgXO5Qi/KaAtIoIEftcFXQ4vQH4BB0YKikb hAldJ1V6gG7Nvr2cPP0VrGmSs6N9h+zo03FuwFdqW8kYzhf4psOAQDzSd/elnlZocT YnOuuY3+ard2A== Date: Tue, 12 Mar 2024 18:55:38 -0700 Subject: [PATCH 10/67] xfs: move ->iop_relog to struct xfs_defer_op_type From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431338.2061787.12147597650422174571.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: a49c708f9a445457f6a5905732081871234f61c6 The only log items that need relogging are the ones created for deferred work operations, and the only part of the code base that relogs log items is the deferred work machinery. Move the function pointers. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- include/xfs_trans.h | 1 - libxfs/xfs_defer.c | 31 ++++++++++++++++++++----------- libxfs/xfs_defer.h | 3 +++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/include/xfs_trans.h b/include/xfs_trans.h index ee250d521118..ab298ccfe556 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -158,7 +158,6 @@ libxfs_trans_read_buf( } #define xfs_log_item_in_current_chkpt(lip) (false) -#define xfs_trans_item_relog(lip, dontcare, tp) (NULL) /* Contorted mess to make gcc shut up about unused vars. */ #define xlog_grant_push_threshold(log, need) \ diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 27f9938a08d7..29ec0bd8138c 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -453,6 +453,25 @@ xfs_defer_cancel_list( xfs_defer_pending_cancel_work(mp, dfp); } +static inline void +xfs_defer_relog_intent( + struct xfs_trans *tp, + struct xfs_defer_pending *dfp) +{ + struct xfs_log_item *lip; + const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + + xfs_defer_create_done(tp, dfp); + + lip = ops->relog_intent(tp, dfp->dfp_intent, dfp->dfp_done); + if (lip) { + xfs_trans_add_item(tp, lip); + set_bit(XFS_LI_DIRTY, &lip->li_flags); + } + dfp->dfp_done = NULL; + dfp->dfp_intent = lip; +} + /* * Prevent a log intent item from pinning the tail of the log by logging a * done item to release the intent item; and then log a new intent item. @@ -471,8 +490,6 @@ xfs_defer_relog( ASSERT((*tpp)->t_flags & XFS_TRANS_PERM_LOG_RES); list_for_each_entry(dfp, dfops, dfp_list) { - struct xfs_log_item *lip; - /* * If the log intent item for this deferred op is not a part of * the current log checkpoint, relog the intent item to keep @@ -500,15 +517,7 @@ xfs_defer_relog( trace_xfs_defer_relog_intent((*tpp)->t_mountp, dfp); XFS_STATS_INC((*tpp)->t_mountp, defer_relog); - xfs_defer_create_done(*tpp, dfp); - lip = xfs_trans_item_relog(dfp->dfp_intent, dfp->dfp_done, - *tpp); - if (lip) { - xfs_trans_add_item(*tpp, lip); - set_bit(XFS_LI_DIRTY, &lip->li_flags); - } - dfp->dfp_done = NULL; - dfp->dfp_intent = lip; + xfs_defer_relog_intent(*tpp, dfp); } if ((*tpp)->t_flags & XFS_TRANS_DIRTY) diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index ef86a7f9b059..78d6dcd1af2c 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -59,6 +59,9 @@ struct xfs_defer_op_type { void (*cancel_item)(struct list_head *item); int (*recover_work)(struct xfs_defer_pending *dfp, struct list_head *capture_list); + struct xfs_log_item *(*relog_intent)(struct xfs_trans *tp, + struct xfs_log_item *intent, + struct xfs_log_item *done_item); unsigned int max_items; }; From patchwork Wed Mar 13 01:55:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590848 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 83330BA27 for ; Wed, 13 Mar 2024 01:55:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294955; cv=none; b=K5+k6vXveZAQInSLiz5//dmhpf6kwo+eJrQ9kSscoi1vVRNdkpc8FqMGIQSjcBMj0TScnPDxjG2C9v3n012xv3llV5l/qDqtsAkEQAn9dZmYYCb9opliqOp2ar5x2st2rJMziH82RSqYgWGBx8E1E1DgmIezif/oUh5cP1EqZKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294955; c=relaxed/simple; bh=d6rTUXZ7kYypfJwsm08JPTYHdJ+3X27YwWjSsS0Iz2g=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OdOnDPnwwNVWfCV911y7rJf3Rhm0StqRvKBKbH4MbjtcvEpYWFfr3C9i3lkCAXkdc8SjyvPbIxWVK58J9PfIsxSe4GT0JQyAuI7nIEc8ApMSf328kr0kFjJfVT2TqSb6yD3uCcXOpGniPUMNErU0F08e3YKsIJYA6ZMmfRMMFzs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l+rvIx9s; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="l+rvIx9s" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0DB93C433C7; Wed, 13 Mar 2024 01:55:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294955; bh=d6rTUXZ7kYypfJwsm08JPTYHdJ+3X27YwWjSsS0Iz2g=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=l+rvIx9sfpjDoKr+0V9bcl7VOMSMvc3S9RY4Dd2xDC0vM0mLawAcPe8jnDSwB/zpT Op9Io6hpPP19+rvBoiK1DxBsbRcyASO/Ulvly7lGDiOdwiaKj/mK5CBnslMAgT+jMG fKKb4N3foXpv5X+5Dq6RiHWpJEUSyYCBBpHeNsDUZvvKrfZSOGIRLqgol6+ITyKEzR ln253HB2NOarVM8ZzpZYvGmjB5PQLDGHk53Vp1QWELOKenp9uOihPrSyjulXrjAq7Z AoxQkWRJLl67XVWfobkbGIhJriGVlNVZTUEUW+8nwSBT91WwIFv97e4lAHpEIxQ3bG MUgKqw8MW8L/A== Date: Tue, 12 Mar 2024 18:55:54 -0700 Subject: [PATCH 11/67] xfs: make rextslog computation consistent with mkfs From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431352.2061787.5103765620056600374.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: a6a38f309afc4a7ede01242b603f36c433997780 There's a weird discrepancy in xfsprogs dating back to the creation of the Linux port -- if there are zero rt extents, mkfs will set sb_rextents and sb_rextslog both to zero: sbp->sb_rextslog = (uint8_t)(rtextents ? libxfs_highbit32((unsigned int)rtextents) : 0); However, that's not the check that xfs_repair uses for nonzero rtblocks: if (sb->sb_rextslog != libxfs_highbit32((unsigned int)sb->sb_rextents)) The difference here is that xfs_highbit32 returns -1 if its argument is zero. Unfortunately, this means that in the weird corner case of a realtime volume shorter than 1 rt extent, xfs_repair will immediately flag a freshly formatted filesystem as corrupt. Because mkfs has been writing ondisk artifacts like this for decades, we have to accept that as "correct". TBH, zero rextslog for zero rtextents makes more sense to me anyway. Regrettably, the superblock verifier checks created in commit copied xfs_repair even though mkfs has been writing out such filesystems for ages. Fix the superblock verifier to accept what mkfs spits out; the userspace version of this patch will have to fix xfs_repair as well. Note that the new helper leaves the zeroday bug where the upper 32 bits of sb_rextents is ripped off and fed to highbit32. This leads to a seriously undersized rt summary file, which immediately breaks mkfs: $ hugedisk.sh foo /dev/sdc $(( 0x100000080 * 4096))B $ /sbin/mkfs.xfs -f /dev/sda -m rmapbt=0,reflink=0 -r rtdev=/dev/mapper/foo meta-data=/dev/sda isize=512 agcount=4, agsize=1298176 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=0 bigtime=1 inobtcount=1 nrext64=1 data = bsize=4096 blocks=5192704, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=16384, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =/dev/mapper/foo extsz=4096 blocks=4294967424, rtextents=4294967424 Discarding blocks...Done. mkfs.xfs: Error initializing the realtime space [117 - Structure needs cleaning] The next patch will drop support for rt volumes with fewer than 1 or more than 2^32-1 rt extents, since they've clearly been broken forever. Fixes: f8e566c0f5e1f ("xfs: validate the realtime geometry in xfs_validate_sb_common") Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_api_defs.h | 1 + libxfs/xfs_rtbitmap.c | 12 ++++++++++++ libxfs/xfs_rtbitmap.h | 3 +++ libxfs/xfs_sb.c | 3 ++- mkfs/xfs_mkfs.c | 3 +-- repair/sb.c | 3 +-- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index cee0df2479c5..1828e4773555 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -64,6 +64,7 @@ #define xfs_bunmapi libxfs_bunmapi #define xfs_bwrite libxfs_bwrite #define xfs_calc_dquots_per_chunk libxfs_calc_dquots_per_chunk +#define xfs_compute_rextslog libxfs_compute_rextslog #define xfs_da3_node_hdr_from_disk libxfs_da3_node_hdr_from_disk #define xfs_da_get_buf libxfs_da_get_buf #define xfs_da_hashname libxfs_da_hashname diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index fb083499070c..90fe9028887a 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -1128,6 +1128,18 @@ xfs_rtbitmap_blockcount( return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize); } +/* + * Compute the maximum level number of the realtime summary file, as defined by + * mkfs. The use of highbit32 on a 64-bit quantity is a historic artifact that + * prohibits correct use of rt volumes with more than 2^32 extents. + */ +uint8_t +xfs_compute_rextslog( + xfs_rtbxlen_t rtextents) +{ + return rtextents ? xfs_highbit32(rtextents) : 0; +} + /* * Compute the number of rtbitmap words needed to populate every block of a * bitmap that is large enough to track the given number of rt extents. diff --git a/libxfs/xfs_rtbitmap.h b/libxfs/xfs_rtbitmap.h index c0637057d69c..6e5bae324cc3 100644 --- a/libxfs/xfs_rtbitmap.h +++ b/libxfs/xfs_rtbitmap.h @@ -351,6 +351,8 @@ xfs_rtfree_extent( int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno, xfs_filblks_t rtlen); +uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents); + xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents); unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp, @@ -369,6 +371,7 @@ unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp, # define xfs_rtsummary_read_buf(a,b) (-ENOSYS) # define xfs_rtbuf_cache_relse(a) (0) # define xfs_rtalloc_extent_is_free(m,t,s,l,i) (-ENOSYS) +# define xfs_compute_rextslog(rtx) (0) static inline xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents) { diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 1ebdb7ec41f4..95a29bf1ffcf 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -23,6 +23,7 @@ #include "xfs_da_format.h" #include "xfs_health.h" #include "xfs_ag.h" +#include "xfs_rtbitmap.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -507,7 +508,7 @@ xfs_validate_sb_common( NBBY * sbp->sb_blocksize); if (sbp->sb_rextents != rexts || - sbp->sb_rextslog != xfs_highbit32(sbp->sb_rextents) || + sbp->sb_rextslog != xfs_compute_rextslog(rexts) || sbp->sb_rbmblocks != rbmblocks) { xfs_notice(mp, "realtime geometry sanity check failed"); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b8e2c0da60c4..abea61943652 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3699,8 +3699,7 @@ finish_superblock_setup( sbp->sb_agcount = (xfs_agnumber_t)cfg->agcount; sbp->sb_rbmblocks = cfg->rtbmblocks; sbp->sb_logblocks = (xfs_extlen_t)cfg->logblocks; - sbp->sb_rextslog = (uint8_t)(cfg->rtextents ? - libxfs_highbit32((unsigned int)cfg->rtextents) : 0); + sbp->sb_rextslog = libxfs_compute_rextslog(cfg->rtextents); sbp->sb_inprogress = 1; /* mkfs is in progress */ sbp->sb_imax_pct = cfg->imaxpct; sbp->sb_icount = 0; diff --git a/repair/sb.c b/repair/sb.c index dedac53afe7d..384840db1cec 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -475,8 +475,7 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) if (sb->sb_rblocks / sb->sb_rextsize != sb->sb_rextents) return(XR_BAD_RT_GEO_DATA); - if (sb->sb_rextslog != - libxfs_highbit32((unsigned int)sb->sb_rextents)) + if (sb->sb_rextslog != libxfs_compute_rextslog(sb->sb_rextents)) return(XR_BAD_RT_GEO_DATA); if (sb->sb_rbmblocks != (xfs_extlen_t) howmany(sb->sb_rextents, From patchwork Wed Mar 13 01:56:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590849 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D01F9BA27 for ; Wed, 13 Mar 2024 01:56:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294970; cv=none; b=d5RXDufp/Jr16K48WELhq6sSjfNIEbutWmBB7PEQzYprFZk6NG7Ab1DGsOnf7UllACflbc2sWJGmq0q04p7xA1NZ7gxpGLjHQx97/WwlJ6cSBcyN4xxzLEtJrF3PIxGCeLGu1vozS3+aabrhEFILUmBS53k55fL4/gxEZSO8r3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294970; c=relaxed/simple; bh=0rPbk7OJMq4jDSKbhm3gTtY055lgbARDxEhveyoU9pc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LGKLlAdOiYAOTSB1OBUulPl1CsmcUuJnNvqPyMANRZjwCIrlGKGL8vTDp4CyrAF0jJG6Z4I7tLHbUzK/EMXtJ4Bg+gHL1J3LnNhNqVlHNT8n4XGF3U5U/JL9bJUV/O/yhD6wYH6y5ngKplkcUvGyE8Bqn2nwVH+AkHrexsd/iq0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qmoifYB4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qmoifYB4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A73D3C433F1; Wed, 13 Mar 2024 01:56:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294970; bh=0rPbk7OJMq4jDSKbhm3gTtY055lgbARDxEhveyoU9pc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=qmoifYB49xwlT86xa1yBmEGXyX9BygDqMCSEGl2iNBddBbWx/6jMm8vm1mA1ghvkM eSzG1BI7pdgKJB5oEXJ/gJND9SstkYmBo68ZkCgW98fxKydyP9bXXa7BR0MAa5yCnI tCraqsSRBH/J7W+NH1CQ0RuuWfemers3N8Wu9nLKe12lPIAlzXhTPawq9h+1rLQCGs et7X5R5lxS5xiMMk10vV+vHXd5DfE50vE9cegdSkEGSIKr0P0GhLbOVFUVCkC0HMLt 7hNmE3UdIipTRO/ohip5UF/W6zsPMt/23fa0B3KvkadczaIgo8Lhpm/X+7RagL5D6N d51nxwg+mGcEQ== Date: Tue, 12 Mar 2024 18:56:10 -0700 Subject: [PATCH 12/67] xfs: fix 32-bit truncation in xfs_compute_rextslog From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431366.2061787.13530390174806825113.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: cf8f0e6c1429be7652869059ea44696b72d5b726 It's quite reasonable that some customer somewhere will want to configure a realtime volume with more than 2^32 extents. If they try to do this, the highbit32() call will truncate the upper bits of the xfs_rtbxlen_t and produce the wrong value for rextslog. This in turn causes the rsumlevels to be wrong, which results in a realtime summary file that is the wrong length. Fix that. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_rtbitmap.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index 90fe9028887a..726543abb51a 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -1130,14 +1130,16 @@ xfs_rtbitmap_blockcount( /* * Compute the maximum level number of the realtime summary file, as defined by - * mkfs. The use of highbit32 on a 64-bit quantity is a historic artifact that - * prohibits correct use of rt volumes with more than 2^32 extents. + * mkfs. The historic use of highbit32 on a 64-bit quantity prohibited correct + * use of rt volumes with more than 2^32 extents. */ uint8_t xfs_compute_rextslog( xfs_rtbxlen_t rtextents) { - return rtextents ? xfs_highbit32(rtextents) : 0; + if (!rtextents) + return 0; + return xfs_highbit64(rtextents); } /* From patchwork Wed Mar 13 01:56:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590850 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75E9BA951 for ; Wed, 13 Mar 2024 01:56:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294986; cv=none; b=KUuSZBNlhFWFS0RQ0fv/AZBgVQJ7DAb53rym63zsgKe4sAzPVzMOT1Mb3qGDCk15ORCCk9XDl588C+8SK5HxbDeN0Fty+CrRw7Rv1hhDgczsfgNZr0SXsGC7qgWsETEyGqorp+jMrmWI/T+W55gTk252KRCBfGPTVumqWvzeENU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710294986; c=relaxed/simple; bh=j7UrZa465552QqaDf/RE5Srf5uO1u55tvH34Dph8SVA=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P+omlV9Gle+Je8cnWjpPhGIY49isi0Q5CakDujuTTzxac6BVpY2P7u/nw8Mu44VNEmRMSecd6dNg2pO/EH6kQ8TzIeUXpbamUpb4ZETD47+B+fMxe3w2OXdyZ+QE8222LAd/5CGRxz0LsSbnzXbI3vlLNT6OKYUHZrkCtw4Ic44= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iKPcAWMy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="iKPcAWMy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 50238C433C7; Wed, 13 Mar 2024 01:56:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710294986; bh=j7UrZa465552QqaDf/RE5Srf5uO1u55tvH34Dph8SVA=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=iKPcAWMyLGE/yq6/JkSWaIJBDZJXt3GoIRCNMavicHgKYUnRvMwaa319LDNyR7qZs HDGbvrNvFQTRT3Cx2PKmg4tkdRIWArrSlT0b4yX4OMHi88FFLvysZBweKLX/gVijkk cRrfICI80+Dx3a1Cq91on3qns3VANiMDrfTYvcpBfZ3UslCU4rGRNSszhspbukn6Vm svdkQicGhJB+zgGGa0QgtG8QKjBs8rVFtps9GHHCORmYC49+6RyDJxhPO6aMrCC4xt 3PItsv1d3HMhZvTCPWULOEm0bUw9kyMP7brHg+A6Ig81tW31qEuDYyURvkquxgKYmq jXlAhiR0P4BRg== Date: Tue, 12 Mar 2024 18:56:25 -0700 Subject: [PATCH 13/67] xfs: don't allow overly small or large realtime volumes From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431381.2061787.16982684933003745809.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e14293803f4e84eb23a417b462b56251033b5a66 Don't allow realtime volumes that are less than one rt extent long. This has been broken across 4 LTS kernels with nobody noticing, so let's just disable it. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_rtbitmap.h | 13 +++++++++++++ libxfs/xfs_sb.c | 3 ++- mkfs/xfs_mkfs.c | 5 +++++ repair/sb.c | 3 +++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_rtbitmap.h b/libxfs/xfs_rtbitmap.h index 6e5bae324cc3..1c84b52de3d4 100644 --- a/libxfs/xfs_rtbitmap.h +++ b/libxfs/xfs_rtbitmap.h @@ -353,6 +353,18 @@ int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno, uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents); +/* Do we support an rt volume having this number of rtextents? */ +static inline bool +xfs_validate_rtextents( + xfs_rtbxlen_t rtextents) +{ + /* No runt rt volumes */ + if (rtextents == 0) + return false; + + return true; +} + xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents); unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp, @@ -372,6 +384,7 @@ unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp, # define xfs_rtbuf_cache_relse(a) (0) # define xfs_rtalloc_extent_is_free(m,t,s,l,i) (-ENOSYS) # define xfs_compute_rextslog(rtx) (0) +# define xfs_validate_rtextents(rtx) (false) static inline xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents) { diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 95a29bf1ffcf..7a72d5a17910 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -507,7 +507,8 @@ xfs_validate_sb_common( rbmblocks = howmany_64(sbp->sb_rextents, NBBY * sbp->sb_blocksize); - if (sbp->sb_rextents != rexts || + if (!xfs_validate_rtextents(rexts) || + sbp->sb_rextents != rexts || sbp->sb_rextslog != xfs_compute_rextslog(rexts) || sbp->sb_rbmblocks != rbmblocks) { xfs_notice(mp, diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index abea61943652..1a0a71dbec78 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3025,6 +3025,11 @@ reported by the device (%u).\n"), } cfg->rtextents = cfg->rtblocks / cfg->rtextblocks; + if (cfg->rtextents == 0) { + fprintf(stderr, +_("cannot have an rt subvolume with zero extents\n")); + usage(); + } cfg->rtbmblocks = (xfs_extlen_t)howmany(cfg->rtextents, NBBY * cfg->blocksize); } diff --git a/repair/sb.c b/repair/sb.c index 384840db1cec..faf79d9d0835 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -475,6 +475,9 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) if (sb->sb_rblocks / sb->sb_rextsize != sb->sb_rextents) return(XR_BAD_RT_GEO_DATA); + if (sb->sb_rextents == 0) + return XR_BAD_RT_GEO_DATA; + if (sb->sb_rextslog != libxfs_compute_rextslog(sb->sb_rextents)) return(XR_BAD_RT_GEO_DATA); From patchwork Wed Mar 13 01:56:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590854 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1BB83A951 for ; Wed, 13 Mar 2024 01:56:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295002; cv=none; b=ncVtyojCDQWumFRJM/7GP6UO1Zquip0yOtpZQtOFA5hOqnTfwFaqHaB4zksWSrFYxNfZiT2iBbuve4D/mpe0RtV7HrRGIjIjC+pCNOETwc2kUx85S1wlFRA4KHETWc9k9Ft69l1u9MkNPLJWX6Vs5RA6HQc2rUROo4aYZvgztTo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295002; c=relaxed/simple; bh=j+TxrkHsBUaK3YnAm3ejQUNPa9VBFzrpfsfwi0/u0BI=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QLg8tgTc/I4vB7P0VYjlduFqDJigo8oEfuOcYOibBwec3imTfRYLkHRdpC4ieLHck1uXm5U1MZyJh9v+wWebJDJZJffIeaqi4QoldHrZc+Ph67JClsTeLNHSw1lSQZmfS2rm45x4rTV2kj3ftQ88zHknZW1YJ4pX2pvF2rTbJbg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cCWqaiQM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cCWqaiQM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E3300C433C7; Wed, 13 Mar 2024 01:56:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295001; bh=j+TxrkHsBUaK3YnAm3ejQUNPa9VBFzrpfsfwi0/u0BI=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=cCWqaiQMGZL8OmwLIGRK8TOUipgd+P0juViz50uzyLkTs+fw9QsEqY+wtsBgIR7xM lnsUPzDz9jDExt6gVAEeF/1K643eTop+BNSQLDdV4XfspMTef0NzVrBWe2qG+G0FQ/ +aF5dUSRzA6ClJ7cw1/OJghvE5huqCcHGJJX1WmUkDykbfMB2fO6VguECDh5wuzO31 BsvbNVYEyhB1vnGD37NiSLnHACi/MhMHi+Kr2mAYbjgGYKU75f87qezUPnrTSIMoHF xBqdaFgTrrwAy0IYhjrHhkqBK0ftQJws9MyFEBJ/I81jPIXJ1ZR0aTy11qugRuM5tb NFCY/udciTAIw== Date: Tue, 12 Mar 2024 18:56:41 -0700 Subject: [PATCH 14/67] xfs: elide ->create_done calls for unlogged deferred work From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431396.2061787.11287740887349817242.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 9c07bca793b4ff9f0b7871e2a928a1b28b8fa4e3 Extended attribute updates use the deferred work machinery to manage state across a chain of smaller transactions. All previous deferred work users have employed log intent items and log done items to manage restarting of interrupted operations, which means that ->create_intent sets dfp_intent to a log intent item and ->create_done uses that item to create a log intent done item. However, xattrs have used the INCOMPLETE flag to deal with the lack of recovery support for an interrupted transaction chain. Log items are optional if the xattr update caller didn't set XFS_DA_OP_LOGGED to require a restartable sequence. In other words, ->create_intent can return NULL to say that there's no log intent item. If that's the case, no log intent done item should be created. Clean up xfs_defer_create_done not to do this, so that the ->create_done functions don't have to check for non-null dfp_intent themselves. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 29ec0bd8138c..722ff6a77260 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -195,6 +195,10 @@ xfs_defer_create_done( const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; struct xfs_log_item *lip; + /* If there is no log intent item, there can be no log done item. */ + if (!dfp->dfp_intent) + return; + /* * Mark the transaction dirty, even on error. This ensures the * transaction is aborted, which: From patchwork Wed Mar 13 01:56:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590855 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC25BA951 for ; Wed, 13 Mar 2024 01:56:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295018; cv=none; b=fQdm90yWStlgKSwwcOXu64XTjzI2LIrP5jjhNdaAVni8NljeHC894SsresudiXT0YVV+LIBmC3vp0v+Nw+kroz2iqZMo6tAM7Bdzc5v7l4Q5jkgd7I/xEPQC6WMIiiPhWpRzMMYoCS1ZSr0NXciTQZLdqfzkiPU/plJUxbZT/3I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295018; c=relaxed/simple; bh=x60kTWrwiWrKwuOUKSTn4WQRZM5xaf6l0XjSk2K6B10=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=r5Q877n/AjoEcKNxblxqMAFBSLmMpL8caY35wnTDVbqKopns7P4trmE0gUDfJl/+CrOXyiM/cUNuxXFn9T+DCkNgqudIP0psVD4xi+WoVTc9tVYHehq0OUWOn8oZg04Zqtz04Okl0sxSYv7fdGCRT19sNhYnAqHiqLC11HVjO3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gQtWiZd/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gQtWiZd/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E5F6C433C7; Wed, 13 Mar 2024 01:56:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295017; bh=x60kTWrwiWrKwuOUKSTn4WQRZM5xaf6l0XjSk2K6B10=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=gQtWiZd/2q8IpIaMkmnoDWB0A+IrhCsYXRHM4G0jCtaL37FjugEuURkFJOu5XygHD twh8RzMnqWnUDQqzLjjGN3yCqi4RcF2Vshc6YlgMASvLxO7lzg4C8dqDeT1RLQXgc6 KwhFOwOIdw3326Qps2QRuMhBJEpMgCBBfW6ZC7RFjM3J2ZBHZ6dpXSftRoygWqdtK+ 3PH55EavUUUoa7hkqWuAQ6ytD8C1R9WJHvZppQ1WnVFZiTVUDsibLI6H/DjfUV1Fso Q11fTj0i6adYXaBAt1VwIu72RvHAPYMtzP7ZPP71Ggc2uuy6VDWf2MLOeqft9N3R6J HLzMVTVnlyQVQ== Date: Tue, 12 Mar 2024 18:56:57 -0700 Subject: [PATCH 15/67] xfs: don't append work items to logged xfs_defer_pending objects From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431410.2061787.16324925199920397381.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 6b126139401a2284402d7c38fe3168d5a26da41d When someone tries to add a deferred work item to xfs_defer_add, it will try to attach the work item to the most recently added xfs_defer_pending object attached to the transaction. However, it doesn't check if the pending object has a log intent item attached to it. This is incorrect behavior because we cannot add more work to an object that has already been committed to the ondisk log. Therefore, change the behavior not to append to pending items with a non null dfp_intent. In practice this has not been an issue because the only way xfs_defer_add gets called after log intent items have been the @dop_pending isolation in xfs_defer_finish_noroll protects the pending items that have already been logged. However, the next patch will add the ability to pause a deferred extent free object during online btree rebuilding, and any new extfree work items need to have their own pending event. While we're at it, hoist the predicate to its own static inline function for readability. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 61 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 722ff6a77260..200d1b300f95 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -689,6 +689,51 @@ xfs_defer_cancel( xfs_defer_cancel_list(mp, &tp->t_dfops); } +/* + * Return the last pending work item attached to this transaction if it matches + * the deferred op type. + */ +static inline struct xfs_defer_pending * +xfs_defer_find_last( + struct xfs_trans *tp, + enum xfs_defer_ops_type type, + const struct xfs_defer_op_type *ops) +{ + struct xfs_defer_pending *dfp = NULL; + + /* No dfops at all? */ + if (list_empty(&tp->t_dfops)) + return NULL; + + dfp = list_last_entry(&tp->t_dfops, struct xfs_defer_pending, + dfp_list); + + /* Wrong type? */ + if (dfp->dfp_type != type) + return NULL; + return dfp; +} + +/* + * Decide if we can add a deferred work item to the last dfops item attached + * to the transaction. + */ +static inline bool +xfs_defer_can_append( + struct xfs_defer_pending *dfp, + const struct xfs_defer_op_type *ops) +{ + /* Already logged? */ + if (dfp->dfp_intent) + return false; + + /* Already full? */ + if (ops->max_items && dfp->dfp_count >= ops->max_items) + return false; + + return true; +} + /* Add an item for later deferred processing. */ void xfs_defer_add( @@ -702,19 +747,9 @@ xfs_defer_add( ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); BUILD_BUG_ON(ARRAY_SIZE(defer_op_types) != XFS_DEFER_OPS_TYPE_MAX); - /* - * Add the item to a pending item at the end of the intake list. - * If the last pending item has the same type, reuse it. Else, - * create a new pending item at the end of the intake list. - */ - if (!list_empty(&tp->t_dfops)) { - dfp = list_last_entry(&tp->t_dfops, - struct xfs_defer_pending, dfp_list); - if (dfp->dfp_type != type || - (ops->max_items && dfp->dfp_count >= ops->max_items)) - dfp = NULL; - } - if (!dfp) { + dfp = xfs_defer_find_last(tp, type, ops); + if (!dfp || !xfs_defer_can_append(dfp, ops)) { + /* Create a new pending item at the end of the intake list. */ dfp = kmem_cache_zalloc(xfs_defer_pending_cache, GFP_NOFS | __GFP_NOFAIL); dfp->dfp_type = type; From patchwork Wed Mar 13 01:57:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590856 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D9F1A951 for ; Wed, 13 Mar 2024 01:57:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295033; cv=none; b=tswiBuzRvsd4gSsVm8E+0GuZgz9YB1ddOLVXxNNr6fJH9FoXV2+AnAPF26+yU32RH4mNM6dUsm4E7QTDhV7EbG6x5a+LEW79D8TGu5dI2QNGa6zVulFc+xitO7EZFTu/5SUvq3NS+mt8v12ZEzhXQzW3VMaMvDO7LrcXkL8SdO0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295033; c=relaxed/simple; bh=iEI3KXhz6iJhA5Cfrt065GPEn0MD9pk6XBHt7rhyKBY=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cC8Ytnkf5tb+NmWFWQc0a1dBvEAbKZ1C52MQu1GmcPI0VX03qnKMijzTLhggZorbaQyY6wusaPeRoGafcTYZd5IQgAMxfg6Mld4vQgtbtFY7kMf9K/Gz1tzq4aFON+Io11v9BwmjBlS2+5q6Cnuq5RKLHaSUXys3TtAva+mSfSE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MxfHPe2Q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MxfHPe2Q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D504C433F1; Wed, 13 Mar 2024 01:57:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295033; bh=iEI3KXhz6iJhA5Cfrt065GPEn0MD9pk6XBHt7rhyKBY=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=MxfHPe2QSNqPSnNWGuW0OafcLIn0bStGuzVf21+fvYkr4SCI5UUxMImVjXdZzjdWM gfZmz2kkcI9TKiGFqtRxe0HJjS4s17/MWF1OER53E2RIEY1XhQZOygFssKHwPy94MR hraHc/BgcExA2x3RWUpLdpjtdWJEIljAEtO/yqllJ/IwX3nrT4MdWp0GJZ1DnM08Hp 9ixHiGZTe/RxDM2loQhGASv1uIgntdbprA+eSptuaT2m1tnMi8PSPGaqJrfNF/MwrO hVpfUPdpQeo9SH0sLbtQQpgeI5WckTHEy2SQzSRiRjWdOXbFVGQT9qRqbtQRL+jN1g g2lqL5YrAqV5g== Date: Tue, 12 Mar 2024 18:57:12 -0700 Subject: [PATCH 16/67] xfs: allow pausing of pending deferred work items From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431424.2061787.15909912177332668645.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 4dffb2cbb4839fd6f9bbac0b3fd06cc9015cbb9b Traditionally, all pending deferred work attached to a transaction is finished when one of the xfs_defer_finish* functions is called. However, online repair wants to be able to allocate space for a new data structure, format a new metadata structure into the allocated space, and As a hedge against system crashes during repairs, we also want to log some EFI items for the allocated space speculatively, and cancel them if we elect to commit the new data structure. Therefore, introduce the idea of pausing a pending deferred work item. Log intent items are still created for paused items and relogged as necessary. However, paused items are pushed onto a side list before we start calling ->finish_item, and the whole list is reattach to the transaction afterwards. New work items are never attached to paused pending items. Modify xfs_defer_cancel to clean up pending deferred work items holding a log intent item but not a log intent done item, since that is now possible. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- include/list.h | 14 +++++++ include/xfs_trace.h | 3 ++ libxfs/xfs_defer.c | 97 +++++++++++++++++++++++++++++++++++++++++++++------ libxfs/xfs_defer.h | 17 ++++++++- 4 files changed, 117 insertions(+), 14 deletions(-) diff --git a/include/list.h b/include/list.h index e59cbd53734b..852a355aae08 100644 --- a/include/list.h +++ b/include/list.h @@ -152,6 +152,20 @@ static inline void list_splice_init(struct list_head *list, #define list_first_entry(ptr, type, member) \ list_entry((ptr)->next, type, member) +/** + * list_first_entry_or_null - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_head within the struct. + * + * Note that if the list is empty, it returns NULL. + */ +#define list_first_entry_or_null(ptr, type, member) ({ \ + struct list_head *head__ = (ptr); \ + struct list_head *pos__ = head__->next; \ + pos__ != head__ ? list_entry(pos__, type, member) : NULL; \ +}) + #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index c79a4bd74dcb..f172b61d6a55 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -228,6 +228,9 @@ #define trace_xfs_defer_finish_done(a,b) ((void) 0) #define trace_xfs_defer_cancel_list(a,b) ((void) 0) #define trace_xfs_defer_create_intent(a,b) ((void) 0) +#define trace_xfs_defer_isolate_paused(...) ((void) 0) +#define trace_xfs_defer_item_pause(...) ((void) 0) +#define trace_xfs_defer_item_unpause(...) ((void) 0) #define trace_xfs_bmap_free_defer(...) ((void) 0) #define trace_xfs_bmap_free_deferred(...) ((void) 0) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 200d1b300f95..58ad1881d49d 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -481,7 +481,7 @@ xfs_defer_relog_intent( * done item to release the intent item; and then log a new intent item. * The caller should provide a fresh transaction and roll it after we're done. */ -static int +static void xfs_defer_relog( struct xfs_trans **tpp, struct list_head *dfops) @@ -523,10 +523,6 @@ xfs_defer_relog( xfs_defer_relog_intent(*tpp, dfp); } - - if ((*tpp)->t_flags & XFS_TRANS_DIRTY) - return xfs_defer_trans_roll(tpp); - return 0; } /* @@ -582,6 +578,24 @@ xfs_defer_finish_one( return error; } +/* Move all paused deferred work from @tp to @paused_list. */ +static void +xfs_defer_isolate_paused( + struct xfs_trans *tp, + struct list_head *paused_list) +{ + struct xfs_defer_pending *dfp; + struct xfs_defer_pending *pli; + + list_for_each_entry_safe(dfp, pli, &tp->t_dfops, dfp_list) { + if (!(dfp->dfp_flags & XFS_DEFER_PAUSED)) + continue; + + list_move_tail(&dfp->dfp_list, paused_list); + trace_xfs_defer_isolate_paused(tp->t_mountp, dfp); + } +} + /* * Finish all the pending work. This involves logging intent items for * any work items that wandered in since the last transaction roll (if @@ -597,6 +611,7 @@ xfs_defer_finish_noroll( struct xfs_defer_pending *dfp = NULL; int error = 0; LIST_HEAD(dop_pending); + LIST_HEAD(dop_paused); ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); @@ -615,6 +630,8 @@ xfs_defer_finish_noroll( */ int has_intents = xfs_defer_create_intents(*tp); + xfs_defer_isolate_paused(*tp, &dop_paused); + list_splice_init(&(*tp)->t_dfops, &dop_pending); if (has_intents < 0) { @@ -627,22 +644,33 @@ xfs_defer_finish_noroll( goto out_shutdown; /* Relog intent items to keep the log moving. */ - error = xfs_defer_relog(tp, &dop_pending); - if (error) - goto out_shutdown; + xfs_defer_relog(tp, &dop_pending); + xfs_defer_relog(tp, &dop_paused); + + if ((*tp)->t_flags & XFS_TRANS_DIRTY) { + error = xfs_defer_trans_roll(tp); + if (error) + goto out_shutdown; + } } - dfp = list_first_entry(&dop_pending, struct xfs_defer_pending, - dfp_list); + dfp = list_first_entry_or_null(&dop_pending, + struct xfs_defer_pending, dfp_list); + if (!dfp) + break; error = xfs_defer_finish_one(*tp, dfp); if (error && error != -EAGAIN) goto out_shutdown; } + /* Requeue the paused items in the outgoing transaction. */ + list_splice_tail_init(&dop_paused, &(*tp)->t_dfops); + trace_xfs_defer_finish_done(*tp, _RET_IP_); return 0; out_shutdown: + list_splice_tail_init(&dop_paused, &dop_pending); xfs_defer_trans_abort(*tp, &dop_pending); xfs_force_shutdown((*tp)->t_mountp, SHUTDOWN_CORRUPT_INCORE); trace_xfs_defer_finish_error(*tp, error); @@ -655,6 +683,9 @@ int xfs_defer_finish( struct xfs_trans **tp) { +#ifdef DEBUG + struct xfs_defer_pending *dfp; +#endif int error; /* @@ -674,7 +705,10 @@ xfs_defer_finish( } /* Reset LOWMODE now that we've finished all the dfops. */ - ASSERT(list_empty(&(*tp)->t_dfops)); +#ifdef DEBUG + list_for_each_entry(dfp, &(*tp)->t_dfops, dfp_list) + ASSERT(dfp->dfp_flags & XFS_DEFER_PAUSED); +#endif (*tp)->t_flags &= ~XFS_TRANS_LOWMODE; return 0; } @@ -686,6 +720,7 @@ xfs_defer_cancel( struct xfs_mount *mp = tp->t_mountp; trace_xfs_defer_cancel(tp, _RET_IP_); + xfs_defer_trans_abort(tp, &tp->t_dfops); xfs_defer_cancel_list(mp, &tp->t_dfops); } @@ -727,6 +762,10 @@ xfs_defer_can_append( if (dfp->dfp_intent) return false; + /* Paused items cannot absorb more work */ + if (dfp->dfp_flags & XFS_DEFER_PAUSED) + return NULL; + /* Already full? */ if (ops->max_items && dfp->dfp_count >= ops->max_items) return false; @@ -735,7 +774,7 @@ xfs_defer_can_append( } /* Add an item for later deferred processing. */ -void +struct xfs_defer_pending * xfs_defer_add( struct xfs_trans *tp, enum xfs_defer_ops_type type, @@ -762,6 +801,7 @@ xfs_defer_add( xfs_defer_add_item(dfp, li); trace_xfs_defer_add_item(tp->t_mountp, dfp, li); + return dfp; } /* @@ -1087,3 +1127,36 @@ xfs_defer_destroy_item_caches(void) xfs_rmap_intent_destroy_cache(); xfs_defer_destroy_cache(); } + +/* + * Mark a deferred work item so that it will be requeued indefinitely without + * being finished. Caller must ensure there are no data dependencies on this + * work item in the meantime. + */ +void +xfs_defer_item_pause( + struct xfs_trans *tp, + struct xfs_defer_pending *dfp) +{ + ASSERT(!(dfp->dfp_flags & XFS_DEFER_PAUSED)); + + dfp->dfp_flags |= XFS_DEFER_PAUSED; + + trace_xfs_defer_item_pause(tp->t_mountp, dfp); +} + +/* + * Release a paused deferred work item so that it will be finished during the + * next transaction roll. + */ +void +xfs_defer_item_unpause( + struct xfs_trans *tp, + struct xfs_defer_pending *dfp) +{ + ASSERT(dfp->dfp_flags & XFS_DEFER_PAUSED); + + dfp->dfp_flags &= ~XFS_DEFER_PAUSED; + + trace_xfs_defer_item_unpause(tp->t_mountp, dfp); +} diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 78d6dcd1af2c..b0284154f4e0 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -34,11 +34,24 @@ struct xfs_defer_pending { struct xfs_log_item *dfp_intent; /* log intent item */ struct xfs_log_item *dfp_done; /* log done item */ unsigned int dfp_count; /* # extent items */ + unsigned int dfp_flags; enum xfs_defer_ops_type dfp_type; }; -void xfs_defer_add(struct xfs_trans *tp, enum xfs_defer_ops_type type, - struct list_head *h); +/* + * Create a log intent item for this deferred item, but don't actually finish + * the work. Caller must clear this before the final transaction commit. + */ +#define XFS_DEFER_PAUSED (1U << 0) + +#define XFS_DEFER_PENDING_STRINGS \ + { XFS_DEFER_PAUSED, "paused" } + +void xfs_defer_item_pause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); +void xfs_defer_item_unpause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); + +struct xfs_defer_pending *xfs_defer_add(struct xfs_trans *tp, + enum xfs_defer_ops_type type, struct list_head *h); int xfs_defer_finish_noroll(struct xfs_trans **tp); int xfs_defer_finish(struct xfs_trans **tp); int xfs_defer_finish_one(struct xfs_trans *tp, struct xfs_defer_pending *dfp); From patchwork Wed Mar 13 01:57:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590857 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E32E0A951 for ; Wed, 13 Mar 2024 01:57:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295049; cv=none; b=cb2+sLdBdHI64VngtPTvIPGTzqsTFZJHMj+azPF2xiOhxu/QAVYM2CkpbWAU9ArNod/Oh8DFTu091TZrleAXXMj3rASWlr4U0muwGqzfQwBCnr2CdDMIYIhDczRY0yZTjxBpHDRcpgpj4Iz0JJeeXJKKctW0Ruxdl0zbFoTLeko= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295049; c=relaxed/simple; bh=cS7OJpJHoDkdBrgAP/jm20wAQvoA9BpEMGEsrXMIY+M=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tbkqf5sPn2vIq9IvDQUh6Ub2FBOmzIrtHU6yJz4R6oNjomT6a3MPoXc0lewoOSsS1B4HIARGKaebV9MUOCYUftMeKrJ1QcNVSrcRCVH17iIdGh59mzQRTBssgbO4sRJymqXVM2t0UHe7m7WbZBG0Fp+E1KEv0pGB4FbtUuwLvcA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jJUd1IqE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jJUd1IqE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BEE8AC433F1; Wed, 13 Mar 2024 01:57:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295048; bh=cS7OJpJHoDkdBrgAP/jm20wAQvoA9BpEMGEsrXMIY+M=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=jJUd1IqE6MPp7wDkA6vaBKSoVZerU+1uY/mHijSGxmeHsGqcr705A240JRIDZhgBz O7dIL5OZ8nKGxY6AvqLPAq+qDBdOoihGTPntQSgVdC4+j7Gmj/kXUFOIH9ljgypNn2 CFpX7j6KehVTnesIPTQY1jnhaqMdxE1rdQ9a66IQ8P6F9aZTf6VV2jz50jMUBbLLYx NL1MUGw3W8nGoHrui9amgNvlxX25b6jUob3ncaEVOShfv23WsavJPezmnZp44pK8cB su8uAH485fMb19MKZlmtCHkmOvYIExjP1BZvf6FtAtbeHmh4fbELjowcFRVCWk8b2p BOPNM5c+cOR+Q== Date: Tue, 12 Mar 2024 18:57:28 -0700 Subject: [PATCH 17/67] xfs: remove __xfs_free_extent_later From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431439.2061787.18202538769819164762.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 4c88fef3af4a51c2cdba6a28237e98da4873e8dc xfs_free_extent_later is a trivial helper, so remove it to reduce the amount of thinking required to understand the deferred freeing interface. This will make it easier to introduce automatic reaping of speculative allocations in the next patch. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_ag.c | 2 +- libxfs/xfs_alloc.c | 2 +- libxfs/xfs_alloc.h | 14 +------------- libxfs/xfs_bmap.c | 4 ++-- libxfs/xfs_bmap_btree.c | 2 +- libxfs/xfs_ialloc.c | 5 +++-- libxfs/xfs_ialloc_btree.c | 2 +- libxfs/xfs_refcount.c | 6 +++--- libxfs/xfs_refcount_btree.c | 2 +- 9 files changed, 14 insertions(+), 25 deletions(-) diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c index ac34a1c233c2..bdb8a08bbea7 100644 --- a/libxfs/xfs_ag.c +++ b/libxfs/xfs_ag.c @@ -982,7 +982,7 @@ xfs_ag_shrink_space( if (err2 != -ENOSPC) goto resv_err; - err2 = __xfs_free_extent_later(*tpp, args.fsbno, delta, NULL, + err2 = xfs_free_extent_later(*tpp, args.fsbno, delta, NULL, XFS_AG_RESV_NONE, true); if (err2) goto resv_err; diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 7ac7c2f6cc4c..0a2404466f69 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2519,7 +2519,7 @@ xfs_defer_agfl_block( * The list is maintained sorted (by block number). */ int -__xfs_free_extent_later( +xfs_free_extent_later( struct xfs_trans *tp, xfs_fsblock_t bno, xfs_filblks_t len, diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 6bb8d295c321..6b95d1d8a853 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -231,7 +231,7 @@ xfs_buf_to_agfl_bno( return bp->b_addr; } -int __xfs_free_extent_later(struct xfs_trans *tp, xfs_fsblock_t bno, +int xfs_free_extent_later(struct xfs_trans *tp, xfs_fsblock_t bno, xfs_filblks_t len, const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type, bool skip_discard); @@ -256,18 +256,6 @@ void xfs_extent_free_get_group(struct xfs_mount *mp, #define XFS_EFI_ATTR_FORK (1U << 1) /* freeing attr fork block */ #define XFS_EFI_BMBT_BLOCK (1U << 2) /* freeing bmap btree block */ -static inline int -xfs_free_extent_later( - struct xfs_trans *tp, - xfs_fsblock_t bno, - xfs_filblks_t len, - const struct xfs_owner_info *oinfo, - enum xfs_ag_resv_type type) -{ - return __xfs_free_extent_later(tp, bno, len, oinfo, type, false); -} - - extern struct kmem_cache *xfs_extfree_item_cache; int __init xfs_extfree_intent_init_cache(void); diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 8fde0dc256f0..8c553d22c535 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -569,7 +569,7 @@ xfs_bmap_btree_to_extents( xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, whichfork); error = xfs_free_extent_later(cur->bc_tp, cbno, 1, &oinfo, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); if (error) return error; @@ -5212,7 +5212,7 @@ xfs_bmap_del_extent_real( if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) { xfs_refcount_decrease_extent(tp, del); } else { - error = __xfs_free_extent_later(tp, del->br_startblock, + error = xfs_free_extent_later(tp, del->br_startblock, del->br_blockcount, NULL, XFS_AG_RESV_NONE, ((bflags & XFS_BMAPI_NODISCARD) || diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 925cc153b209..c4d5c8a64747 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -270,7 +270,7 @@ xfs_bmbt_free_block( xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_ino.whichfork); error = xfs_free_extent_later(cur->bc_tp, fsbno, 1, &oinfo, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); if (error) return error; diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index a95675b1d3d0..14826280d46e 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1849,7 +1849,7 @@ xfs_difree_inode_chunk( return xfs_free_extent_later(tp, XFS_AGB_TO_FSB(mp, agno, sagbno), M_IGEO(mp)->ialloc_blks, &XFS_RMAP_OINFO_INODES, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); } /* holemask is only 16-bits (fits in an unsigned long) */ @@ -1895,7 +1895,8 @@ xfs_difree_inode_chunk( ASSERT(contigblk % mp->m_sb.sb_spino_align == 0); error = xfs_free_extent_later(tp, XFS_AGB_TO_FSB(mp, agno, agbno), contigblk, - &XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE); + &XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE, + false); if (error) return error; diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 0c5d7ba1ce72..593cb1fcc1d9 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -160,7 +160,7 @@ __xfs_inobt_free_block( xfs_inobt_mod_blockcount(cur, -1); fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)); return xfs_free_extent_later(cur->bc_tp, fsbno, 1, - &XFS_RMAP_OINFO_INOBT, resv); + &XFS_RMAP_OINFO_INOBT, resv, false); } STATIC int diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index ae72f25077ad..2284b45fbb04 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -1152,7 +1152,7 @@ xfs_refcount_adjust_extents( tmp.rc_startblock); error = xfs_free_extent_later(cur->bc_tp, fsbno, tmp.rc_blockcount, NULL, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); if (error) goto out_error; } @@ -1214,7 +1214,7 @@ xfs_refcount_adjust_extents( ext.rc_startblock); error = xfs_free_extent_later(cur->bc_tp, fsbno, ext.rc_blockcount, NULL, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); if (error) goto out_error; } @@ -1984,7 +1984,7 @@ xfs_refcount_recover_cow_leftovers( /* Free the block. */ error = xfs_free_extent_later(tp, fsb, rr->rr_rrec.rc_blockcount, NULL, - XFS_AG_RESV_NONE); + XFS_AG_RESV_NONE, false); if (error) goto out_trans; diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index 67cb59e33500..bc8bd867eee7 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -111,7 +111,7 @@ xfs_refcountbt_free_block( be32_add_cpu(&agf->agf_refcount_blocks, -1); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); return xfs_free_extent_later(cur->bc_tp, fsbno, 1, - &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA); + &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA, false); } STATIC int From patchwork Wed Mar 13 01:57:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590858 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A034B652 for ; Wed, 13 Mar 2024 01:57:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295064; cv=none; b=KawbDLXiOS3SoMV+bCnnvmuAv3XyY8R5RWH470TCxw4QjDXkvNiiwzQdsUePHrrgnSfIo9vFdhqrrvnrydluCZg7TKwm+oPZZOTmSoqdIdDAANPkzwEtHZiEWv1AstdW4FziS1oOFIFmQ+TjyFPP7s5ZZ15FjKu5SQok+mTlS9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295064; c=relaxed/simple; bh=ExvKZGrXxXA8E8ls91Mu31tKkoWSf0UyWmVkgxdnyTc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Hvwo9TxX/c85uu7D5t801jqiiwz3bvWt3Ok4DACJ2edoTYp6oYDnLgMvaQ83i8pombQKR6PKnlpxNC5QgKYUaKFp3Z/lRpNxTUU7QcjsHJ/ZMOcUyY5H9LEHuAHGyWNJD9f9ktqc/oAf/OoWQvlqiSUPiTkYSZjQmdbvWhaXnGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k0EEWGMp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="k0EEWGMp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5887FC433C7; Wed, 13 Mar 2024 01:57:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295064; bh=ExvKZGrXxXA8E8ls91Mu31tKkoWSf0UyWmVkgxdnyTc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=k0EEWGMpWRDG4EKqb8w5yn5CWIKLXPD9uGU3E/btvcUUZ8aT5xWVVIqfiU7E7M806 XagsCamU7MnC6t8Rt6p3+4VkW928hiCUVlDzrxL/chc3TEDt48uFNdQwnOA7JCIY/x XshxLSe5DKfWY5g5stCRL3Gus51JYjd/umGCVKFumKRgZTKiGoxaNU4oRcBwT4vukN 8YM19oZzORzbV1bmnJKA7mLpOOWo0w27eJMnyV8SHuCPHOQrDInUyAAeo2PKPMjeK4 gIbiC98UUq2bXMgdqN8VpkzxC8BEIGHl2YUJsPupHiq0/MtRKPgZf60gpcqjnjbwUa sRtSU815pnlJw== Date: Tue, 12 Mar 2024 18:57:43 -0700 Subject: [PATCH 18/67] xfs: automatic freeing of freshly allocated unwritten space From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431454.2061787.4416062787087228019.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e3042be36c343207b7af249a09f50b4e37e9fda4 As mentioned in the previous commit, online repair wants to allocate space to write out a new metadata structure, and it also wants to hedge against system crashes during repairs by logging (and later cancelling) EFIs to free the space if we crash before committing the new data structure. Therefore, create a trio of functions to schedule automatic reaping of freshly allocated unwritten space. xfs_alloc_schedule_autoreap creates a paused EFI representing the space we just allocated. Once the allocations are made and the autoreaps scheduled, we can start writing to disk. If the writes succeed, xfs_alloc_cancel_autoreap marks the EFI work items as stale and unpauses the pending deferred work item. Assuming that's done in the same transaction that commits the new structure into the filesystem, we guarantee that either the new object is fully visible, or that all the space gets reclaimed. If the writes succeed but only part of an extent was used, repair must call the same _cancel_autoreap function to kill the first EFI and then log a new EFI to free the unused space. The first EFI is already For full extents that aren't used, xfs_alloc_commit_autoreap will unpause the EFI, which results in the space being freed during the next _defer_finish cycle. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/defer_item.c | 10 +++-- libxfs/xfs_alloc.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++-- libxfs/xfs_alloc.h | 12 ++++++ 3 files changed, 119 insertions(+), 7 deletions(-) diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index 8731d1834be1..b8afda0ceb58 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -101,7 +101,7 @@ xfs_extent_free_finish_item( struct xfs_owner_info oinfo = { }; struct xfs_extent_free_item *xefi; xfs_agblock_t agbno; - int error; + int error = 0; xefi = container_of(item, struct xfs_extent_free_item, xefi_list); @@ -112,8 +112,12 @@ xfs_extent_free_finish_item( oinfo.oi_flags |= XFS_OWNER_INFO_BMBT_BLOCK; agbno = XFS_FSB_TO_AGBNO(tp->t_mountp, xefi->xefi_startblock); - error = xfs_free_extent(tp, xefi->xefi_pag, agbno, - xefi->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE); + + if (!(xefi->xefi_flags & XFS_EFI_CANCELLED)) { + error = xfs_free_extent(tp, xefi->xefi_pag, agbno, + xefi->xefi_blockcount, &oinfo, + XFS_AG_RESV_NONE); + } /* * Don't free the XEFI if we need a new transaction to complete diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 0a2404466f69..463381be7863 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2518,14 +2518,15 @@ xfs_defer_agfl_block( * Add the extent to the list of extents to be free at transaction end. * The list is maintained sorted (by block number). */ -int -xfs_free_extent_later( +static int +xfs_defer_extent_free( struct xfs_trans *tp, xfs_fsblock_t bno, xfs_filblks_t len, const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type, - bool skip_discard) + bool skip_discard, + struct xfs_defer_pending **dfpp) { struct xfs_extent_free_item *xefi; struct xfs_mount *mp = tp->t_mountp; @@ -2573,10 +2574,105 @@ xfs_free_extent_later( XFS_FSB_TO_AGBNO(tp->t_mountp, bno), len); xfs_extent_free_get_group(mp, xefi); - xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_FREE, &xefi->xefi_list); + *dfpp = xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_FREE, &xefi->xefi_list); return 0; } +int +xfs_free_extent_later( + struct xfs_trans *tp, + xfs_fsblock_t bno, + xfs_filblks_t len, + const struct xfs_owner_info *oinfo, + enum xfs_ag_resv_type type, + bool skip_discard) +{ + struct xfs_defer_pending *dontcare = NULL; + + return xfs_defer_extent_free(tp, bno, len, oinfo, type, skip_discard, + &dontcare); +} + +/* + * Set up automatic freeing of unwritten space in the filesystem. + * + * This function attached a paused deferred extent free item to the + * transaction. Pausing means that the EFI will be logged in the next + * transaction commit, but the pending EFI will not be finished until the + * pending item is unpaused. + * + * If the system goes down after the EFI has been persisted to the log but + * before the pending item is unpaused, log recovery will find the EFI, fail to + * find the EFD, and free the space. + * + * If the pending item is unpaused, the next transaction commit will log an EFD + * without freeing the space. + * + * Caller must ensure that the tp, fsbno, len, oinfo, and resv flags of the + * @args structure are set to the relevant values. + */ +int +xfs_alloc_schedule_autoreap( + const struct xfs_alloc_arg *args, + bool skip_discard, + struct xfs_alloc_autoreap *aarp) +{ + int error; + + error = xfs_defer_extent_free(args->tp, args->fsbno, args->len, + &args->oinfo, args->resv, skip_discard, &aarp->dfp); + if (error) + return error; + + xfs_defer_item_pause(args->tp, aarp->dfp); + return 0; +} + +/* + * Cancel automatic freeing of unwritten space in the filesystem. + * + * Earlier, we created a paused deferred extent free item and attached it to + * this transaction so that we could automatically roll back a new space + * allocation if the system went down. Now we want to cancel the paused work + * item by marking the EFI stale so we don't actually free the space, unpausing + * the pending item and logging an EFD. + * + * The caller generally should have already mapped the space into the ondisk + * filesystem. If the reserved space was partially used, the caller must call + * xfs_free_extent_later to create a new EFI to free the unused space. + */ +void +xfs_alloc_cancel_autoreap( + struct xfs_trans *tp, + struct xfs_alloc_autoreap *aarp) +{ + struct xfs_defer_pending *dfp = aarp->dfp; + struct xfs_extent_free_item *xefi; + + if (!dfp) + return; + + list_for_each_entry(xefi, &dfp->dfp_work, xefi_list) + xefi->xefi_flags |= XFS_EFI_CANCELLED; + + xfs_defer_item_unpause(tp, dfp); +} + +/* + * Commit automatic freeing of unwritten space in the filesystem. + * + * This unpauses an earlier _schedule_autoreap and commits to freeing the + * allocated space. Call this if none of the reserved space was used. + */ +void +xfs_alloc_commit_autoreap( + struct xfs_trans *tp, + struct xfs_alloc_autoreap *aarp) +{ + if (aarp->dfp) + xfs_defer_item_unpause(tp, aarp->dfp); +} + #ifdef DEBUG /* * Check if an AGF has a free extent record whose length is equal to diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 6b95d1d8a853..851cafbd6449 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -255,6 +255,18 @@ void xfs_extent_free_get_group(struct xfs_mount *mp, #define XFS_EFI_SKIP_DISCARD (1U << 0) /* don't issue discard */ #define XFS_EFI_ATTR_FORK (1U << 1) /* freeing attr fork block */ #define XFS_EFI_BMBT_BLOCK (1U << 2) /* freeing bmap btree block */ +#define XFS_EFI_CANCELLED (1U << 3) /* dont actually free the space */ + +struct xfs_alloc_autoreap { + struct xfs_defer_pending *dfp; +}; + +int xfs_alloc_schedule_autoreap(const struct xfs_alloc_arg *args, + bool skip_discard, struct xfs_alloc_autoreap *aarp); +void xfs_alloc_cancel_autoreap(struct xfs_trans *tp, + struct xfs_alloc_autoreap *aarp); +void xfs_alloc_commit_autoreap(struct xfs_trans *tp, + struct xfs_alloc_autoreap *aarp); extern struct kmem_cache *xfs_extfree_item_cache; From patchwork Wed Mar 13 01:57:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590859 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77834B652 for ; Wed, 13 Mar 2024 01:58:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295080; cv=none; b=pLwUoK4TPknTMgsspKXXMfsvQfHYYPn7VmAJpzpUUZGwlxkMZfITtz0JYf8VGOyTRJK02LsbX8HVTWMvAc85mQyY5pBU8YElwbvFoYQoFnU5GFCiPGF3NWWMeYa2SqnCUcKGO9d7gtzP4R8+PHYG7cEnJ44veDk0WtUi/wqdYWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295080; c=relaxed/simple; bh=aBdg5Y2A6KNGas+M+i63ch27M76w/i1Bkgt+IYLn+LQ=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nDg5CH8Wj2sekUU5u4Yh6ZD+woi90P6vxppQt1150c6SlgchkHeHXESDzEQXlrVIAwr0sy2NqgCZNtsIdM4cUGpRBTZa6AD+TKA1e9h6HMd2ViajD+rVvnUbnThwAiDayRNWR1ytIItn0VDhLmNRrIfKDX59l78oY67bnTpWPKI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QHhN82aD; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QHhN82aD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 07A7BC433F1; Wed, 13 Mar 2024 01:58:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295080; bh=aBdg5Y2A6KNGas+M+i63ch27M76w/i1Bkgt+IYLn+LQ=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=QHhN82aDx4vSITyi2mBKHHXR9NTbzmpZelYzuoqBFdmbVvq+AVLg498W9n2yFBzGN OfZsakRUqtTr+sZrttp+49oUp52C5iElisHXitJWjIyl9HBvC1Lpr2vmdcF2iBlh7M RDt+6WhKwdpCQug08Gggvq5YKEojTXoiGphgH6K6KcKpTSCaO54+Hv3B0LPVq0ZK38 Q7hmlwosTqCS5T2Sw3SRVDAFY440PL9U1YZWUyenyLom0kSRjoD+kICvof7pU/6GxS uRCBsehe1PkD0B/MVhmW6Ok98q1vMSOPhIutiz7Ll+BxuKbXVpmf5pXysppJ7r9vPu yNvHz9Qw1NPHA== Date: Tue, 12 Mar 2024 18:57:59 -0700 Subject: [PATCH 19/67] xfs: remove unused fields from struct xbtree_ifakeroot From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , linux-xfs@vger.kernel.org Message-ID: <171029431468.2061787.8852752644725960285.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 4c8ecd1cfdd01fb727121035014d9f654a30bdf2 Remove these unused fields since nobody uses them. They should have been removed years ago in a different cleanup series from Christoph Hellwig. Fixes: daf83964a3681 ("xfs: move the per-fork nextents fields into struct xfs_ifork") Fixes: f7e67b20ecbbc ("xfs: move the fork format fields into struct xfs_ifork") Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner --- libxfs/xfs_btree_staging.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libxfs/xfs_btree_staging.h b/libxfs/xfs_btree_staging.h index f0d2976050ae..5f638f711246 100644 --- a/libxfs/xfs_btree_staging.h +++ b/libxfs/xfs_btree_staging.h @@ -37,12 +37,6 @@ struct xbtree_ifakeroot { /* Number of bytes available for this fork in the inode. */ unsigned int if_fork_size; - - /* Fork format. */ - unsigned int if_format; - - /* Number of records. */ - unsigned int if_extents; }; /* Cursor interactions with fake roots for inode-rooted btrees. */ From patchwork Wed Mar 13 01:58:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590860 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E23AB652 for ; Wed, 13 Mar 2024 01:58:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295096; cv=none; b=h5EktfA0OcmsEMgcM2XLVnJ1L1c6pwBlnPtLOXxuDjK/k0GBvKQspQS+3mRwq9o9y+6NMPfveUzQi8T3of3z4haEg4E352e1BAOP6zp8Fn0PC1rGULIQ5XhyFAlMNQa/VqwNxG+tOtQRok0rSj4PbiRqNDBoxe78Y44fjsG8mMA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295096; c=relaxed/simple; bh=rp6MWCNXkzzcqRRwmckQAGp17rGX/eaueHiZ6lwgmuw=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aqnS1tbpJfbwURGKHHjH2fpgYW4a4HekNC0lHXMdUJTjEWCImrg4PCFXaJ4HRIvq5ivoyVJfCrUXIqPqGjydej9A50U24LQvPOa8q/Hpmps55o8wnpDSb8GfQTqRbjBY6hb29NBOJ0xUAZjL+tOM59hKSwjKTRF2PELt4G9uBdM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gqEfKOGG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gqEfKOGG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A647EC433C7; Wed, 13 Mar 2024 01:58:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295095; bh=rp6MWCNXkzzcqRRwmckQAGp17rGX/eaueHiZ6lwgmuw=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=gqEfKOGG4c6yVp4+oXVfgXzkEvs1XaIYiAox+F3YtV+gkq2A2CapWpy8oKCRtcCjY yNEaF2+Qbh5CnHpk/p3rWxZXyJR5gqTpyreYViaykYf0YfuPNxNUXsO6RyRPXyO9+h GAvmxCOC6ufrS+Xe+33XPwcgDM35xsxI3b65IvStKwoBFnEzpFrPGz+yCI18kL3ez2 YJ9iycMiMSk4XDlYrGTeL+4TQ0okBEbsGnWqDODVmvjLwMkJrDP9qNrKI7cHO0R594 FtZXmCDfrmsvWh1ltdYNUI2cS1x5nfBuzubofwl924ePjjmuBJDQS4SOKIL22hNgUi z3u51QLW4Mbyg== Date: Tue, 12 Mar 2024 18:58:15 -0700 Subject: [PATCH 20/67] xfs: force small EFIs for reaping btree extents From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431482.2061787.17518246676608892825.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 3f3cec031099c37513727efc978a12b6346e326d Introduce the concept of a defer ops barrier to separate consecutively queued pending work items of the same type. With a barrier in place, the two work items will be tracked separately, and receive separate log intent items. The goal here is to prevent reaping of old metadata blocks from creating unnecessarily huge EFIs that could then run the risk of overflowing the scrub transaction. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_defer.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++----- libxfs/xfs_defer.h | 3 + 2 files changed, 99 insertions(+), 11 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 58ad1881d49d..98f1cbe6a67f 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -176,6 +176,58 @@ static struct kmem_cache *xfs_defer_pending_cache; * Note that the continuation requested between t2 and t3 is likely to * reoccur. */ +STATIC struct xfs_log_item * +xfs_defer_barrier_create_intent( + struct xfs_trans *tp, + struct list_head *items, + unsigned int count, + bool sort) +{ + return NULL; +} + +STATIC void +xfs_defer_barrier_abort_intent( + struct xfs_log_item *intent) +{ + /* empty */ +} + +STATIC struct xfs_log_item * +xfs_defer_barrier_create_done( + struct xfs_trans *tp, + struct xfs_log_item *intent, + unsigned int count) +{ + return NULL; +} + +STATIC int +xfs_defer_barrier_finish_item( + struct xfs_trans *tp, + struct xfs_log_item *done, + struct list_head *item, + struct xfs_btree_cur **state) +{ + ASSERT(0); + return -EFSCORRUPTED; +} + +STATIC void +xfs_defer_barrier_cancel_item( + struct list_head *item) +{ + ASSERT(0); +} + +static const struct xfs_defer_op_type xfs_barrier_defer_type = { + .max_items = 1, + .create_intent = xfs_defer_barrier_create_intent, + .abort_intent = xfs_defer_barrier_abort_intent, + .create_done = xfs_defer_barrier_create_done, + .finish_item = xfs_defer_barrier_finish_item, + .cancel_item = xfs_defer_barrier_cancel_item, +}; static const struct xfs_defer_op_type *defer_op_types[] = { [XFS_DEFER_OPS_TYPE_BMAP] = &xfs_bmap_update_defer_type, @@ -184,6 +236,7 @@ static const struct xfs_defer_op_type *defer_op_types[] = { [XFS_DEFER_OPS_TYPE_FREE] = &xfs_extent_free_defer_type, [XFS_DEFER_OPS_TYPE_AGFL_FREE] = &xfs_agfl_free_defer_type, [XFS_DEFER_OPS_TYPE_ATTR] = &xfs_attr_defer_type, + [XFS_DEFER_OPS_TYPE_BARRIER] = &xfs_barrier_defer_type, }; /* Create a log intent done item for a log intent item. */ @@ -773,6 +826,23 @@ xfs_defer_can_append( return true; } +/* Create a new pending item at the end of the transaction list. */ +static inline struct xfs_defer_pending * +xfs_defer_alloc( + struct xfs_trans *tp, + enum xfs_defer_ops_type type) +{ + struct xfs_defer_pending *dfp; + + dfp = kmem_cache_zalloc(xfs_defer_pending_cache, + GFP_NOFS | __GFP_NOFAIL); + dfp->dfp_type = type; + INIT_LIST_HEAD(&dfp->dfp_work); + list_add_tail(&dfp->dfp_list, &tp->t_dfops); + + return dfp; +} + /* Add an item for later deferred processing. */ struct xfs_defer_pending * xfs_defer_add( @@ -787,23 +857,38 @@ xfs_defer_add( BUILD_BUG_ON(ARRAY_SIZE(defer_op_types) != XFS_DEFER_OPS_TYPE_MAX); dfp = xfs_defer_find_last(tp, type, ops); - if (!dfp || !xfs_defer_can_append(dfp, ops)) { - /* Create a new pending item at the end of the intake list. */ - dfp = kmem_cache_zalloc(xfs_defer_pending_cache, - GFP_NOFS | __GFP_NOFAIL); - dfp->dfp_type = type; - dfp->dfp_intent = NULL; - dfp->dfp_done = NULL; - dfp->dfp_count = 0; - INIT_LIST_HEAD(&dfp->dfp_work); - list_add_tail(&dfp->dfp_list, &tp->t_dfops); - } + if (!dfp || !xfs_defer_can_append(dfp, ops)) + dfp = xfs_defer_alloc(tp, type); xfs_defer_add_item(dfp, li); trace_xfs_defer_add_item(tp->t_mountp, dfp, li); return dfp; } +/* + * Add a defer ops barrier to force two otherwise adjacent deferred work items + * to be tracked separately and have separate log items. + */ +void +xfs_defer_add_barrier( + struct xfs_trans *tp) +{ + struct xfs_defer_pending *dfp; + const enum xfs_defer_ops_type type = XFS_DEFER_OPS_TYPE_BARRIER; + const struct xfs_defer_op_type *ops = defer_op_types[type]; + + ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); + + /* If the last defer op added was a barrier, we're done. */ + dfp = xfs_defer_find_last(tp, type, ops); + if (dfp) + return; + + xfs_defer_alloc(tp, type); + + trace_xfs_defer_add_item(tp->t_mountp, dfp, NULL); +} + /* * Create a pending deferred work item to replay the recovered intent item * and add it to the list. diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index b0284154f4e0..5b1990ef3e5d 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -20,6 +20,7 @@ enum xfs_defer_ops_type { XFS_DEFER_OPS_TYPE_FREE, XFS_DEFER_OPS_TYPE_AGFL_FREE, XFS_DEFER_OPS_TYPE_ATTR, + XFS_DEFER_OPS_TYPE_BARRIER, XFS_DEFER_OPS_TYPE_MAX, }; @@ -163,4 +164,6 @@ xfs_defer_add_item( int __init xfs_defer_init_item_caches(void); void xfs_defer_destroy_item_caches(void); +void xfs_defer_add_barrier(struct xfs_trans *tp); + #endif /* __XFS_DEFER_H__ */ From patchwork Wed Mar 13 01:58:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590861 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79B99AD5D for ; Wed, 13 Mar 2024 01:58:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295111; cv=none; b=YtK0K3Z49WjYMm6R+v4ZFOB7wOY0Twdsqa90uDaV8lB0nVd5FfgfgmCiRpjk8mflWKYkoDuOAmlmj5I3ntlsdyUaX8vihQKratlDkT9XDvPbo7lJxZcuG+6maLWpBRdpRC+iLuKnLxLFifHxtzsrdgHmb7JRN+zS5mDvithMsu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295111; c=relaxed/simple; bh=qRsfs5LTKwOmVcoUgXZAdKpAFyPmrtTMpgjAMG3MQIc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Qo320YnWVxImPsWPLw3hAjKEqqebTVEt6/tr/sT53ESftHWSWlbdfil77b67Zy98CyOGje7DTZH+/h1CpIP78SbyDTdSQjhoz2Is6WsCqZjXv1hVgzJpMqb/p7RLwzqXC8WM6yT0nETZRUZXUdFRMaFZqQJ4MMMAqwpNRNPq4WQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qneId1Qa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qneId1Qa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53DC8C433F1; Wed, 13 Mar 2024 01:58:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295111; bh=qRsfs5LTKwOmVcoUgXZAdKpAFyPmrtTMpgjAMG3MQIc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=qneId1Qa/xIMcHg2jLJU5I/YdX5HXYidTzfHuehn4ZS+zEkmzRk+8fFZFB+G9OcW1 YaVZCU1M2rKK5xtjQfnYYZmo8YTK3yS3kAxRhvHEC4NrpFBV01zoSHq7+bmNHFT4UJ AgaESeLVqLqQO2K5okPAUCebjQWyTEQWQElEVXOwOGHX+4i249EmhgYDajOX+NCQLc 51wCaff3sv+l5UOFPtrGLzuTLk3FqVVnltIJRy7EeboKGSt09/I0kpOzEDvTB6vw1h DcOzTUz6OtPbNR9gRP1NgRoTHMClmbXG4kqY0SmmN386b3ybYm88tAD+8l2TDXRJoj ps4LTMAHnaL8Q== Date: Tue, 12 Mar 2024 18:58:30 -0700 Subject: [PATCH 21/67] xfs: ensure logflagsp is initialized in xfs_bmap_del_extent_real From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Jiachen Zhang , Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431497.2061787.7890780145330619670.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Jiachen Zhang Source kernel commit: e6af9c98cbf0164a619d95572136bfb54d482dd6 In the case of returning -ENOSPC, ensure logflagsp is initialized by 0. Otherwise the caller __xfs_bunmapi will set uninitialized illegal tmp_logflags value into xfs log, which might cause unpredictable error in the log recovery procedure. Also, remove the flags variable and set the *logflagsp directly, so that the code should be more robust in the long run. Fixes: 1b24b633aafe ("xfs: move some more code into xfs_bmap_del_extent_real") Signed-off-by: Jiachen Zhang Reviewed-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_bmap.c | 73 +++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 8c553d22c535..20ec22dfcaf4 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -5004,7 +5004,6 @@ xfs_bmap_del_extent_real( xfs_fileoff_t del_endoff; /* first offset past del */ int do_fx; /* free extent at end of routine */ int error; /* error return value */ - int flags = 0;/* inode logging flags */ struct xfs_bmbt_irec got; /* current extent entry */ xfs_fileoff_t got_endoff; /* first offset past got */ int i; /* temp state */ @@ -5017,6 +5016,8 @@ xfs_bmap_del_extent_real( uint32_t state = xfs_bmap_fork_to_state(whichfork); struct xfs_bmbt_irec old; + *logflagsp = 0; + mp = ip->i_mount; XFS_STATS_INC(mp, xs_del_exlist); @@ -5029,7 +5030,6 @@ xfs_bmap_del_extent_real( ASSERT(got_endoff >= del_endoff); ASSERT(!isnullstartblock(got.br_startblock)); qfield = 0; - error = 0; /* * If it's the case where the directory code is running with no block @@ -5045,13 +5045,13 @@ xfs_bmap_del_extent_real( del->br_startoff > got.br_startoff && del_endoff < got_endoff) return -ENOSPC; - flags = XFS_ILOG_CORE; + *logflagsp = XFS_ILOG_CORE; if (whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip)) { if (!(bflags & XFS_BMAPI_REMAP)) { error = xfs_rtfree_blocks(tp, del->br_startblock, del->br_blockcount); if (error) - goto done; + return error; } do_fx = 0; @@ -5066,11 +5066,9 @@ xfs_bmap_del_extent_real( if (cur) { error = xfs_bmbt_lookup_eq(cur, &got, &i); if (error) - goto done; - if (XFS_IS_CORRUPT(mp, i != 1)) { - error = -EFSCORRUPTED; - goto done; - } + return error; + if (XFS_IS_CORRUPT(mp, i != 1)) + return -EFSCORRUPTED; } if (got.br_startoff == del->br_startoff) @@ -5087,17 +5085,15 @@ xfs_bmap_del_extent_real( xfs_iext_prev(ifp, icur); ifp->if_nextents--; - flags |= XFS_ILOG_CORE; + *logflagsp |= XFS_ILOG_CORE; if (!cur) { - flags |= xfs_ilog_fext(whichfork); + *logflagsp |= xfs_ilog_fext(whichfork); break; } if ((error = xfs_btree_delete(cur, &i))) - goto done; - if (XFS_IS_CORRUPT(mp, i != 1)) { - error = -EFSCORRUPTED; - goto done; - } + return error; + if (XFS_IS_CORRUPT(mp, i != 1)) + return -EFSCORRUPTED; break; case BMAP_LEFT_FILLING: /* @@ -5108,12 +5104,12 @@ xfs_bmap_del_extent_real( got.br_blockcount -= del->br_blockcount; xfs_iext_update_extent(ip, state, icur, &got); if (!cur) { - flags |= xfs_ilog_fext(whichfork); + *logflagsp |= xfs_ilog_fext(whichfork); break; } error = xfs_bmbt_update(cur, &got); if (error) - goto done; + return error; break; case BMAP_RIGHT_FILLING: /* @@ -5122,12 +5118,12 @@ xfs_bmap_del_extent_real( got.br_blockcount -= del->br_blockcount; xfs_iext_update_extent(ip, state, icur, &got); if (!cur) { - flags |= xfs_ilog_fext(whichfork); + *logflagsp |= xfs_ilog_fext(whichfork); break; } error = xfs_bmbt_update(cur, &got); if (error) - goto done; + return error; break; case 0: /* @@ -5144,18 +5140,18 @@ xfs_bmap_del_extent_real( new.br_state = got.br_state; new.br_startblock = del_endblock; - flags |= XFS_ILOG_CORE; + *logflagsp |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_update(cur, &got); if (error) - goto done; + return error; error = xfs_btree_increment(cur, 0, &i); if (error) - goto done; + return error; cur->bc_rec.b = new; error = xfs_btree_insert(cur, &i); if (error && error != -ENOSPC) - goto done; + return error; /* * If get no-space back from btree insert, it tried a * split, and we have a zero block reservation. Fix up @@ -5168,33 +5164,28 @@ xfs_bmap_del_extent_real( */ error = xfs_bmbt_lookup_eq(cur, &got, &i); if (error) - goto done; - if (XFS_IS_CORRUPT(mp, i != 1)) { - error = -EFSCORRUPTED; - goto done; - } + return error; + if (XFS_IS_CORRUPT(mp, i != 1)) + return -EFSCORRUPTED; /* * Update the btree record back * to the original value. */ error = xfs_bmbt_update(cur, &old); if (error) - goto done; + return error; /* * Reset the extent record back * to the original value. */ xfs_iext_update_extent(ip, state, icur, &old); - flags = 0; - error = -ENOSPC; - goto done; - } - if (XFS_IS_CORRUPT(mp, i != 1)) { - error = -EFSCORRUPTED; - goto done; + *logflagsp = 0; + return -ENOSPC; } + if (XFS_IS_CORRUPT(mp, i != 1)) + return -EFSCORRUPTED; } else - flags |= xfs_ilog_fext(whichfork); + *logflagsp |= xfs_ilog_fext(whichfork); ifp->if_nextents++; xfs_iext_next(ifp, icur); @@ -5218,7 +5209,7 @@ xfs_bmap_del_extent_real( ((bflags & XFS_BMAPI_NODISCARD) || del->br_state == XFS_EXT_UNWRITTEN)); if (error) - goto done; + return error; } } @@ -5233,9 +5224,7 @@ xfs_bmap_del_extent_real( if (qfield && !(bflags & XFS_BMAPI_REMAP)) xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); -done: - *logflagsp = flags; - return error; + return 0; } /* From patchwork Wed Mar 13 01:58:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590862 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1458CAD21 for ; Wed, 13 Mar 2024 01:58:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295127; cv=none; b=q5t9aEm2nOV9oTOjKwQ8b+vnDtuvdo5lJQgJfOqYLy0IAbgIzjyso5SRDKNgE8Ox9l1h5HE6GHGzFpL6O+YiDH33LJLQkFv3UB9HkDSwe7nukxSP2cHMtqgCEwNzso8em0owvKAq9f6jMEtjH4w125/oB7tfW+5mNIbqFzh/juk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295127; c=relaxed/simple; bh=mXLCqqYMR8Etv2B/ClcJ5CA0MBbNgpoCEoSCy4aeHmU=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MSJQ/O0DNtTGaKK5isrzhyjxe9JKiMzP1TuJpUFvgmC3JCbR7C66oPUM3aeoF0nHrzLrveHhAtJWpm0JLN24UgugN5xkXX4HYqdXnY7i2FUt+f+m0GBGOhAch+JDPUpwNxNd+rhvnQj8Fu75od/LI4cXAPyRqInRaAYxDpq32bI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=K8T+pU/1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="K8T+pU/1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E4B73C433F1; Wed, 13 Mar 2024 01:58:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295126; bh=mXLCqqYMR8Etv2B/ClcJ5CA0MBbNgpoCEoSCy4aeHmU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=K8T+pU/1O+h9MTtnOUCYMLOaiyyj8SP3RMQ4eJxThTRCcxSXuiyPBoHRQvMM2Ykc8 5zwnbgTEAqZio+ZbjQmx2F+pTn/8PiWt2Ku50jgMfwW2d1dxrzWoiIlYxjpiWbljcT yPU2f1WyNHjiF8FGekZhRgAp6BtvO/gyqI43aypGNpht0kHcfex8Wvip2gmSTbcLXB VuvGR28B3+AnaSLdhMd7BkSONH5X5TlTXii/5u/BtjcFjfSz103kT7q4n/8oaj1IQK RqACNwDdhDzb1SP7hDa11QHli0rJKNs5UTXeVf1/y/0YMhkoTy+0HDdAkvDk+KWt/E IcIWFwGb39ReQ== Date: Tue, 12 Mar 2024 18:58:46 -0700 Subject: [PATCH 22/67] xfs: update dir3 leaf block metadata after swap From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Zhang Tianci , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431511.2061787.11942265269678902193.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Zhang Tianci Source kernel commit: 5759aa4f956034b289b0ae2c99daddfc775442e1 xfs_da3_swap_lastblock() copy the last block content to the dead block, but do not update the metadata in it. We need update some metadata for some kinds of type block, such as dir3 leafn block records its blkno, we shall update it to the dead block blkno. Otherwise, before write the xfs_buf to disk, the verify_write() will fail in blk_hdr->blkno != xfs_buf->b_bn, then xfs will be shutdown. We will get this warning: XFS (dm-0): Metadata corruption detected at xfs_dir3_leaf_verify+0xa8/0xe0 [xfs], xfs_dir3_leafn block 0x178 XFS (dm-0): Unmount and run xfs_repair XFS (dm-0): First 128 bytes of corrupted metadata buffer: 00000000e80f1917: 00 80 00 0b 00 80 00 07 3d ff 00 00 00 00 00 00 ........=....... 000000009604c005: 00 00 00 00 00 00 01 a0 00 00 00 00 00 00 00 00 ................ 000000006b6fb2bf: e4 44 e3 97 b5 64 44 41 8b 84 60 0e 50 43 d9 bf .D...dDA..`.PC.. 00000000678978a2: 00 00 00 00 00 00 00 83 01 73 00 93 00 00 00 00 .........s...... 00000000b28b247c: 99 29 1d 38 00 00 00 00 99 29 1d 40 00 00 00 00 .).8.....).@.... 000000002b2a662c: 99 29 1d 48 00 00 00 00 99 49 11 00 00 00 00 00 .).H.....I...... 00000000ea2ffbb8: 99 49 11 08 00 00 45 25 99 49 11 10 00 00 48 fe .I....E%.I....H. 0000000069e86440: 99 49 11 18 00 00 4c 6b 99 49 11 20 00 00 4d 97 .I....Lk.I. ..M. XFS (dm-0): xfs_do_force_shutdown(0x8) called from line 1423 of file fs/xfs/xfs_buf.c. Return address = 00000000c0ff63c1 XFS (dm-0): Corruption of in-memory data detected. Shutting down filesystem XFS (dm-0): Please umount the filesystem and rectify the problem(s) >From the log above, we know xfs_buf->b_no is 0x178, but the block's hdr record its blkno is 0x1a0. Fixes: 24df33b45ecf ("xfs: add CRC checking to dir2 leaf blocks") Signed-off-by: Zhang Tianci Suggested-by: Dave Chinner Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_da_btree.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index a068a0164363..3903486d19d2 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -2312,10 +2312,17 @@ xfs_da3_swap_lastblock( return error; /* * Copy the last block into the dead buffer and log it. + * On CRC-enabled file systems, also update the stamped in blkno. */ memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); + if (xfs_has_crc(mp)) { + struct xfs_da3_blkinfo *da3 = dead_buf->b_addr; + + da3->blkno = cpu_to_be64(xfs_buf_daddr(dead_buf)); + } xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); dead_info = dead_buf->b_addr; + /* * Get values from the moved block. */ From patchwork Wed Mar 13 01:59:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590863 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B863CAD56 for ; Wed, 13 Mar 2024 01:59:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295142; cv=none; b=JCIvdjQCFlrF1/I8zdKkOvrrIR3LRcoqq/ySEsv7+0yMCb5KSKYABap3bheNg737NMvgU8WB5rFyzBI1TOmTi4VPy4tCp9LpNi2WBKwHwFvyUzS/C4K//oLIM+062hTQ5eS7GpNz3TXz5mngzviKBFol7DzDqsRDlykiqPjhkWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295142; c=relaxed/simple; bh=ua0MbvxCgq7/m7JsKqBjFL2epmWna/Nze9ctiVvaNzo=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AYCdYI38h5glVVvpalr/CPXBwaOg3WpS43UmIi//7jADJjT7RznxxpdbbQiI2u/AOYg5888zuS/EMWbR6lwkA5kvbdLzyECSQv/8mbQVOZJuSq5RuCcHNBwd4G85Pzy5VO4pojUqPEo4PmzzzHk41NOcytDokPSWyIP1exXlbCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V4g5ct/W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="V4g5ct/W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 92407C433C7; Wed, 13 Mar 2024 01:59:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295142; bh=ua0MbvxCgq7/m7JsKqBjFL2epmWna/Nze9ctiVvaNzo=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=V4g5ct/WlHZtZso58X3jMqdOOdaLbf0FNVaKkU+oGTl+0DHifl/5XqTBT13r7uDeo mkims/SmrVdQlfwX0MXrhhcmthlKmM5R26Ie7Sorj6nvYk32Mrd1EGp2x+LYCtw5Hu wLLF+bC15Sjrw7O75etI4/tMvcDmKw7X7Vahq0IjvEK+49DXOdk1nhwhHh33R/3Pdb 4lzTTxTMhxkonHQjNcWynHfJeo/RBwrgRhPW9yiAVem5PPWtRTgWw+LVGjy7/aIIBP +08qJJZ7PqdTq+XSvda0fYqXNOay+ft2JfSEBfs4DNBsX0PE77j/nZt06wjO6UVK45 7YI0X41XJF3HA== Date: Tue, 12 Mar 2024 18:59:02 -0700 Subject: [PATCH 23/67] xfs: extract xfs_da_buf_copy() helper function From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Zhang Tianci , Christoph Hellwig , Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431525.2061787.10019730737431214980.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Zhang Tianci Source kernel commit: fd45ddb9dd606b3eaddf26e13f64340636955986 This patch does not modify logic. xfs_da_buf_copy() will copy one block from src xfs_buf to dst xfs_buf, and update the block metadata in dst directly. Signed-off-by: Zhang Tianci Suggested-by: Christoph Hellwig Reviewed-by: Christoph Hellwig Signed-off-by: Chandan Babu R --- libxfs/xfs_attr_leaf.c | 12 +++----- libxfs/xfs_da_btree.c | 74 +++++++++++++++++++----------------------------- libxfs/xfs_da_btree.h | 2 + 3 files changed, 36 insertions(+), 52 deletions(-) diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index ed81471ce066..baa168318f91 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -1241,14 +1241,10 @@ xfs_attr3_leaf_to_node( if (error) goto out; - /* copy leaf to new buffer, update identifiers */ - xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); - bp2->b_ops = bp1->b_ops; - memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); - if (xfs_has_crc(mp)) { - struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; - hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp2)); - } + /* + * Copy leaf to new buffer and log it. + */ + xfs_da_buf_copy(bp2, bp1, args->geo->blksize); xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); /* diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 3903486d19d2..0779bb6242ca 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -417,6 +417,25 @@ xfs_da3_node_read_mapped( return xfs_da3_node_set_type(tp, *bpp); } +/* + * Copy src directory/attr leaf/node buffer to the dst. + * For v5 file systems make sure the right blkno is stamped in. + */ +void +xfs_da_buf_copy( + struct xfs_buf *dst, + struct xfs_buf *src, + size_t size) +{ + struct xfs_da3_blkinfo *da3 = dst->b_addr; + + memcpy(dst->b_addr, src->b_addr, size); + dst->b_ops = src->b_ops; + xfs_trans_buf_copy_type(dst, src); + if (xfs_has_crc(dst->b_mount)) + da3->blkno = cpu_to_be64(xfs_buf_daddr(dst)); +} + /*======================================================================== * Routines used for growing the Btree. *========================================================================*/ @@ -686,12 +705,6 @@ xfs_da3_root_split( btree = icnodehdr.btree; size = (int)((char *)&btree[icnodehdr.count] - (char *)oldroot); level = icnodehdr.level; - - /* - * we are about to copy oldroot to bp, so set up the type - * of bp while we know exactly what it will be. - */ - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); } else { struct xfs_dir3_icleaf_hdr leafhdr; @@ -703,31 +716,17 @@ xfs_da3_root_split( size = (int)((char *)&leafhdr.ents[leafhdr.count] - (char *)leaf); level = 0; - - /* - * we are about to copy oldroot to bp, so set up the type - * of bp while we know exactly what it will be. - */ - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); } /* - * we can copy most of the information in the node from one block to - * another, but for CRC enabled headers we have to make sure that the - * block specific identifiers are kept intact. We update the buffer - * directly for this. + * Copy old root to new buffer and log it. */ - memcpy(node, oldroot, size); - if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || - oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - struct xfs_da3_intnode *node3 = (struct xfs_da3_intnode *)node; - - node3->hdr.info.blkno = cpu_to_be64(xfs_buf_daddr(bp)); - } + xfs_da_buf_copy(bp, blk1->bp, size); xfs_trans_log_buf(tp, bp, 0, size - 1); - bp->b_ops = blk1->bp->b_ops; - xfs_trans_buf_copy_type(bp, blk1->bp); + /* + * Update blk1 to point to new buffer. + */ blk1->bp = bp; blk1->blkno = blkno; @@ -1216,21 +1215,14 @@ xfs_da3_root_join( xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level); /* - * This could be copying a leaf back into the root block in the case of - * there only being a single leaf block left in the tree. Hence we have - * to update the b_ops pointer as well to match the buffer type change - * that could occur. For dir3 blocks we also need to update the block - * number in the buffer header. + * Copy child to root buffer and log it. */ - memcpy(root_blk->bp->b_addr, bp->b_addr, args->geo->blksize); - root_blk->bp->b_ops = bp->b_ops; - xfs_trans_buf_copy_type(root_blk->bp, bp); - if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { - struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; - da3->blkno = cpu_to_be64(xfs_buf_daddr(root_blk->bp)); - } + xfs_da_buf_copy(root_blk->bp, bp, args->geo->blksize); xfs_trans_log_buf(args->trans, root_blk->bp, 0, args->geo->blksize - 1); + /* + * Now we can drop the child buffer. + */ error = xfs_da_shrink_inode(args, child, bp); return error; } @@ -2312,14 +2304,8 @@ xfs_da3_swap_lastblock( return error; /* * Copy the last block into the dead buffer and log it. - * On CRC-enabled file systems, also update the stamped in blkno. */ - memcpy(dead_buf->b_addr, last_buf->b_addr, args->geo->blksize); - if (xfs_has_crc(mp)) { - struct xfs_da3_blkinfo *da3 = dead_buf->b_addr; - - da3->blkno = cpu_to_be64(xfs_buf_daddr(dead_buf)); - } + xfs_da_buf_copy(dead_buf, last_buf, args->geo->blksize); xfs_trans_log_buf(tp, dead_buf, 0, args->geo->blksize - 1); dead_info = dead_buf->b_addr; diff --git a/libxfs/xfs_da_btree.h b/libxfs/xfs_da_btree.h index ffa3df5b2893..706baf36e175 100644 --- a/libxfs/xfs_da_btree.h +++ b/libxfs/xfs_da_btree.h @@ -219,6 +219,8 @@ int xfs_da_reada_buf(struct xfs_inode *dp, xfs_dablk_t bno, const struct xfs_buf_ops *ops); int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, struct xfs_buf *dead_buf); +void xfs_da_buf_copy(struct xfs_buf *dst, struct xfs_buf *src, + size_t size); uint xfs_da_hashname(const uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, From patchwork Wed Mar 13 01:59:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590864 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2AB2DF5A for ; Wed, 13 Mar 2024 01:59:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295158; cv=none; b=Dfr9ZmV9+u43MFnPi9cWEuZxA+S8UZbqY1YsUswX+oGv3fd1a8ji2Pf1uRGJYpIX93GMYSAjYtfLUBUNNqRl3Du+2P6gAgMMKS63z0MEj7Wy9M878hwVRDsTdR6bWhPTaY4BDdEyNxA1Z3cQcjOQIaVRtHnBrWMenDBQFFK3cOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295158; c=relaxed/simple; bh=tWTxWz0/rkh0mQ2QzSnPu9RNdPOy111TvX5FWb7vE9c=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=npM138tcEeBpXuhx7Mq0EoLgTmmBP35DNZeHduX6nhWXl4IhQ2U/JK30RBcgKhFiEoMvjDVIF0smSMDb03U6Lw8WCV4M6iL98fD16jc1eJtPsltbVyn94Lhd0Cb14YPQkpmqtBDX63Dm/KxAPOlqeucgeY+2C25aYG1OHMyCPdo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZFT6B2zM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZFT6B2zM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 338C6C433C7; Wed, 13 Mar 2024 01:59:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295158; bh=tWTxWz0/rkh0mQ2QzSnPu9RNdPOy111TvX5FWb7vE9c=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=ZFT6B2zMK1KNawLsak0v/QVbTXKdlP6Jiuulmp9kZnBB3Fe7jYy53VOcABQSrh9Rq 2EASlYo6Nm/3JjQg/mnRrToEaOV4SooIJ7jy/8VZsIMK9XZEWRmfja6VvAw9QCj4v+ OdBIHcq891C9BO630ZqydFezvHNHEko48KmLzKMtUJ5ZO7X/RhdVSVpqRJs8MyEPrK Dj7mfo3VZzX7tAUCsHll777I5ujkmR4EjunpFMQrVmQZGaaVSby2mkiJVAoaaXcHfz iZRhW9d6x3pFRIjs+agqfpg6pPUST8qwonozE7HAP+0lwsJ/yepE3pa92IZLoSZ2qu 56yInH500dTvA== Date: Tue, 12 Mar 2024 18:59:17 -0700 Subject: [PATCH 24/67] xfs: move xfs_ondisk.h to libxfs/ From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Carlos Maiolino , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431540.2061787.8746966031228583492.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Move xfs_ondisk.h to libxfs so that we can do the struct sanity checks in userspace libxfs as well. This should allow us to retire the somewhat fragile xfs/122 test on xfstests. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Carlos Maiolino Signed-off-by: Chandan Babu R --- libxfs/init.c | 6 ++ libxfs/xfs_ondisk.h | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 libxfs/xfs_ondisk.h diff --git a/libxfs/init.c b/libxfs/init.c index c903d60707b7..1e035c48f57f 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -23,6 +23,11 @@ #include "xfs_refcount_btree.h" #include "libfrog/platform.h" +#include "xfs_format.h" +#include "xfs_da_format.h" +#include "xfs_log_format.h" +#include "xfs_ondisk.h" + #include "libxfs.h" /* for now */ #ifndef HAVE_LIBURCU_ATOMIC64 @@ -248,6 +253,7 @@ libxfs_close_devices( int libxfs_init(struct libxfs_init *a) { + xfs_check_ondisk_structs(); rcu_init(); rcu_register_thread(); radix_tree_init(); diff --git a/libxfs/xfs_ondisk.h b/libxfs/xfs_ondisk.h new file mode 100644 index 000000000000..d9c988c5ad69 --- /dev/null +++ b/libxfs/xfs_ondisk.h @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2016 Oracle. + * All Rights Reserved. + */ +#ifndef __XFS_ONDISK_H +#define __XFS_ONDISK_H + +#define XFS_CHECK_STRUCT_SIZE(structname, size) \ + static_assert(sizeof(structname) == (size), \ + "XFS: sizeof(" #structname ") is wrong, expected " #size) + +#define XFS_CHECK_OFFSET(structname, member, off) \ + static_assert(offsetof(structname, member) == (off), \ + "XFS: offsetof(" #structname ", " #member ") is wrong, " \ + "expected " #off) + +#define XFS_CHECK_VALUE(value, expected) \ + static_assert((value) == (expected), \ + "XFS: value of " #value " is wrong, expected " #expected) + +static inline void __init +xfs_check_ondisk_structs(void) +{ + /* ag/file structures */ + XFS_CHECK_STRUCT_SIZE(struct xfs_acl, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_acl_entry, 12); + XFS_CHECK_STRUCT_SIZE(struct xfs_agf, 224); + XFS_CHECK_STRUCT_SIZE(struct xfs_agfl, 36); + XFS_CHECK_STRUCT_SIZE(struct xfs_agi, 344); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block_shdr, 48); + XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block_lhdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72); + XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176); + XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104); + XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk, 136); + XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 264); + XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_refcount_key, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_refcount_rec, 12); + XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_key, 20); + XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_rec, 24); + XFS_CHECK_STRUCT_SIZE(xfs_timestamp_t, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_legacy_timestamp, 8); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_refcount_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_rmap_ptr_t, 4); + + /* dir/attr trees */ + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leaf_hdr, 80); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_leafblock, 80); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr3_rmt_hdr, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_blkinfo, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_intnode, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_da3_node_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_blk_hdr, 48); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_data_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_free_hdr, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_dir3_leaf_hdr, 64); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_hdr_t, 32); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_map_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_local_t, 4); + + /* realtime structures */ + XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw, 4); + XFS_CHECK_STRUCT_SIZE(union xfs_suminfo_raw, 4); + + /* + * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to + * 4 bytes anyway so it's not obviously a problem. Hence for the moment + * we don't check this structure. This can be re-instated when the attr + * definitions are updated to use c99 VLA definitions. + * + XFS_CHECK_STRUCT_SIZE(xfs_attr_leaf_name_remote_t, 12); + */ + + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, valuelen, 0); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, namelen, 2); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_local_t, nameval, 3); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valueblk, 0); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, valuelen, 4); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8); + XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9); + XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 32); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr_shortform, 4); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.totsize, 0); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.count, 2); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].namelen, 4); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].valuelen, 5); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].flags, 6); + XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].nameval, 7); + XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); + XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_da_node_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_free_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_data_hdr_t, 16); + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, freetag, 0); + XFS_CHECK_OFFSET(xfs_dir2_data_unused_t, length, 2); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_free_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_entry_t, 8); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_hdr_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_t, 16); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t, 3); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, namelen, 0); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, offset, 1); + XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, name, 3); + XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10); + + /* log structures */ + XFS_CHECK_STRUCT_SIZE(struct xfs_buf_log_format, 88); + XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat, 24); + XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_32, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_efd_log_format_64, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_32, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_efi_log_format_64, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_extent_32, 12); + XFS_CHECK_STRUCT_SIZE(struct xfs_extent_64, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_log_dinode, 176); + XFS_CHECK_STRUCT_SIZE(struct xfs_icreate_log, 28); + XFS_CHECK_STRUCT_SIZE(xfs_log_timestamp_t, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_log_legacy_timestamp, 8); + XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format_32, 52); + XFS_CHECK_STRUCT_SIZE(struct xfs_inode_log_format, 56); + XFS_CHECK_STRUCT_SIZE(struct xfs_qoff_logformat, 20); + XFS_CHECK_STRUCT_SIZE(struct xfs_trans_header, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_attri_log_format, 40); + XFS_CHECK_STRUCT_SIZE(struct xfs_attrd_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_bui_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_bud_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_cui_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_cud_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_rui_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_rud_log_format, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_map_extent, 32); + XFS_CHECK_STRUCT_SIZE(struct xfs_phys_extent, 16); + + XFS_CHECK_OFFSET(struct xfs_bui_log_format, bui_extents, 16); + XFS_CHECK_OFFSET(struct xfs_cui_log_format, cui_extents, 16); + XFS_CHECK_OFFSET(struct xfs_rui_log_format, rui_extents, 16); + XFS_CHECK_OFFSET(struct xfs_efi_log_format, efi_extents, 16); + XFS_CHECK_OFFSET(struct xfs_efi_log_format_32, efi_extents, 16); + XFS_CHECK_OFFSET(struct xfs_efi_log_format_64, efi_extents, 16); + + /* + * The v5 superblock format extended several v4 header structures with + * additional data. While new fields are only accessible on v5 + * superblocks, it's important that the v5 structures place original v4 + * fields/headers in the correct location on-disk. For example, we must + * be able to find magic values at the same location in certain blocks + * regardless of superblock version. + * + * The following checks ensure that various v5 data structures place the + * subset of v4 metadata associated with the same type of block at the + * start of the on-disk block. If there is no data structure definition + * for certain types of v4 blocks, traverse down to the first field of + * common metadata (e.g., magic value) and make sure it is at offset + * zero. + */ + XFS_CHECK_OFFSET(struct xfs_dir3_leaf, hdr.info.hdr, 0); + XFS_CHECK_OFFSET(struct xfs_da3_intnode, hdr.info.hdr, 0); + XFS_CHECK_OFFSET(struct xfs_dir3_data_hdr, hdr.magic, 0); + XFS_CHECK_OFFSET(struct xfs_dir3_free, hdr.hdr.magic, 0); + XFS_CHECK_OFFSET(struct xfs_attr3_leafblock, hdr.info.hdr, 0); + + XFS_CHECK_STRUCT_SIZE(struct xfs_bulkstat, 192); + XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers, 24); + XFS_CHECK_STRUCT_SIZE(struct xfs_bulkstat_req, 64); + XFS_CHECK_STRUCT_SIZE(struct xfs_inumbers_req, 64); + + /* + * Make sure the incore inode timestamp range corresponds to hand + * converted values based on the ondisk format specification. + */ + XFS_CHECK_VALUE(XFS_BIGTIME_TIME_MIN - XFS_BIGTIME_EPOCH_OFFSET, + XFS_LEGACY_TIME_MIN); + XFS_CHECK_VALUE(XFS_BIGTIME_TIME_MAX - XFS_BIGTIME_EPOCH_OFFSET, + 16299260424LL); + + /* Do the same with the incore quota expiration range. */ + XFS_CHECK_VALUE(XFS_DQ_BIGTIME_EXPIRY_MIN << XFS_DQ_BIGTIME_SHIFT, 4); + XFS_CHECK_VALUE(XFS_DQ_BIGTIME_EXPIRY_MAX << XFS_DQ_BIGTIME_SHIFT, + 16299260424LL); +} + +#endif /* __XFS_ONDISK_H */ From patchwork Wed Mar 13 01:59:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590865 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3BAAE10953 for ; Wed, 13 Mar 2024 01:59:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295174; cv=none; b=E4XFE4wTInszpcyZSnn620X+ry66uj54Eh6SUyaQnWJGAsQG+/x8EoOLTsmgqBWTNC7NQnbpMdZu/IDfrPzs9ylDlrjMqfT/4wJ6FbGm1b/jOdLiJUE22I/Q2/7Msa4kqmRn8WkBbrts7PzgmU90z6HoqkrQPKgruUm11ROrxfk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295174; c=relaxed/simple; bh=VDlqfW1hV+NsqRAHr52Br4C7GdYfELg+YrOtFNI8orA=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OZDkBR2mUsmKEy3yyU6AjxdriJ/EyGGLpVOdx5pSPNcHS2LTGi6z0JEeiSVUyS3uyJgbqeGU68bjOhO/JCzMMGnWWymNoi3F7WECb/mS6p0c61M2/oqz/AAWQsSsD0Ddz1CepAiaTS3B1TVjbjEsvh9z6Fgf9g49VpPUxzR/1IA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jsTX60y7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jsTX60y7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC7F5C433C7; Wed, 13 Mar 2024 01:59:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295173; bh=VDlqfW1hV+NsqRAHr52Br4C7GdYfELg+YrOtFNI8orA=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=jsTX60y7aCF+0xbX48laOKUJbXtUkfU6XhVzDFYYtKr0hqQImFkwHIHcZfkTjv7uA ahin6av36/4fR4yLgZguZvX65Q4NMBtUJs2wWaPBA0ihZ19569gu9JK/26gx6sxJ6N 9u5XjGhyLCsJtFNhqARAjaC6G4WS1Krq4E9ZexuJT4TCV2V6zzIHJz5aKJ+1eTbwJj DL1pOIuv9T6x9udCKxIhzieKYTHIuWAkbsF/5sRWJaW0vY8RFMwB1HTbf0tkzziGJE TtZSYwR4EXdHFg4t++vZFgNHX7RGwxfnnk3w6lXqRQLSsnxP8M8yHQ8sJvRocxxyb+ hQ0s9X0TMRkIA== Date: Tue, 12 Mar 2024 18:59:33 -0700 Subject: [PATCH 25/67] xfs: consolidate the xfs_attr_defer_* helpers From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431554.2061787.13501993001816911277.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: c00eebd09e95757c9c1d08f0a6bbc32c543daf90 Consolidate the xfs_attr_defer_* helpers into a single xfs_attr_defer_add one that picks the right dela_state based on the passed in operation. Also move to a single trace point as the actual operation is visible through the flags in the delta_state passed to the trace point. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_attr.c | 90 ++++++++++++----------------------------------------- 1 file changed, 21 insertions(+), 69 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 2103a06b9ee3..550ca6b2e263 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -878,11 +878,10 @@ xfs_attr_lookup( return error; } -static int -xfs_attr_intent_init( +static void +xfs_attr_defer_add( struct xfs_da_args *args, - unsigned int op_flags, /* op flag (set or remove) */ - struct xfs_attr_intent **attr) /* new xfs_attr_intent */ + unsigned int op_flags) { struct xfs_attr_intent *new; @@ -891,66 +890,22 @@ xfs_attr_intent_init( new->xattri_op_flags = op_flags; new->xattri_da_args = args; - *attr = new; - return 0; -} + switch (op_flags) { + case XFS_ATTRI_OP_FLAGS_SET: + new->xattri_dela_state = xfs_attr_init_add_state(args); + break; + case XFS_ATTRI_OP_FLAGS_REPLACE: + new->xattri_dela_state = xfs_attr_init_replace_state(args); + break; + case XFS_ATTRI_OP_FLAGS_REMOVE: + new->xattri_dela_state = xfs_attr_init_remove_state(args); + break; + default: + ASSERT(0); + } -/* Sets an attribute for an inode as a deferred operation */ -static int -xfs_attr_defer_add( - struct xfs_da_args *args) -{ - struct xfs_attr_intent *new; - int error = 0; - - error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_SET, &new); - if (error) - return error; - - new->xattri_dela_state = xfs_attr_init_add_state(args); xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp); - - return 0; -} - -/* Sets an attribute for an inode as a deferred operation */ -static int -xfs_attr_defer_replace( - struct xfs_da_args *args) -{ - struct xfs_attr_intent *new; - int error = 0; - - error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REPLACE, &new); - if (error) - return error; - - new->xattri_dela_state = xfs_attr_init_replace_state(args); - xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); - trace_xfs_attr_defer_replace(new->xattri_dela_state, args->dp); - - return 0; -} - -/* Removes an attribute for an inode as a deferred operation */ -static int -xfs_attr_defer_remove( - struct xfs_da_args *args) -{ - - struct xfs_attr_intent *new; - int error; - - error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REMOVE, &new); - if (error) - return error; - - new->xattri_dela_state = xfs_attr_init_remove_state(args); - xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); - trace_xfs_attr_defer_remove(new->xattri_dela_state, args->dp); - - return 0; } /* @@ -1036,16 +991,16 @@ xfs_attr_set( error = xfs_attr_lookup(args); switch (error) { case -EEXIST: - /* if no value, we are performing a remove operation */ if (!args->value) { - error = xfs_attr_defer_remove(args); + /* if no value, we are performing a remove operation */ + xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REMOVE); break; } + /* Pure create fails if the attr already exists */ if (args->attr_flags & XATTR_CREATE) goto out_trans_cancel; - - error = xfs_attr_defer_replace(args); + xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_REPLACE); break; case -ENOATTR: /* Can't remove what isn't there. */ @@ -1055,14 +1010,11 @@ xfs_attr_set( /* Pure replace fails if no existing attr to replace. */ if (args->attr_flags & XATTR_REPLACE) goto out_trans_cancel; - - error = xfs_attr_defer_add(args); + xfs_attr_defer_add(args, XFS_ATTRI_OP_FLAGS_SET); break; default: goto out_trans_cancel; } - if (error) - goto out_trans_cancel; /* * If this is a synchronous mount, make sure that the From patchwork Wed Mar 13 01:59:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590866 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EDB89BA2B for ; Wed, 13 Mar 2024 01:59:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295190; cv=none; b=kC4fNBH9xS5nYGYrk5HKfPFHX/XEvFQ4QD+DpBs1Y1ZMywV+E7TIoqJbXSGh5zt2zXZZwHqcHgyY9HTZxi5Lyb1mTqEPcRDzJx3XksuPyAx3MPQzdAezh8uW5e8OnR5i/14D9YYuZY8ExsI3+8gnhG19SQeGSN0Gy8c2yNmVAFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295190; c=relaxed/simple; bh=zf8p66UjEhSNv3Z6WClpbd4TnVU9Ch16EkkCLhsxQtI=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=o50iK1PlczbtpRINseOkW1D1Yl91Bel84Z5gXAXb7b5jj3k/jLvu7BbZ5hxaQEZIS7OYKDnk3vjRJCUE1YdMpNOAdKY9XN7eHp9U32BjKf/ypsHRR3WUIYHibs5vKJTKCxaQOFGZd3Snz+blzybLJjnpThMeSzHvtKGJoXsalgE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=U8ZENh2k; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="U8ZENh2k" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 723B4C433F1; Wed, 13 Mar 2024 01:59:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295189; bh=zf8p66UjEhSNv3Z6WClpbd4TnVU9Ch16EkkCLhsxQtI=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=U8ZENh2k8WShPGNy1e5IuRciqL9xiJnQCq6Qp6KhcX3XGhwWDlYhLPOkDpudvRJKP 8f2AWZx08ao05805ma4rskYOpEhrIaDTIijnCguHCIocn0Yys0QwWjosA3d1sMsCDu +g+qXvtGzSjJjOuQ6VWmV3k1oy0RhrycLJ8In8Ux2EO31YiKnX/nLFiGwycYa9ZfOY K+rh2LaWWB7vuFBnxib5lHuaY20EsWszOXeBfG1uzAPpI7+Abc0blJazKcJUrSfGve dfvsOjrKXOVmfKbwCDMYj7qSDq+gfQW6AxDAejvBmrDVLVROVl9m9QoZAjjaDnAOzg hmWBJ8BDVWMZw== Date: Tue, 12 Mar 2024 18:59:48 -0700 Subject: [PATCH 26/67] xfs: store an ops pointer in struct xfs_defer_pending From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431569.2061787.10596662975818893530.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 7f2f7531e0d455f1abb9f48fbbe17c37e8742590 The dfp_type field in struct xfs_defer_pending is only used to either look up the operations associated with the pending word or in trace points. Replace it with a direct pointer to the operations vector, and store a pretty name in the vector for tracing. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/defer_item.c | 6 ++++++ libxfs/xfs_defer.c | 43 +++++++++++++++++-------------------------- libxfs/xfs_defer.h | 5 +++-- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index b8afda0ceb58..014589f82ec8 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -152,6 +152,7 @@ xfs_extent_free_cancel_item( } const struct xfs_defer_op_type xfs_extent_free_defer_type = { + .name = "extent_free", .create_intent = xfs_extent_free_create_intent, .abort_intent = xfs_extent_free_abort_intent, .create_done = xfs_extent_free_create_done, @@ -195,6 +196,7 @@ xfs_agfl_free_finish_item( /* sub-type with special handling for AGFL deferred frees */ const struct xfs_defer_op_type xfs_agfl_free_defer_type = { + .name = "agfl_free", .create_intent = xfs_extent_free_create_intent, .abort_intent = xfs_extent_free_abort_intent, .create_done = xfs_extent_free_create_done, @@ -306,6 +308,7 @@ xfs_rmap_update_cancel_item( } const struct xfs_defer_op_type xfs_rmap_update_defer_type = { + .name = "rmap", .create_intent = xfs_rmap_update_create_intent, .abort_intent = xfs_rmap_update_abort_intent, .create_done = xfs_rmap_update_create_done, @@ -424,6 +427,7 @@ xfs_refcount_update_cancel_item( } const struct xfs_defer_op_type xfs_refcount_update_defer_type = { + .name = "refcount", .create_intent = xfs_refcount_update_create_intent, .abort_intent = xfs_refcount_update_abort_intent, .create_done = xfs_refcount_update_create_done, @@ -546,6 +550,7 @@ xfs_bmap_update_cancel_item( } const struct xfs_defer_op_type xfs_bmap_update_defer_type = { + .name = "bmap", .create_intent = xfs_bmap_update_create_intent, .abort_intent = xfs_bmap_update_abort_intent, .create_done = xfs_bmap_update_create_done, @@ -641,6 +646,7 @@ xfs_attr_cancel_item( } const struct xfs_defer_op_type xfs_attr_defer_type = { + .name = "attr", .max_items = 1, .create_intent = xfs_attr_create_intent, .abort_intent = xfs_attr_abort_intent, diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 98f1cbe6a67f..bb5411b84545 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -245,7 +245,6 @@ xfs_defer_create_done( struct xfs_trans *tp, struct xfs_defer_pending *dfp) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; struct xfs_log_item *lip; /* If there is no log intent item, there can be no log done item. */ @@ -260,7 +259,7 @@ xfs_defer_create_done( * 2.) shuts down the filesystem */ tp->t_flags |= XFS_TRANS_DIRTY; - lip = ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count); + lip = dfp->dfp_ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count); if (!lip) return; @@ -281,13 +280,13 @@ xfs_defer_create_intent( struct xfs_defer_pending *dfp, bool sort) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; struct xfs_log_item *lip; if (dfp->dfp_intent) return 1; - lip = ops->create_intent(tp, &dfp->dfp_work, dfp->dfp_count, sort); + lip = dfp->dfp_ops->create_intent(tp, &dfp->dfp_work, dfp->dfp_count, + sort); if (!lip) return 0; if (IS_ERR(lip)) @@ -332,12 +331,10 @@ xfs_defer_pending_abort( struct xfs_mount *mp, struct xfs_defer_pending *dfp) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; - trace_xfs_defer_pending_abort(mp, dfp); if (dfp->dfp_intent && !dfp->dfp_done) { - ops->abort_intent(dfp->dfp_intent); + dfp->dfp_ops->abort_intent(dfp->dfp_intent); dfp->dfp_intent = NULL; } } @@ -347,7 +344,6 @@ xfs_defer_pending_cancel_work( struct xfs_mount *mp, struct xfs_defer_pending *dfp) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; struct list_head *pwi; struct list_head *n; @@ -358,7 +354,7 @@ xfs_defer_pending_cancel_work( list_del(pwi); dfp->dfp_count--; trace_xfs_defer_cancel_item(mp, dfp, pwi); - ops->cancel_item(pwi); + dfp->dfp_ops->cancel_item(pwi); } ASSERT(dfp->dfp_count == 0); kmem_cache_free(xfs_defer_pending_cache, dfp); @@ -516,11 +512,10 @@ xfs_defer_relog_intent( struct xfs_defer_pending *dfp) { struct xfs_log_item *lip; - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; xfs_defer_create_done(tp, dfp); - lip = ops->relog_intent(tp, dfp->dfp_intent, dfp->dfp_done); + lip = dfp->dfp_ops->relog_intent(tp, dfp->dfp_intent, dfp->dfp_done); if (lip) { xfs_trans_add_item(tp, lip); set_bit(XFS_LI_DIRTY, &lip->li_flags); @@ -587,7 +582,7 @@ xfs_defer_finish_one( struct xfs_trans *tp, struct xfs_defer_pending *dfp) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; + const struct xfs_defer_op_type *ops = dfp->dfp_ops; struct xfs_btree_cur *state = NULL; struct list_head *li, *n; int error; @@ -784,7 +779,6 @@ xfs_defer_cancel( static inline struct xfs_defer_pending * xfs_defer_find_last( struct xfs_trans *tp, - enum xfs_defer_ops_type type, const struct xfs_defer_op_type *ops) { struct xfs_defer_pending *dfp = NULL; @@ -797,7 +791,7 @@ xfs_defer_find_last( dfp_list); /* Wrong type? */ - if (dfp->dfp_type != type) + if (dfp->dfp_ops != ops) return NULL; return dfp; } @@ -830,13 +824,13 @@ xfs_defer_can_append( static inline struct xfs_defer_pending * xfs_defer_alloc( struct xfs_trans *tp, - enum xfs_defer_ops_type type) + const struct xfs_defer_op_type *ops) { struct xfs_defer_pending *dfp; dfp = kmem_cache_zalloc(xfs_defer_pending_cache, GFP_NOFS | __GFP_NOFAIL); - dfp->dfp_type = type; + dfp->dfp_ops = ops; INIT_LIST_HEAD(&dfp->dfp_work); list_add_tail(&dfp->dfp_list, &tp->t_dfops); @@ -856,9 +850,9 @@ xfs_defer_add( ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); BUILD_BUG_ON(ARRAY_SIZE(defer_op_types) != XFS_DEFER_OPS_TYPE_MAX); - dfp = xfs_defer_find_last(tp, type, ops); + dfp = xfs_defer_find_last(tp, ops); if (!dfp || !xfs_defer_can_append(dfp, ops)) - dfp = xfs_defer_alloc(tp, type); + dfp = xfs_defer_alloc(tp, ops); xfs_defer_add_item(dfp, li); trace_xfs_defer_add_item(tp->t_mountp, dfp, li); @@ -874,17 +868,15 @@ xfs_defer_add_barrier( struct xfs_trans *tp) { struct xfs_defer_pending *dfp; - const enum xfs_defer_ops_type type = XFS_DEFER_OPS_TYPE_BARRIER; - const struct xfs_defer_op_type *ops = defer_op_types[type]; ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); /* If the last defer op added was a barrier, we're done. */ - dfp = xfs_defer_find_last(tp, type, ops); + dfp = xfs_defer_find_last(tp, &xfs_barrier_defer_type); if (dfp) return; - xfs_defer_alloc(tp, type); + xfs_defer_alloc(tp, &xfs_barrier_defer_type); trace_xfs_defer_add_item(tp->t_mountp, dfp, NULL); } @@ -903,7 +895,7 @@ xfs_defer_start_recovery( dfp = kmem_cache_zalloc(xfs_defer_pending_cache, GFP_NOFS | __GFP_NOFAIL); - dfp->dfp_type = dfp_type; + dfp->dfp_ops = defer_op_types[dfp_type]; dfp->dfp_intent = lip; INIT_LIST_HEAD(&dfp->dfp_work); list_add_tail(&dfp->dfp_list, r_dfops); @@ -929,13 +921,12 @@ xfs_defer_finish_recovery( struct xfs_defer_pending *dfp, struct list_head *capture_list) { - const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type]; int error; - error = ops->recover_work(dfp, capture_list); + error = dfp->dfp_ops->recover_work(dfp, capture_list); if (error) trace_xlog_intent_recovery_failed(mp, error, - ops->recover_work); + dfp->dfp_ops->recover_work); return error; } diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 5b1990ef3e5d..957a06278e88 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -34,9 +34,9 @@ struct xfs_defer_pending { struct list_head dfp_work; /* work items */ struct xfs_log_item *dfp_intent; /* log intent item */ struct xfs_log_item *dfp_done; /* log done item */ + const struct xfs_defer_op_type *dfp_ops; unsigned int dfp_count; /* # extent items */ unsigned int dfp_flags; - enum xfs_defer_ops_type dfp_type; }; /* @@ -61,6 +61,8 @@ void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp); /* Description of a deferred type. */ struct xfs_defer_op_type { + const char *name; + unsigned int max_items; struct xfs_log_item *(*create_intent)(struct xfs_trans *tp, struct list_head *items, unsigned int count, bool sort); void (*abort_intent)(struct xfs_log_item *intent); @@ -76,7 +78,6 @@ struct xfs_defer_op_type { struct xfs_log_item *(*relog_intent)(struct xfs_trans *tp, struct xfs_log_item *intent, struct xfs_log_item *done_item); - unsigned int max_items; }; extern const struct xfs_defer_op_type xfs_bmap_update_defer_type; From patchwork Wed Mar 13 02:00:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590867 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96056B652 for ; Wed, 13 Mar 2024 02:00:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295205; cv=none; b=uTxMSHQS/aFpnA5FCeQMdMjWzObBWseirheUUoEfh/AlJgnGmbSoYXbUjd6Lr/q0ERpkBYJ02g5E9TsQGordFwlpgHsgN7uN3fqCAeCAlw6LxGmOmLslYkFOcZOcT6q/A0752btsGvKaYKF2MlbmdHBAe/JJBFDfMKArTbsn5TE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295205; c=relaxed/simple; bh=/w/dr/ffKKTv5hz0j62vKKDB6wimBxeXPYFVaFxsasI=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=skRT6dNy20ux7ZB9N9bTa5mbvCbV5NLahgGUuVGMqgh5CX9Qprbsf9tip6nvZlGf843b+JXr1ig1kPJlmQ6kPzWoCz+SCtgkqn65dKe66dsT15fUft59og6Y41m8HYCNIP+sL1r4XVlhedw4q2uzTDFtDZZ5+z9oFpXBA1TXeVw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mLOZb+uh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mLOZb+uh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1B550C433F1; Wed, 13 Mar 2024 02:00:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295205; bh=/w/dr/ffKKTv5hz0j62vKKDB6wimBxeXPYFVaFxsasI=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=mLOZb+uheEVfH7XxUvjNVN6rp+KW98jEf00fhnrJBHKzkdrnzb6jqPqXVjVP63Eux eFpsguoHIM9VSiNyP3cujnpT/89V6bKTKD/96T9gQAFQyC6mQ2DpXVeByuQeAKEDpH 2xJ5i91Zx5BYo0/JprOqDXqgHn48UVoH1KuVYd220Bxc5BoMdrk8/huSsq35XCMgfi lUQlFja2KQyI+KlT1QvNPSbWfpxuqDY/lwORzFgarfemecDB5iMbdPA09wZtaGYYmK 8b8g/jxLtfZcGlUkUa8L1W2qKCDj/Q+dtIoJPGD1xA3K9drRFGevs9x1KYN50zSzBZ sqKmDhe0Z4hCg== Date: Tue, 12 Mar 2024 19:00:04 -0700 Subject: [PATCH 27/67] xfs: pass the defer ops instead of type to xfs_defer_start_recovery From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431583.2061787.7515895765301523262.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: dc22af64368291a86fb6b7eb2adab21c815836b7 xfs_defer_start_recovery is only called from xlog_recover_intent_item, and the callers of that all have the actual xfs_defer_ops_type operation vector at hand. Pass that directly instead of looking it up from the defer_op_types table. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Chandan Babu R --- libxfs/xfs_defer.c | 6 +++--- libxfs/xfs_defer.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index bb5411b84545..033283017fae 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -888,14 +888,14 @@ xfs_defer_add_barrier( void xfs_defer_start_recovery( struct xfs_log_item *lip, - enum xfs_defer_ops_type dfp_type, - struct list_head *r_dfops) + struct list_head *r_dfops, + const struct xfs_defer_op_type *ops) { struct xfs_defer_pending *dfp; dfp = kmem_cache_zalloc(xfs_defer_pending_cache, GFP_NOFS | __GFP_NOFAIL); - dfp->dfp_ops = defer_op_types[dfp_type]; + dfp->dfp_ops = ops; dfp->dfp_intent = lip; INIT_LIST_HEAD(&dfp->dfp_work); list_add_tail(&dfp->dfp_list, r_dfops); diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 957a06278e88..60de91b66392 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -147,7 +147,7 @@ void xfs_defer_ops_capture_abort(struct xfs_mount *mp, void xfs_defer_resources_rele(struct xfs_defer_resources *dres); void xfs_defer_start_recovery(struct xfs_log_item *lip, - enum xfs_defer_ops_type dfp_type, struct list_head *r_dfops); + struct list_head *r_dfops, const struct xfs_defer_op_type *ops); void xfs_defer_cancel_recovery(struct xfs_mount *mp, struct xfs_defer_pending *dfp); int xfs_defer_finish_recovery(struct xfs_mount *mp, From patchwork Wed Mar 13 02:00:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590868 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE775AD21 for ; Wed, 13 Mar 2024 02:00:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295221; cv=none; b=Ii2Xr31VFcoTEhnNU1369ay4iYvITl2WS3baTtKZ/y5v7kOG5fb+CVDC0nZEcmLH4NM8OPv1T2vDipNTP6WJKs4xz1xA9Jvj3V3Xj4BbTUotoAm7x2AZMcGCiciwBky2Q3WyNb/WpoBOaMA+IwlOpd6dcbUyJEp07dGlK+yk2mQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295221; c=relaxed/simple; bh=dNmXvJkry4WBKk5FvOxqvSAEQmsrc2nOCNOhGfn9wos=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dgNu3RVrjoA/jlFzbHtSMwvlvuH0aKqb2LKg3ADFs/CbpqKXNJCnWMF97+pvxHnqxMY3s75YDxZfTZ6fAVy5Gl2XxxIkoS/tPSwLsMaoMtl5+K+wfiX4pHLy9RwKyyTTw5clvsqN3MAbsQJ1yvMyPVL0qA9faAVPyvaMoeZRnr8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HIWHdJ8X; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HIWHdJ8X" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AEB44C433F1; Wed, 13 Mar 2024 02:00:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295220; bh=dNmXvJkry4WBKk5FvOxqvSAEQmsrc2nOCNOhGfn9wos=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=HIWHdJ8XfdV9xCgRZsNKOK4cPbzaYVRj/AGOrO5PTnHr4fiy5jZY9gEmxDH/VWISS 8l8KdV5iWgeGHURhxANtTH/GpmJTlfOp5J9J9Y4BjPTEpHFxn01m3cFHRyP758ZJnu 1SpVrU6gxmE6zMOhxr8DJAd2v97vwCBRqmozmM+06tRXlNgClMrjaATKj9pkJ1Ldc3 +zzwU83NsRE66sIZ3R7QGsPcZJMZYpBBVM16J8dzrS83yjCOtyBZGTnw/DMinvwbMh D65NQp4ew3W6BmWgFf97ybZJieuFWlFbkj4d0RxGolKPvXHs5ry5UJFf2Kz+zaFPcB /B3rVPslpVUnw== Date: Tue, 12 Mar 2024 19:00:20 -0700 Subject: [PATCH 28/67] xfs: pass the defer ops directly to xfs_defer_add From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431597.2061787.715743730657703356.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 603ce8ab12094a2d9483c79a7541335e258a5328 Pass a pointer to the xfs_defer_op_type structure to xfs_defer_add and remove the indirection through the xfs_defer_ops_type enum and a global table of all possible operations. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_alloc.c | 4 ++-- libxfs/xfs_attr.c | 2 +- libxfs/xfs_bmap.c | 2 +- libxfs/xfs_defer.c | 16 ++-------------- libxfs/xfs_defer.h | 18 ++---------------- libxfs/xfs_refcount.c | 2 +- libxfs/xfs_rmap.c | 2 +- 7 files changed, 10 insertions(+), 36 deletions(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 463381be7863..aaa1596157e9 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2510,7 +2510,7 @@ xfs_defer_agfl_block( trace_xfs_agfl_free_defer(mp, agno, 0, agbno, 1); xfs_extent_free_get_group(mp, xefi); - xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_AGFL_FREE, &xefi->xefi_list); + xfs_defer_add(tp, &xefi->xefi_list, &xfs_agfl_free_defer_type); return 0; } @@ -2574,7 +2574,7 @@ xfs_defer_extent_free( XFS_FSB_TO_AGBNO(tp->t_mountp, bno), len); xfs_extent_free_get_group(mp, xefi); - *dfpp = xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_FREE, &xefi->xefi_list); + *dfpp = xfs_defer_add(tp, &xefi->xefi_list, &xfs_extent_free_defer_type); return 0; } diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 550ca6b2e263..cb6c8d081fd3 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -904,7 +904,7 @@ xfs_attr_defer_add( ASSERT(0); } - xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); + xfs_defer_add(args->trans, &new->xattri_list, &xfs_attr_defer_type); trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp); } diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 20ec22dfcaf4..6d23c5e3e652 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -6085,7 +6085,7 @@ __xfs_bmap_add( bi->bi_bmap = *bmap; xfs_bmap_update_get_group(tp->t_mountp, bi); - xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_BMAP, &bi->bi_list); + xfs_defer_add(tp, &bi->bi_list, &xfs_bmap_update_defer_type); return 0; } diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 033283017fae..077e99298074 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -229,16 +229,6 @@ static const struct xfs_defer_op_type xfs_barrier_defer_type = { .cancel_item = xfs_defer_barrier_cancel_item, }; -static const struct xfs_defer_op_type *defer_op_types[] = { - [XFS_DEFER_OPS_TYPE_BMAP] = &xfs_bmap_update_defer_type, - [XFS_DEFER_OPS_TYPE_REFCOUNT] = &xfs_refcount_update_defer_type, - [XFS_DEFER_OPS_TYPE_RMAP] = &xfs_rmap_update_defer_type, - [XFS_DEFER_OPS_TYPE_FREE] = &xfs_extent_free_defer_type, - [XFS_DEFER_OPS_TYPE_AGFL_FREE] = &xfs_agfl_free_defer_type, - [XFS_DEFER_OPS_TYPE_ATTR] = &xfs_attr_defer_type, - [XFS_DEFER_OPS_TYPE_BARRIER] = &xfs_barrier_defer_type, -}; - /* Create a log intent done item for a log intent item. */ static inline void xfs_defer_create_done( @@ -841,14 +831,12 @@ xfs_defer_alloc( struct xfs_defer_pending * xfs_defer_add( struct xfs_trans *tp, - enum xfs_defer_ops_type type, - struct list_head *li) + struct list_head *li, + const struct xfs_defer_op_type *ops) { struct xfs_defer_pending *dfp = NULL; - const struct xfs_defer_op_type *ops = defer_op_types[type]; ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); - BUILD_BUG_ON(ARRAY_SIZE(defer_op_types) != XFS_DEFER_OPS_TYPE_MAX); dfp = xfs_defer_find_last(tp, ops); if (!dfp || !xfs_defer_can_append(dfp, ops)) diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index 60de91b66392..18a9fb92dde8 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -10,20 +10,6 @@ struct xfs_btree_cur; struct xfs_defer_op_type; struct xfs_defer_capture; -/* - * Header for deferred operation list. - */ -enum xfs_defer_ops_type { - XFS_DEFER_OPS_TYPE_BMAP, - XFS_DEFER_OPS_TYPE_REFCOUNT, - XFS_DEFER_OPS_TYPE_RMAP, - XFS_DEFER_OPS_TYPE_FREE, - XFS_DEFER_OPS_TYPE_AGFL_FREE, - XFS_DEFER_OPS_TYPE_ATTR, - XFS_DEFER_OPS_TYPE_BARRIER, - XFS_DEFER_OPS_TYPE_MAX, -}; - /* * Save a log intent item and a list of extents, so that we can replay * whatever action had to happen to the extent list and file the log done @@ -51,8 +37,8 @@ struct xfs_defer_pending { void xfs_defer_item_pause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); void xfs_defer_item_unpause(struct xfs_trans *tp, struct xfs_defer_pending *dfp); -struct xfs_defer_pending *xfs_defer_add(struct xfs_trans *tp, - enum xfs_defer_ops_type type, struct list_head *h); +struct xfs_defer_pending *xfs_defer_add(struct xfs_trans *tp, struct list_head *h, + const struct xfs_defer_op_type *ops); int xfs_defer_finish_noroll(struct xfs_trans **tp); int xfs_defer_finish(struct xfs_trans **tp); int xfs_defer_finish_one(struct xfs_trans *tp, struct xfs_defer_pending *dfp); diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 2284b45fbb04..45f8134e4314 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -1457,7 +1457,7 @@ __xfs_refcount_add( ri->ri_blockcount = blockcount; xfs_refcount_update_get_group(tp->t_mountp, ri); - xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_REFCOUNT, &ri->ri_list); + xfs_defer_add(tp, &ri->ri_list, &xfs_refcount_update_defer_type); } /* diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 5ff6d7a32f2f..4731e10d2101 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -2566,7 +2566,7 @@ __xfs_rmap_add( ri->ri_bmap = *bmap; xfs_rmap_update_get_group(tp->t_mountp, ri); - xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_RMAP, &ri->ri_list); + xfs_defer_add(tp, &ri->ri_list, &xfs_rmap_update_defer_type); } /* Map an extent into a file. */ From patchwork Wed Mar 13 02:00:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590869 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE064BE62 for ; Wed, 13 Mar 2024 02:00:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295236; cv=none; b=I/MgqGGk/GeCbm6u+GN2WQpQRiHYg7DFTUWk4IJU91/fkXAJ8TfbaJl6n/3lfPXEWlOQaBabbdu90NBtaNYPGlwcAuuZhtVSe/5nnv+lcJE6vD1Z7hgFKsj1I+lx7W1BLSor+qshrJGFh5qjN1xHMXam65YTQAdFaPS7ly1paJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295236; c=relaxed/simple; bh=UiWgh1lqnx/VJ4SdGYv5FUgo6UNOa4p2+maa+ma+Bew=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mJP8Azt7x6obfe/bvJF8X8QN+ipPDOB6tWmms9Qbscflh+Gd4Gzu7BwPtCSJmsj+LnsYDm2RWvnEnjwpb0u4bU9QjqPVmC4O1ZCtorbF/vPyJr9g5GO6xoMVSX87dYpSHPZd3NLD+sFLPhjH1DnaWZxhlHi/NyeG0Th4GhCFk9g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lNJ5P2GS; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lNJ5P2GS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C689C433C7; Wed, 13 Mar 2024 02:00:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295236; bh=UiWgh1lqnx/VJ4SdGYv5FUgo6UNOa4p2+maa+ma+Bew=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=lNJ5P2GSNPPIPHYJcLDPyfqB5iUG6dN832mhBirLGgfyf1G9nWOHX1jGDYnLdBrcG fxRWqK5SH63QTZyciCZv0QIerjvrUW6ypeUDwJyjfhkI4Ki7vVG4cnjKD9s5hqfSxB m3yDSvUI5nTeEKlOyHNnmk+5A44uQPOvFwlxvF4ACFtxdrYHP6m0zsLOq7UAl45vqY qw0JZ3P/8m8Q0h/dLxAV8G66PdCJIqiIbCzcqExqVa+N3ecAocADMCRglSELI7FAYa gqQ83DKkIsZDCEFZ4RztIjNnSfwZxKhTj9dEiqtJvzK6m92eyZiHpyNg16UT1ENMf5 DyYLfBbGnGVdA== Date: Tue, 12 Mar 2024 19:00:35 -0700 Subject: [PATCH 29/67] xfs: force all buffers to be written during btree bulk load From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431612.2061787.14166599748410304997.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 13ae04d8d45227c2ba51e188daf9fc13d08a1b12 While stress-testing online repair of btrees, I noticed periodic assertion failures from the buffer cache about buffers with incorrect DELWRI_Q state. Looking further, I observed this race between the AIL trying to write out a btree block and repair zapping a btree block after the fact: AIL: Repair0: pin buffer X delwri_queue: set DELWRI_Q add to delwri list stale buf X: clear DELWRI_Q does not clear b_list free space X delwri_submit # oops Worse yet, I discovered that running the same repair over and over in a tight loop can result in a second race that cause data integrity problems with the repair: AIL: Repair0: Repair1: pin buffer X delwri_queue: set DELWRI_Q add to delwri list stale buf X: clear DELWRI_Q does not clear b_list free space X find free space X get buffer rewrite buffer delwri_queue: set DELWRI_Q already on a list, do not add BAD: committed tree root before all blocks written delwri_submit # too late now I traced this to my own misunderstanding of how the delwri lists work, particularly with regards to the AIL's buffer list. If a buffer is logged and committed, the buffer can end up on that AIL buffer list. If btree repairs are run twice in rapid succession, it's possible that the first repair will invalidate the buffer and free it before the next time the AIL wakes up. Marking the buffer stale clears DELWRI_Q from the buffer state without removing the buffer from its delwri list. The buffer doesn't know which list it's on, so it cannot know which lock to take to protect the list for a removal. If the second repair allocates the same block, it will then recycle the buffer to start writing the new btree block. Meanwhile, if the AIL wakes up and walks the buffer list, it will ignore the buffer because it can't lock it, and go back to sleep. When the second repair calls delwri_queue to put the buffer on the list of buffers to write before committing the new btree, it will set DELWRI_Q again, but since the buffer hasn't been removed from the AIL's buffer list, it won't add it to the bulkload buffer's list. This is incorrect, because the bulkload caller relies on delwri_submit to ensure that all the buffers have been sent to disk /before/ required for data consistency. Worse, the AIL won't clear DELWRI_Q from the buffer when it does finally drop it, so the next thread to walk through the btree will trip over a debug assertion on that flag. To fix this, create a new function that waits for the buffer to be removed from any other delwri lists before adding the buffer to the caller's delwri list. By waiting for the buffer to clear both the delwri list and any potential delwri wait list, we can be sure that repair will initiate writes of all buffers and report all write errors back to userspace instead of committing the new structure. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_io.h | 11 +++++++++++ libxfs/xfs_btree_staging.c | 4 +--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h index 267ea979656f..259c6a7cf771 100644 --- a/libxfs/libxfs_io.h +++ b/libxfs/libxfs_io.h @@ -244,6 +244,17 @@ xfs_buf_delwri_queue(struct xfs_buf *bp, struct list_head *buffer_list) return true; } +static inline void +xfs_buf_delwri_queue_here(struct xfs_buf *bp, struct list_head *buffer_list) +{ + ASSERT(list_empty(&bp->b_list)); + + /* This buffer is uptodate; don't let it get reread. */ + libxfs_buf_mark_dirty(bp); + + xfs_buf_delwri_queue(bp, buffer_list); +} + int xfs_buf_delwri_submit(struct list_head *buffer_list); void xfs_buf_delwri_cancel(struct list_head *list); diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index a6a907916686..baf7f422603e 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -342,9 +342,7 @@ xfs_btree_bload_drop_buf( if (*bpp == NULL) return; - if (!xfs_buf_delwri_queue(*bpp, buffers_list)) - ASSERT(0); - + xfs_buf_delwri_queue_here(*bpp, buffers_list); xfs_buf_relse(*bpp); *bpp = NULL; } From patchwork Wed Mar 13 02:00:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590870 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81BFAB663 for ; Wed, 13 Mar 2024 02:00:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295252; cv=none; b=uTT0cVVZXBftoL7iPGybesrwAa+uEhMqR8pLIZL12DkrpEVktIRysuYahnEqVSF0NEgTizMCvI9dsLcd3B2eYjhZg6Pn9RH0+qn6/r7ZR39hIZDNv4Hf7BeXxAMPXe884954Nn9ioKQL1Q52Y5kFA/TwTBwURU/8BC0e8eV74kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295252; c=relaxed/simple; bh=4ewVXUA4tD7RL6SyRz+9CftZCrpevqvXi7K3CEOsRgM=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FXLuboqAqML9K1Nikwt7ZyHJyc1w+/SO7DB/N8ENzOdnG2tT8WDXQNhmJrXA1hclYIPo1MF4CJbgZMh41G2HhlTNaj2e82UnQrK/JjUoroojp2QBSYf7f6zStXDxYJhUmCPiY4Z8SditVKOgE6yfr4xqh2bM1tZI+ZGOMgQdKHU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y7T+zoYE; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y7T+zoYE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F26DBC433F1; Wed, 13 Mar 2024 02:00:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295252; bh=4ewVXUA4tD7RL6SyRz+9CftZCrpevqvXi7K3CEOsRgM=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=Y7T+zoYEMXN/7L2EmKgqgRQsTNGCBcZN+FXnhtLymT9sWqxfngAtb6vKRZyJUeSE3 ON6q2yVfoOvXaj2yV5yKcdMX0t5WbN/FrS1enkAguw7NqcAtTYJQ1ALeqlgsB9XME1 1NleUQCRcPlpehYUxZX9JN3X56hqBC011/OiGzyOw93LGPzJQH1L+k8rvgbIMtwuxI 78/cQrM9y95uLx91OLuh7AvunZXKmoUpKyO89EyHBm5v94o1ZoZyBFcUd9ufpcV0P9 8piV7tZhVJVsDnCuNIuAGvGGMRvzI5xBjCDIqyJsHcINNTPGrIZwBKpyw4gfR54av9 DzmNDDITzgIfQ== Date: Tue, 12 Mar 2024 19:00:51 -0700 Subject: [PATCH 30/67] xfs: set XBF_DONE on newly formatted btree block that are ready for writing From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431627.2061787.13154035033729176250.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: c1e0f8e6fb060b23b6f1b82eb4265983f7d271f8 The btree bulkloading code calls xfs_buf_delwri_queue_here when it has finished formatting a new btree block and wants to queue it to be written to disk. Once the new btree root has been committed, the blocks (and hence the buffers) will be accessible to the rest of the filesystem. Mark each new buffer as DONE when adding it to the delwri list so that the next btree traversal can skip reloading the contents from disk. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_btree_staging.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index baf7f422603e..ae2d9c63f484 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -342,6 +342,12 @@ xfs_btree_bload_drop_buf( if (*bpp == NULL) return; + /* + * Mark this buffer XBF_DONE (i.e. uptodate) so that a subsequent + * xfs_buf_read will not pointlessly reread the contents from the disk. + */ + (*bpp)->b_flags |= XBF_DONE; + xfs_buf_delwri_queue_here(*bpp, buffers_list); xfs_buf_relse(*bpp); *bpp = NULL; From patchwork Wed Mar 13 02:01:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590871 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 459A2BA27 for ; Wed, 13 Mar 2024 02:01:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295268; cv=none; b=Psin3SebrH5aB62QEvjWcf5GUNzVrtJIMP5dMcuB+dbIoeumeV7NhR8vijCeI5xtmvWRabG4Cv55bvCblufDi1PE8PvwXp1VN5ALUEl4WkJWOk4m7SXKfMu4epaOKPN3e/O9RG7ViIltz4wLCgp1g3yA0gQrvJ/NKrfUMHERCf8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295268; c=relaxed/simple; bh=wn1I9/kzpl3StY/YmEcFy2uojakuv0fyM8IEeX704YU=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bBiYCsopu+BgxleicO9+JVJEZiQEgq94J2RsuQFHRZz++b9zd+JDKNjZMP3cILZ2GVimCl36d7HsW1/HJRBZ2WnqSHmxVTF4LfqUUvLm2arFkH/BwdNXZe6lzAhUsZxvKHjsyQvhJuj5Wk4+9rqFgjlH7uZCjEOan18OsHb862g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uKZiTltV; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uKZiTltV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9961CC43399; Wed, 13 Mar 2024 02:01:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295267; bh=wn1I9/kzpl3StY/YmEcFy2uojakuv0fyM8IEeX704YU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=uKZiTltV0yB9jPlaYPR5cvMaszD4T5btX2GylMEFgE4cNBTcJBm6lgUJPqAuRQ14w 5gngFEC7LuXF2/cko/kuMFch44n4/GeZ/erP271blOnouCQh5E9UAfEeKxecBE1l3d 2Q0/jE6B0O7q9BnDhQ/pnOxkl1c7Tqn6knOm2SrZ8cpwRFBTU7f8U/dMDZqq6cBcYE +egqWYi9p5ZxL5sZ8CWQBw7jCVjeQwf4fjoYoVBt1elKCjvnsQMA7cLdtPYuqG/vXo Yf8A/W1Y/iTYalbyLJTErvOUHITFSiHsM/L2qAvp+td+WTRaV7OL+LAVyvDFHDATKi btbfEk3AZYvHg== Date: Tue, 12 Mar 2024 19:01:07 -0700 Subject: [PATCH 31/67] xfs: read leaf blocks when computing keys for bulkloading into node blocks From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431641.2061787.11426108394278141993.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 26de64629d8b439a03bce243f14a46f7440729f3 When constructing a new btree, xfs_btree_bload_node needs to read the btree blocks for level N to compute the keyptrs for the blocks that will be loaded into level N+1. The level N blocks must be formatted at that point. A subsequent patch will change the btree bulkloader to write new btree blocks in 256K chunks to moderate memory consumption if the new btree is very large. As a consequence of that, it's possible that the buffers for lower level blocks might have been reclaimed by the time the node builder comes back to the block. Therefore, change xfs_btree_bload_node to read the lower level blocks to handle the reclaimed buffer case. As a side effect, the read will increase the LRU refs, which will bias towards keeping new btree buffers in memory after the new btree commits. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_btree.c | 2 +- libxfs/xfs_btree.h | 3 +++ libxfs/xfs_btree_staging.c | 7 ++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 85f8bef0610a..97962fc16ec4 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -1327,7 +1327,7 @@ xfs_btree_get_buf_block( * Read in the buffer at the given ptr and return the buffer and * the block pointer within the buffer. */ -STATIC int +int xfs_btree_read_buf_block( struct xfs_btree_cur *cur, const union xfs_btree_ptr *ptr, diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 4d68a58be160..e0875cec4939 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -700,6 +700,9 @@ void xfs_btree_set_ptr_null(struct xfs_btree_cur *cur, int xfs_btree_get_buf_block(struct xfs_btree_cur *cur, const union xfs_btree_ptr *ptr, struct xfs_btree_block **block, struct xfs_buf **bpp); +int xfs_btree_read_buf_block(struct xfs_btree_cur *cur, + const union xfs_btree_ptr *ptr, int flags, + struct xfs_btree_block **block, struct xfs_buf **bpp); void xfs_btree_set_sibling(struct xfs_btree_cur *cur, struct xfs_btree_block *block, const union xfs_btree_ptr *ptr, int lr); diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index ae2d9c63f484..be0b43e45f52 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -489,7 +489,12 @@ xfs_btree_bload_node( ASSERT(!xfs_btree_ptr_is_null(cur, child_ptr)); - ret = xfs_btree_get_buf_block(cur, child_ptr, &child_block, + /* + * Read the lower-level block in case the buffer for it has + * been reclaimed. LRU refs will be set on the block, which is + * desirable if the new btree commits. + */ + ret = xfs_btree_read_buf_block(cur, child_ptr, 0, &child_block, &child_bp); if (ret) return ret; From patchwork Wed Mar 13 02:01:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590872 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A9E0DF5A for ; Wed, 13 Mar 2024 02:01:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295283; cv=none; b=dPUdwI+Up4pDe6/Dhl0oPrhQ+7ju9yw5R66OtGdTqTK2igtvCyX7rBKtK8A+rg4YeMmkNottqxkhMkNn85Hes1CvErcj0DxHjVyeb8hW22BNpu1wtlkLAHAPnRDW6CIjOYAYAvU/Scz4kfIckh8w2qiVz13cyIMXf5kDbmFJVaw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295283; c=relaxed/simple; bh=0IhEvch5UoDrH8/+SpO74lsJIdwTV8PHX+uey83Y140=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Vl+1Ak7J2VcAGM0ls+oW9V1ny7WLEg2j6mXKLTV3GH5Qvp6x/2lr9SznmI1R/Lm4LW2OIWR3lGzntZj+ofs9Bu7/rPJPDksRtKsGfA7SgUfsnzaajkJ0w8edNn+E34alFrZ2IMSWFcEkiNWBiMNLGy96eUz6jy7DeHswMNAWQdQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RQrE8jmx; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RQrE8jmx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F546C433C7; Wed, 13 Mar 2024 02:01:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295283; bh=0IhEvch5UoDrH8/+SpO74lsJIdwTV8PHX+uey83Y140=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=RQrE8jmxfWHpBKY2fVAsJi68PjYEKmVkiHhVI0pbQKZ1YsnSbq5nxjJjuBwjh6TS6 Z3EkeSJDO8PZgoF2moazv9gD7/B5ZZc5WZIgTtFwzemBgfZZodHicpOeqxlaN2Z81E kdTuOiR0sR1mUF2KYgAIL0pD1pEytzgXkjHQd9nJSARljNZaiAAJiG1UsoAbBbFFZ9 t9Y1PzSVbl55//Cx2f/qTPItiX/xJdWEeG8qAeVWbIqTsU4A3OrrKP+n6aW5ybwdM6 3wv2kQkuJwYJCyK0HEb00kCHbmmtH3M3Yuw6ZwQkoY4CYD6gOJic9wwMlUy1HRnIBe kWjePD7ebskHA== Date: Tue, 12 Mar 2024 19:01:22 -0700 Subject: [PATCH 32/67] xfs: move btree bulkload record initialization to ->get_record implementations From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431655.2061787.14041260175624457685.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 6dfeb0c2ecde71d61af77f65eabbdd6ca9315161 When we're performing a bulk load of a btree, move the code that actually stores the btree record in the new btree block out of the generic code and into the individual ->get_record implementations. This is preparation for being able to store multiple records with a single indirect call. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_api_defs.h | 1 + libxfs/xfs_btree_staging.c | 17 ++++++------- libxfs/xfs_btree_staging.h | 15 ++++++++---- repair/agbtree.c | 56 +++++++++++++++++++++++++++++++++----------- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 1828e4773555..7c055e8aa61e 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -53,6 +53,7 @@ #define xfs_btree_bload_compute_geometry libxfs_btree_bload_compute_geometry #define xfs_btree_del_cursor libxfs_btree_del_cursor #define xfs_btree_init_block libxfs_btree_init_block +#define xfs_btree_rec_addr libxfs_btree_rec_addr #define xfs_buf_delwri_submit libxfs_buf_delwri_submit #define xfs_buf_get libxfs_buf_get #define xfs_buf_get_uncached libxfs_buf_get_uncached diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index be0b43e45f52..a6f0d7d3b286 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -440,22 +440,19 @@ STATIC int xfs_btree_bload_leaf( struct xfs_btree_cur *cur, unsigned int recs_this_block, - xfs_btree_bload_get_record_fn get_record, + xfs_btree_bload_get_records_fn get_records, struct xfs_btree_block *block, void *priv) { - unsigned int j; + unsigned int j = 1; int ret; /* Fill the leaf block with records. */ - for (j = 1; j <= recs_this_block; j++) { - union xfs_btree_rec *block_rec; - - ret = get_record(cur, priv); - if (ret) + while (j <= recs_this_block) { + ret = get_records(cur, j, block, recs_this_block - j + 1, priv); + if (ret < 0) return ret; - block_rec = xfs_btree_rec_addr(cur, j, block); - cur->bc_ops->init_rec_from_cur(cur, block_rec); + j += ret; } return 0; @@ -798,7 +795,7 @@ xfs_btree_bload( trace_xfs_btree_bload_block(cur, level, i, blocks, &ptr, nr_this_block); - ret = xfs_btree_bload_leaf(cur, nr_this_block, bbl->get_record, + ret = xfs_btree_bload_leaf(cur, nr_this_block, bbl->get_records, block, priv); if (ret) goto out; diff --git a/libxfs/xfs_btree_staging.h b/libxfs/xfs_btree_staging.h index 5f638f711246..bd5b3f004823 100644 --- a/libxfs/xfs_btree_staging.h +++ b/libxfs/xfs_btree_staging.h @@ -47,7 +47,9 @@ void xfs_btree_commit_ifakeroot(struct xfs_btree_cur *cur, struct xfs_trans *tp, int whichfork, const struct xfs_btree_ops *ops); /* Bulk loading of staged btrees. */ -typedef int (*xfs_btree_bload_get_record_fn)(struct xfs_btree_cur *cur, void *priv); +typedef int (*xfs_btree_bload_get_records_fn)(struct xfs_btree_cur *cur, + unsigned int idx, struct xfs_btree_block *block, + unsigned int nr_wanted, void *priv); typedef int (*xfs_btree_bload_claim_block_fn)(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr, void *priv); typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur, @@ -55,11 +57,14 @@ typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur, struct xfs_btree_bload { /* - * This function will be called nr_records times to load records into - * the btree. The function does this by setting the cursor's bc_rec - * field in in-core format. Records must be returned in sort order. + * This function will be called to load @nr_wanted records into the + * btree. The implementation does this by setting the cursor's bc_rec + * field in in-core format and using init_rec_from_cur to set the + * records in the btree block. Records must be returned in sort order. + * The function must return the number of records loaded or the usual + * negative errno. */ - xfs_btree_bload_get_record_fn get_record; + xfs_btree_bload_get_records_fn get_records; /* * This function will be called nr_blocks times to obtain a pointer diff --git a/repair/agbtree.c b/repair/agbtree.c index 7211765d3d32..10a0c7e48c9a 100644 --- a/repair/agbtree.c +++ b/repair/agbtree.c @@ -209,18 +209,25 @@ get_bno_rec( /* Grab one bnobt record and put it in the btree cursor. */ static int -get_bnobt_record( +get_bnobt_records( struct xfs_btree_cur *cur, + unsigned int idx, + struct xfs_btree_block *block, + unsigned int nr_wanted, void *priv) { struct bt_rebuild *btr = priv; struct xfs_alloc_rec_incore *arec = &cur->bc_rec.a; + union xfs_btree_rec *block_rec; btr->bno_rec = get_bno_rec(cur, btr->bno_rec); arec->ar_startblock = btr->bno_rec->ex_startblock; arec->ar_blockcount = btr->bno_rec->ex_blockcount; btr->freeblks += btr->bno_rec->ex_blockcount; - return 0; + + block_rec = libxfs_btree_rec_addr(cur, idx, block); + cur->bc_ops->init_rec_from_cur(cur, block_rec); + return 1; } void @@ -247,10 +254,10 @@ init_freespace_cursors( btr_cnt->cur = libxfs_allocbt_stage_cursor(sc->mp, &btr_cnt->newbt.afake, pag, XFS_BTNUM_CNT); - btr_bno->bload.get_record = get_bnobt_record; + btr_bno->bload.get_records = get_bnobt_records; btr_bno->bload.claim_block = rebuild_claim_block; - btr_cnt->bload.get_record = get_bnobt_record; + btr_cnt->bload.get_records = get_bnobt_records; btr_cnt->bload.claim_block = rebuild_claim_block; /* @@ -371,13 +378,17 @@ get_ino_rec( /* Grab one inobt record. */ static int -get_inobt_record( +get_inobt_records( struct xfs_btree_cur *cur, + unsigned int idx, + struct xfs_btree_block *block, + unsigned int nr_wanted, void *priv) { struct bt_rebuild *btr = priv; struct xfs_inobt_rec_incore *irec = &cur->bc_rec.i; struct ino_tree_node *ino_rec; + union xfs_btree_rec *block_rec; int inocnt = 0; int finocnt = 0; int k; @@ -431,7 +442,10 @@ get_inobt_record( btr->first_agino = ino_rec->ino_startnum; btr->freecount += finocnt; btr->count += inocnt; - return 0; + + block_rec = libxfs_btree_rec_addr(cur, idx, block); + cur->bc_ops->init_rec_from_cur(cur, block_rec); + return 1; } /* Initialize both inode btree cursors as needed. */ @@ -490,7 +504,7 @@ init_ino_cursors( btr_ino->cur = libxfs_inobt_stage_cursor(pag, &btr_ino->newbt.afake, XFS_BTNUM_INO); - btr_ino->bload.get_record = get_inobt_record; + btr_ino->bload.get_records = get_inobt_records; btr_ino->bload.claim_block = rebuild_claim_block; btr_ino->first_agino = NULLAGINO; @@ -510,7 +524,7 @@ _("Unable to compute inode btree geometry, error %d.\n"), error); btr_fino->cur = libxfs_inobt_stage_cursor(pag, &btr_fino->newbt.afake, XFS_BTNUM_FINO); - btr_fino->bload.get_record = get_inobt_record; + btr_fino->bload.get_records = get_inobt_records; btr_fino->bload.claim_block = rebuild_claim_block; btr_fino->first_agino = NULLAGINO; @@ -560,16 +574,23 @@ _("Error %d while creating finobt btree for AG %u.\n"), error, agno); /* Grab one rmap record. */ static int -get_rmapbt_record( +get_rmapbt_records( struct xfs_btree_cur *cur, + unsigned int idx, + struct xfs_btree_block *block, + unsigned int nr_wanted, void *priv) { struct xfs_rmap_irec *rec; struct bt_rebuild *btr = priv; + union xfs_btree_rec *block_rec; rec = pop_slab_cursor(btr->slab_cursor); memcpy(&cur->bc_rec.r, rec, sizeof(struct xfs_rmap_irec)); - return 0; + + block_rec = libxfs_btree_rec_addr(cur, idx, block); + cur->bc_ops->init_rec_from_cur(cur, block_rec); + return 1; } /* Set up the rmap rebuild parameters. */ @@ -589,7 +610,7 @@ init_rmapbt_cursor( init_rebuild(sc, &XFS_RMAP_OINFO_AG, est_agfreeblocks, btr); btr->cur = libxfs_rmapbt_stage_cursor(sc->mp, &btr->newbt.afake, pag); - btr->bload.get_record = get_rmapbt_record; + btr->bload.get_records = get_rmapbt_records; btr->bload.claim_block = rebuild_claim_block; /* Compute how many blocks we'll need. */ @@ -631,16 +652,23 @@ _("Error %d while creating rmap btree for AG %u.\n"), error, agno); /* Grab one refcount record. */ static int -get_refcountbt_record( +get_refcountbt_records( struct xfs_btree_cur *cur, + unsigned int idx, + struct xfs_btree_block *block, + unsigned int nr_wanted, void *priv) { struct xfs_refcount_irec *rec; struct bt_rebuild *btr = priv; + union xfs_btree_rec *block_rec; rec = pop_slab_cursor(btr->slab_cursor); memcpy(&cur->bc_rec.rc, rec, sizeof(struct xfs_refcount_irec)); - return 0; + + block_rec = libxfs_btree_rec_addr(cur, idx, block); + cur->bc_ops->init_rec_from_cur(cur, block_rec); + return 1; } /* Set up the refcount rebuild parameters. */ @@ -661,7 +689,7 @@ init_refc_cursor( btr->cur = libxfs_refcountbt_stage_cursor(sc->mp, &btr->newbt.afake, pag); - btr->bload.get_record = get_refcountbt_record; + btr->bload.get_records = get_refcountbt_records; btr->bload.claim_block = rebuild_claim_block; /* Compute how many blocks we'll need. */ From patchwork Wed Mar 13 02:01:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590873 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AE51B652 for ; Wed, 13 Mar 2024 02:01:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295299; cv=none; b=YIvy6pIVem9q4dyuAeEoQSVwEKcDsfCsAkaByTH/gxMJCAlG9IWaLJQ8dn+C+rDpbzdPidJeMfYLI7/mTcNUmgywMqiZN9I3iPStLZA8mYJJ5HFtV0jgnuni55yz937t0vAOtfL/iJFgyj4ZlEo4sL3hDISu3uFwq5ZXS93ArdQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295299; c=relaxed/simple; bh=VtSZ2TzdaE00RcjWZI3SncWUw7Rb9INRWxOlmGmIgek=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qlIWD3KYdeopyrH693zmeyPcvk+a2hPiT5hko3Ei8VqFRMidnVMMATZ6UbET6vwbrcKP8Bikwz0AxzvVzAJX2/ZbIH0i/T4DZqTt+E7+2TjyJk+CH9Pz+C8OJVnyPBm7hv4BNU6zwjpea++MPOomVLLxSHOwkXnJDv9obnTL760= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J1e5WtiU; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="J1e5WtiU" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD473C433F1; Wed, 13 Mar 2024 02:01:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295298; bh=VtSZ2TzdaE00RcjWZI3SncWUw7Rb9INRWxOlmGmIgek=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=J1e5WtiU1GGaTZ0ClXLIygeq9dedjhHSl7T3hGj2YBG6JWk8ZwBla/bHgcb2/2o8k 2Key+hk5C7b5xnLTmmSASsAL4gZHEzzZR76fEmueh1m/wviBmLNgPPDXVlf8uVxaNP UbTlK7Ji+ikzX9I8F+QrvId0UUkU4FqIOYe1wop0tikOF1lSfF2P2z2uEvreCtMlZv XoEbtDH0Rd65t2R/uU/pJ4EdCACLt3nC4c9RD+M6I95D+Z1AP8HTK318JPKNzYfKvq EO/fIdLHJCZ+N1gnSAh8elBK9CiVe2a+OBquxBvqP74rs1N6z2oYEfp/3y3wFdIw5M a+78xiTdcfCZA== Date: Tue, 12 Mar 2024 19:01:38 -0700 Subject: [PATCH 33/67] xfs: constrain dirty buffers while formatting a staged btree From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431670.2061787.13362373960946016966.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e069d549705e49841247acf9b3176744e27d5425 Constrain the number of dirty buffers that are locked by the btree staging code at any given time by establishing a threshold at which we put them all on the delwri queue and push them to disk. This limits memory consumption while writing out new btrees. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_btree_staging.c | 50 ++++++++++++++++++++++++++++++++++---------- libxfs/xfs_btree_staging.h | 10 +++++++++ repair/agbtree.c | 1 + 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index a6f0d7d3b286..d4164e37bd38 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -333,24 +333,41 @@ xfs_btree_commit_ifakeroot( /* * Put a btree block that we're loading onto the ordered list and release it. * The btree blocks will be written to disk when bulk loading is finished. + * If we reach the dirty buffer threshold, flush them to disk before + * continuing. */ -static void +static int xfs_btree_bload_drop_buf( - struct list_head *buffers_list, - struct xfs_buf **bpp) + struct xfs_btree_bload *bbl, + struct list_head *buffers_list, + struct xfs_buf **bpp) { - if (*bpp == NULL) - return; + struct xfs_buf *bp = *bpp; + int error; + + if (!bp) + return 0; /* * Mark this buffer XBF_DONE (i.e. uptodate) so that a subsequent * xfs_buf_read will not pointlessly reread the contents from the disk. */ - (*bpp)->b_flags |= XBF_DONE; + bp->b_flags |= XBF_DONE; - xfs_buf_delwri_queue_here(*bpp, buffers_list); - xfs_buf_relse(*bpp); + xfs_buf_delwri_queue_here(bp, buffers_list); + xfs_buf_relse(bp); *bpp = NULL; + bbl->nr_dirty++; + + if (!bbl->max_dirty || bbl->nr_dirty < bbl->max_dirty) + return 0; + + error = xfs_buf_delwri_submit(buffers_list); + if (error) + return error; + + bbl->nr_dirty = 0; + return 0; } /* @@ -422,7 +439,10 @@ xfs_btree_bload_prep_block( */ if (*blockp) xfs_btree_set_sibling(cur, *blockp, &new_ptr, XFS_BB_RIGHTSIB); - xfs_btree_bload_drop_buf(buffers_list, bpp); + + ret = xfs_btree_bload_drop_buf(bbl, buffers_list, bpp); + if (ret) + return ret; /* Initialize the new btree block. */ xfs_btree_init_block_cur(cur, new_bp, level, nr_this_block); @@ -770,6 +790,7 @@ xfs_btree_bload( cur->bc_nlevels = bbl->btree_height; xfs_btree_set_ptr_null(cur, &child_ptr); xfs_btree_set_ptr_null(cur, &ptr); + bbl->nr_dirty = 0; xfs_btree_bload_level_geometry(cur, bbl, level, nr_this_level, &avg_per_block, &blocks, &blocks_with_extra); @@ -808,7 +829,10 @@ xfs_btree_bload( xfs_btree_copy_ptrs(cur, &child_ptr, &ptr, 1); } total_blocks += blocks; - xfs_btree_bload_drop_buf(&buffers_list, &bp); + + ret = xfs_btree_bload_drop_buf(bbl, &buffers_list, &bp); + if (ret) + goto out; /* Populate the internal btree nodes. */ for (level = 1; level < cur->bc_nlevels; level++) { @@ -850,7 +874,11 @@ xfs_btree_bload( xfs_btree_copy_ptrs(cur, &first_ptr, &ptr, 1); } total_blocks += blocks; - xfs_btree_bload_drop_buf(&buffers_list, &bp); + + ret = xfs_btree_bload_drop_buf(bbl, &buffers_list, &bp); + if (ret) + goto out; + xfs_btree_copy_ptrs(cur, &child_ptr, &first_ptr, 1); } diff --git a/libxfs/xfs_btree_staging.h b/libxfs/xfs_btree_staging.h index bd5b3f004823..f0a5007284ef 100644 --- a/libxfs/xfs_btree_staging.h +++ b/libxfs/xfs_btree_staging.h @@ -112,6 +112,16 @@ struct xfs_btree_bload { * height of the new btree. */ unsigned int btree_height; + + /* + * Flush the new btree block buffer list to disk after this many blocks + * have been formatted. Zero prohibits writing any buffers until all + * blocks have been formatted. + */ + uint16_t max_dirty; + + /* Number of dirty buffers. */ + uint16_t nr_dirty; }; int xfs_btree_bload_compute_geometry(struct xfs_btree_cur *cur, diff --git a/repair/agbtree.c b/repair/agbtree.c index 10a0c7e48c9a..981d8e340bf2 100644 --- a/repair/agbtree.c +++ b/repair/agbtree.c @@ -23,6 +23,7 @@ init_rebuild( memset(btr, 0, sizeof(struct bt_rebuild)); bulkload_init_ag(&btr->newbt, sc, oinfo); + btr->bload.max_dirty = XFS_B_TO_FSBT(sc->mp, 256U << 10); /* 256K */ bulkload_estimate_ag_slack(sc, &btr->bload, est_agfreeblocks); } From patchwork Wed Mar 13 02:01:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590875 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7AAFBA27 for ; Wed, 13 Mar 2024 02:01:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295314; cv=none; b=pKeCev4JJEqVdz5gJSuFJrZ7mkK4yzBLxeBqwZSoBXK9WJeyqPtg4E/ZgOuFHxCmPzCkqPqsxDnECab5Qys15G9G3Pj2Q0a2Iwrl586UohiDsQzJajNwfVJdYdjDPwrUA7IVhWfM7exYkv6kYzdNhPdWBkwLcKL3EXpEInGJe9c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295314; c=relaxed/simple; bh=A2Z8L0rySY17juv3ButKhlddM2yPv/JM6uODv9aGJIQ=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rKETzhPoW4sq8KgLM9gqeYyBXPx1FfwCGIDBCeyviAVwFOZWg7vayeHn4LnQ/2kKxK5dNO/sa64P+kHIiW6dp+nWH7oNO7E7I6HHsOqXHkgD0ore5jb18SDqR5MU5wIqVcGJP4p04kIaC0/cWtIuYOuJ3zvpJzuAo7H0j7VoVLE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H8viOrLo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="H8viOrLo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 83545C433F1; Wed, 13 Mar 2024 02:01:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295314; bh=A2Z8L0rySY17juv3ButKhlddM2yPv/JM6uODv9aGJIQ=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=H8viOrLoxKHcFYv3ModHpwZAxG9j74r5uE7GKzg4o5KWZ9wv9lJYJGL3AsCdtT3qk eV5lX6lxUheb+oQWNYxFBC1pmRYL5j9OlCvL20sX0U1ehbMJmtCqqjYvMCaWtJKDtB HuxHDQJv6Ahexs+PSqsLAlo0ymTAnK9V3XkdkatZU7tm6bYB5oab+g8SQHQZnbuHuA v+/OsIfbqERxcKPqVvuJYpGTPs/hrNHk1SWm18UHreImeRBoyYACAZzFJnKdHO6Gl4 B/i5P++2XkBKoY+NH+z+H1DR5b9ISBXhgABmuu7XHi0480ty72aGJkh5pxI4omlhOG 5QL8Od1jrJ5sg== Date: Tue, 12 Mar 2024 19:01:54 -0700 Subject: [PATCH 34/67] xfs: repair free space btrees From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431684.2061787.4118559152114519725.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 4bdfd7d15747b170ce93a06fafccaf20544b6684 Rebuild the free space btrees from the gaps in the rmap btree. Refer to the case study in Documentation/filesystems/xfs-online-fsck-design.rst for more details. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_ag.h | 9 +++++++++ libxfs/xfs_ag_resv.c | 2 ++ libxfs/xfs_alloc.c | 10 ++++------ libxfs/xfs_alloc.h | 2 +- libxfs/xfs_alloc_btree.c | 13 ++++++++++++- libxfs/xfs_types.h | 7 +++++++ 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/libxfs/xfs_ag.h b/libxfs/xfs_ag.h index 2e0aef87d633..f16cb7a174d4 100644 --- a/libxfs/xfs_ag.h +++ b/libxfs/xfs_ag.h @@ -80,6 +80,15 @@ struct xfs_perag { */ uint16_t pag_checked; uint16_t pag_sick; + +#ifdef CONFIG_XFS_ONLINE_REPAIR + /* + * Alternate btree heights so that online repair won't trip the write + * verifiers while rebuilding the AG btrees. + */ + uint8_t pagf_repair_levels[XFS_BTNUM_AGF]; +#endif + spinlock_t pag_state_lock; spinlock_t pagb_lock; /* lock for pagb_tree */ diff --git a/libxfs/xfs_ag_resv.c b/libxfs/xfs_ag_resv.c index 29bbcb55d731..3a80b1613e18 100644 --- a/libxfs/xfs_ag_resv.c +++ b/libxfs/xfs_ag_resv.c @@ -410,6 +410,8 @@ xfs_ag_resv_free_extent( fallthrough; case XFS_AG_RESV_NONE: xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (int64_t)len); + fallthrough; + case XFS_AG_RESV_IGNORE: return; } diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index aaa1596157e9..352efbeca9f4 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -242,11 +242,9 @@ xfs_alloc_btrec_to_irec( /* Simple checks for free space records. */ xfs_failaddr_t xfs_alloc_check_irec( - struct xfs_btree_cur *cur, - const struct xfs_alloc_rec_incore *irec) + struct xfs_perag *pag, + const struct xfs_alloc_rec_incore *irec) { - struct xfs_perag *pag = cur->bc_ag.pag; - if (irec->ar_blockcount == 0) return __this_address; @@ -295,7 +293,7 @@ xfs_alloc_get_rec( return error; xfs_alloc_btrec_to_irec(rec, &irec); - fa = xfs_alloc_check_irec(cur, &irec); + fa = xfs_alloc_check_irec(cur->bc_ag.pag, &irec); if (fa) return xfs_alloc_complain_bad_rec(cur, fa, &irec); @@ -3940,7 +3938,7 @@ xfs_alloc_query_range_helper( xfs_failaddr_t fa; xfs_alloc_btrec_to_irec(rec, &irec); - fa = xfs_alloc_check_irec(cur, &irec); + fa = xfs_alloc_check_irec(cur->bc_ag.pag, &irec); if (fa) return xfs_alloc_complain_bad_rec(cur, fa, &irec); diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 851cafbd6449..0b956f8b9d5a 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -185,7 +185,7 @@ xfs_alloc_get_rec( union xfs_btree_rec; void xfs_alloc_btrec_to_irec(const union xfs_btree_rec *rec, struct xfs_alloc_rec_incore *irec); -xfs_failaddr_t xfs_alloc_check_irec(struct xfs_btree_cur *cur, +xfs_failaddr_t xfs_alloc_check_irec(struct xfs_perag *pag, const struct xfs_alloc_rec_incore *irec); int xfs_read_agf(struct xfs_perag *pag, struct xfs_trans *tp, int flags, diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 5ec14288d570..a472ec6d21a2 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -321,7 +321,18 @@ xfs_allocbt_verify( if (bp->b_ops->magic[0] == cpu_to_be32(XFS_ABTC_MAGIC)) btnum = XFS_BTNUM_CNTi; if (pag && xfs_perag_initialised_agf(pag)) { - if (level >= pag->pagf_levels[btnum]) + unsigned int maxlevel = pag->pagf_levels[btnum]; + +#ifdef CONFIG_XFS_ONLINE_REPAIR + /* + * Online repair could be rewriting the free space btrees, so + * we'll validate against the larger of either tree while this + * is going on. + */ + maxlevel = max_t(unsigned int, maxlevel, + pag->pagf_repair_levels[btnum]); +#endif + if (level >= maxlevel) return __this_address; } else if (level >= mp->m_alloc_maxlevels) return __this_address; diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index 533200c4ccc2..035bf703d719 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -208,6 +208,13 @@ enum xfs_ag_resv_type { XFS_AG_RESV_AGFL, XFS_AG_RESV_METADATA, XFS_AG_RESV_RMAPBT, + + /* + * Don't increase fdblocks when freeing extent. This is a pony for + * the bnobt repair functions to re-free the free space without + * altering fdblocks. If you think you need this you're wrong. + */ + XFS_AG_RESV_IGNORE, }; /* Results of scanning a btree keyspace to check occupancy. */ From patchwork Wed Mar 13 02:02:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590876 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B10ABA27 for ; Wed, 13 Mar 2024 02:02:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295330; cv=none; b=CaJ42tBfPWVARdZop+sPcFP4HIXu41QlxZwJfveWp2e2yhLMjO2a1qoMeCWqvjuJC62B1tPvZiDNFIvIrJ5AhdQ/sV9d2PZLM0yLYNwvz6lFGpCxRE8WYxFMLhB+hq3CtmfwyMnP1jGWnDcVSKOFYL1pX8+OlQ1YJByLKMfoHdc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295330; c=relaxed/simple; bh=KktIAY77eM8f5+MJtAixwXtf1V7glpRBON4nvIaT+rA=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=orPsHxt65HuSSA0ze33cr9ZQPxWWQQnj6WF3EOkU1AoBLdWkxiq7u6OQRAWnF4q8lLEA/h/uw5LFgM0iyTzvxGrqCmBDwd1nZxG/iu1MxxXyyZrLc8up8N7S2j48Vhxu+WSnkP51zwcVrBqpoqZN7Ixi3CYhig8KoCqpgmigmQo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QzLz4vq4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QzLz4vq4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23909C433F1; Wed, 13 Mar 2024 02:02:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295330; bh=KktIAY77eM8f5+MJtAixwXtf1V7glpRBON4nvIaT+rA=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=QzLz4vq4RA0V/n9wKC24Uv5MO7lfOt2CzeZjFrve+YIEk5X3IGCu1jd/BpLkWZXcw gXQEN2SxiBEfof/NVZzLD/YDCvLU3repforZmrr2RBquzq4Rr8O/RjePlW41wtZzRK 3r+heZOxQUrieuhlBahZWoLn/Asc4SSiUA1+yDi5OSUKxvpMx8IkdU7UFhCPOvXl9r Qpf+NP326yNRiAFm8j9ITSrToPXkI0AfV94I8WiGQIzzVE8zl7zTK4EVls4WUMuzhn XFKV6nS/+uV9MLGevImTTe2fRhIhzjraN4n2v0kkvXEgAQuJl4G2p0/b4WPi+wWaF6 PBhm/rs/WSU6w== Date: Tue, 12 Mar 2024 19:02:09 -0700 Subject: [PATCH 35/67] xfs: repair inode btrees From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431698.2061787.15853543079792941380.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: dbfbf3bdf639a20da7d5fb390cd2e197d25aa418 Use the rmapbt to find inode chunks, query the chunks to compute hole and free masks, and with that information rebuild the inobt and finobt. Refer to the case study in Documentation/filesystems/xfs-online-fsck-design.rst for more details. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_ialloc.c | 31 ++++++++++++++++++------------- libxfs/xfs_ialloc.h | 3 ++- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 14826280d46e..5ff09c8c9439 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -90,18 +90,28 @@ xfs_inobt_btrec_to_irec( irec->ir_free = be64_to_cpu(rec->inobt.ir_free); } +/* Compute the freecount of an incore inode record. */ +uint8_t +xfs_inobt_rec_freecount( + const struct xfs_inobt_rec_incore *irec) +{ + uint64_t realfree = irec->ir_free; + + if (xfs_inobt_issparse(irec->ir_holemask)) + realfree &= xfs_inobt_irec_to_allocmask(irec); + return hweight64(realfree); +} + /* Simple checks for inode records. */ xfs_failaddr_t xfs_inobt_check_irec( - struct xfs_btree_cur *cur, + struct xfs_perag *pag, const struct xfs_inobt_rec_incore *irec) { - uint64_t realfree; - /* Record has to be properly aligned within the AG. */ - if (!xfs_verify_agino(cur->bc_ag.pag, irec->ir_startino)) + if (!xfs_verify_agino(pag, irec->ir_startino)) return __this_address; - if (!xfs_verify_agino(cur->bc_ag.pag, + if (!xfs_verify_agino(pag, irec->ir_startino + XFS_INODES_PER_CHUNK - 1)) return __this_address; if (irec->ir_count < XFS_INODES_PER_HOLEMASK_BIT || @@ -110,12 +120,7 @@ xfs_inobt_check_irec( if (irec->ir_freecount > XFS_INODES_PER_CHUNK) return __this_address; - /* if there are no holes, return the first available offset */ - if (!xfs_inobt_issparse(irec->ir_holemask)) - realfree = irec->ir_free; - else - realfree = irec->ir_free & xfs_inobt_irec_to_allocmask(irec); - if (hweight64(realfree) != irec->ir_freecount) + if (xfs_inobt_rec_freecount(irec) != irec->ir_freecount) return __this_address; return NULL; @@ -159,7 +164,7 @@ xfs_inobt_get_rec( return error; xfs_inobt_btrec_to_irec(mp, rec, irec); - fa = xfs_inobt_check_irec(cur, irec); + fa = xfs_inobt_check_irec(cur->bc_ag.pag, irec); if (fa) return xfs_inobt_complain_bad_rec(cur, fa, irec); @@ -2735,7 +2740,7 @@ xfs_ialloc_count_inodes_rec( xfs_failaddr_t fa; xfs_inobt_btrec_to_irec(cur->bc_mp, rec, &irec); - fa = xfs_inobt_check_irec(cur, &irec); + fa = xfs_inobt_check_irec(cur->bc_ag.pag, &irec); if (fa) return xfs_inobt_complain_bad_rec(cur, fa, &irec); diff --git a/libxfs/xfs_ialloc.h b/libxfs/xfs_ialloc.h index fe824bb04a09..f1412183bb44 100644 --- a/libxfs/xfs_ialloc.h +++ b/libxfs/xfs_ialloc.h @@ -79,6 +79,7 @@ int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino, */ int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_inobt_rec_incore_t *rec, int *stat); +uint8_t xfs_inobt_rec_freecount(const struct xfs_inobt_rec_incore *irec); /* * Inode chunk initialisation routine @@ -93,7 +94,7 @@ union xfs_btree_rec; void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, const union xfs_btree_rec *rec, struct xfs_inobt_rec_incore *irec); -xfs_failaddr_t xfs_inobt_check_irec(struct xfs_btree_cur *cur, +xfs_failaddr_t xfs_inobt_check_irec(struct xfs_perag *pag, const struct xfs_inobt_rec_incore *irec); int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur, xfs_agblock_t bno, xfs_extlen_t len, From patchwork Wed Mar 13 02:02:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590877 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED606AD21 for ; Wed, 13 Mar 2024 02:02:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295346; cv=none; b=tbEzdZbbOuh59iVieNZnvqr/C/Gyag8jvAyQG2wpcUQB2ZZci0p3ThIlqtS3SaQzdjt/MxlgpU+MzfocrIl1YlXwb/p90hJ0oQEgT/y9PLNkGQoSAg8fIOoo1A0SAzXa7N7V/q+3FKZ3QiUgfqPp6i2koXGVpnITTiiRXDM5i5k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295346; c=relaxed/simple; bh=vU14kPU0CJzVB5Iwg6ReypGZK9XEpIx6P6pm19aKKdU=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IGRBX42RCDjEYEN1w3Pq0XrqtAzImMu6kxJ+bOutUb3sdiufEYk8S/Y2OHJt7PhJQPP6hpI8j5k1pMvp09aPTQWiM2zsiyzZisz53CPBdOhxD0VeOZfvYUCOFfaBOco9Ur1QC09yWcPSrCWb+qUnf0h0+1BYIkJhyMle3FS6NjM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SY8cTen/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SY8cTen/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C82ACC433C7; Wed, 13 Mar 2024 02:02:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295345; bh=vU14kPU0CJzVB5Iwg6ReypGZK9XEpIx6P6pm19aKKdU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=SY8cTen/+pRygnkF8AzGuKeZHd/ocVDUl8I7+8ASlSVmIVmUCrE/Mn57X6U8sKmKq d5ITkClC7rtzu0kUOQ7zSC6wjPRsIJuOF4Wdo0bvPNcqa/OvOOc7mbU7/vaObb+/jy 6Oo2RLgJy11xJW3kyCjVQj0S1q8k8cvaADF+RE91FW5DuFFagY65MpgRZn+VvzWSv0 i4bpJq9D5EF9tC9i0AmO2lXEdq5rxiDPGH2BVE8pXkmVtLW+f+b8WaYX/pRiH/dT5f ZKvQvcqEJnu194QDL7an9WABLSPPBxMYVAH3JomBu5f9Iw8dknbCGFtrAQG0EEU9M8 eBM1OPW0IOqyw== Date: Tue, 12 Mar 2024 19:02:25 -0700 Subject: [PATCH 36/67] xfs: repair refcount btrees From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Dave Chinner , Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431712.2061787.11066836435628414161.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 9099cd38002f8029c9a1da08e6832d1cd18e8451 Reconstruct the refcount data from the rmap btree. Link: https://docs.kernel.org/filesystems/xfs-online-fsck-design.html#case-study-rebuilding-the-space-reference-counts Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig --- libxfs/xfs_ag.h | 1 + libxfs/xfs_btree.c | 26 ++++++++++++++++++++++++++ libxfs/xfs_btree.h | 2 ++ libxfs/xfs_refcount.c | 8 +++----- libxfs/xfs_refcount.h | 2 +- libxfs/xfs_refcount_btree.c | 13 ++++++++++++- 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/libxfs/xfs_ag.h b/libxfs/xfs_ag.h index f16cb7a174d4..67c3260ee789 100644 --- a/libxfs/xfs_ag.h +++ b/libxfs/xfs_ag.h @@ -87,6 +87,7 @@ struct xfs_perag { * verifiers while rebuilding the AG btrees. */ uint8_t pagf_repair_levels[XFS_BTNUM_AGF]; + uint8_t pagf_repair_refcount_level; #endif spinlock_t pag_state_lock; diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 97962fc16ec4..0022bb641bee 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -5209,3 +5209,29 @@ xfs_btree_destroy_cur_caches(void) xfs_rmapbt_destroy_cur_cache(); xfs_refcountbt_destroy_cur_cache(); } + +/* Move the btree cursor before the first record. */ +int +xfs_btree_goto_left_edge( + struct xfs_btree_cur *cur) +{ + int stat = 0; + int error; + + memset(&cur->bc_rec, 0, sizeof(cur->bc_rec)); + error = xfs_btree_lookup(cur, XFS_LOOKUP_LE, &stat); + if (error) + return error; + if (!stat) + return 0; + + error = xfs_btree_decrement(cur, 0, &stat); + if (error) + return error; + if (stat != 0) { + ASSERT(0); + return -EFSCORRUPTED; + } + + return 0; +} diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index e0875cec4939..d906324e25c8 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -738,4 +738,6 @@ xfs_btree_alloc_cursor( int __init xfs_btree_init_cur_caches(void); void xfs_btree_destroy_cur_caches(void); +int xfs_btree_goto_left_edge(struct xfs_btree_cur *cur); + #endif /* __XFS_BTREE_H__ */ diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 45f8134e4314..3377fac1283b 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -122,11 +122,9 @@ xfs_refcount_btrec_to_irec( /* Simple checks for refcount records. */ xfs_failaddr_t xfs_refcount_check_irec( - struct xfs_btree_cur *cur, + struct xfs_perag *pag, const struct xfs_refcount_irec *irec) { - struct xfs_perag *pag = cur->bc_ag.pag; - if (irec->rc_blockcount == 0 || irec->rc_blockcount > MAXREFCEXTLEN) return __this_address; @@ -178,7 +176,7 @@ xfs_refcount_get_rec( return error; xfs_refcount_btrec_to_irec(rec, irec); - fa = xfs_refcount_check_irec(cur, irec); + fa = xfs_refcount_check_irec(cur->bc_ag.pag, irec); if (fa) return xfs_refcount_complain_bad_rec(cur, fa, irec); @@ -1898,7 +1896,7 @@ xfs_refcount_recover_extent( INIT_LIST_HEAD(&rr->rr_list); xfs_refcount_btrec_to_irec(rec, &rr->rr_rrec); - if (xfs_refcount_check_irec(cur, &rr->rr_rrec) != NULL || + if (xfs_refcount_check_irec(cur->bc_ag.pag, &rr->rr_rrec) != NULL || XFS_IS_CORRUPT(cur->bc_mp, rr->rr_rrec.rc_domain != XFS_REFC_DOMAIN_COW)) { kfree(rr); diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 783cd89ca195..5c207f1c619c 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -117,7 +117,7 @@ extern int xfs_refcount_has_records(struct xfs_btree_cur *cur, union xfs_btree_rec; extern void xfs_refcount_btrec_to_irec(const union xfs_btree_rec *rec, struct xfs_refcount_irec *irec); -xfs_failaddr_t xfs_refcount_check_irec(struct xfs_btree_cur *cur, +xfs_failaddr_t xfs_refcount_check_irec(struct xfs_perag *pag, const struct xfs_refcount_irec *irec); extern int xfs_refcount_insert(struct xfs_btree_cur *cur, struct xfs_refcount_irec *irec, int *stat); diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index bc8bd867eee7..ac1c3ab868e0 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -225,7 +225,18 @@ xfs_refcountbt_verify( level = be16_to_cpu(block->bb_level); if (pag && xfs_perag_initialised_agf(pag)) { - if (level >= pag->pagf_refcount_level) + unsigned int maxlevel = pag->pagf_refcount_level; + +#ifdef CONFIG_XFS_ONLINE_REPAIR + /* + * Online repair could be rewriting the refcount btree, so + * we'll validate against the larger of either tree while this + * is going on. + */ + maxlevel = max_t(unsigned int, maxlevel, + pag->pagf_repair_refcount_level); +#endif + if (level >= maxlevel) return __this_address; } else if (level >= mp->m_refc_maxlevels) return __this_address; From patchwork Wed Mar 13 02:02:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590878 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E064BE62 for ; Wed, 13 Mar 2024 02:02:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295361; cv=none; b=PiXdmxnjr0A32vkuOC5HLk5+gB0vWAgBezOtvz/5qPLeCf/UEO3eu5KJDHb2tg0kx/ry9gOWslfDqyeyAwgfI0sfjLXc+PxHHqqDuMBNlwSVzou3ne4TEAT5JAuC8ULin1R/uhLCK0i7TUt5foE2Ks4QCNEgYJ6tKDHZWQsezTI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295361; c=relaxed/simple; bh=8N5NcRROZG7flLFIOQBQwDoI+sJ6w8ptbIdDbwJCqtg=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=PgPQzkxjp7NbvgRUl1ZUi5egss5jHtEOBOq1B6+M1XMkQaIzVL4/rBxcgAR9w1klxpsLxFh9jX/c/2+DBrgxn4FlP09e1JbFLpsWngcE2eqOC8FmDK9mJ1NBhV8kuqegWAVc3ISAk954ZZrw9nj4mwHa/C5MSJ00X6BIVGlIQik= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ktzZW+CK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ktzZW+CK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 77330C433F1; Wed, 13 Mar 2024 02:02:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295361; bh=8N5NcRROZG7flLFIOQBQwDoI+sJ6w8ptbIdDbwJCqtg=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=ktzZW+CK0Sf1G1phmCtD1iTkMDXTZNCRA4JCfFFOQYDGibSftdw//BR+mfG4PNc8b mMBMYKJWtdE9Kemr78zgfGSn7BzxH6uEcnub+KAPqWrTZ8AG3uzKBzqLmp3A4N9iBE upHwv+zJeCGubnQj/rnISIR8oT21m2uaviZ9ILI+jm9fF0nRjJ1ftRGfPL5L9A2twd KNTQoGoF/OsDOqGD+yglOSKJnHrFsGJpBqAb8TXzZgfKcJje467eUzes/495cNRtjC XZ1VyLadP+g9Le80QNydPxpsP7w2t3LKNOF/GcxBEZWILUDjOO5hukAG2OWp7BeCmj ND36LjrYaEvmg== Date: Tue, 12 Mar 2024 19:02:40 -0700 Subject: [PATCH 37/67] xfs: dont cast to char * for XFS_DFORK_*PTR macros From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431726.2061787.3502482156872365054.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 6b5d917780219d0d8f8e2cefefcb6f50987d0fa3 Code in the next patch will assign the return value of XFS_DFORK_*PTR macros to a struct pointer. gcc complains about casting char* strings to struct pointers, so let's fix the macro's cast to void* to shut up the warnings. While we're at it, fix one of the scrub tests that uses PTR to use BOFF instead for a simpler integer comparison, since other linters whine about char* and void* comparisons. Can't satisfy all these dman bots. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_format.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 9a88aba1589f..f16974126ff9 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1008,7 +1008,7 @@ enum xfs_dinode_fmt { * Return pointers to the data or attribute forks. */ #define XFS_DFORK_DPTR(dip) \ - ((char *)dip + xfs_dinode_size(dip->di_version)) + ((void *)dip + xfs_dinode_size(dip->di_version)) #define XFS_DFORK_APTR(dip) \ (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) #define XFS_DFORK_PTR(dip,w) \ From patchwork Wed Mar 13 02:02:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590879 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E8BEBA27 for ; Wed, 13 Mar 2024 02:02:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295377; cv=none; b=oKeQDWb7TsrzXTsWczq12QsZtAgUXvEiTAXg1FmuXFC4DULoiE8WYld7lJMXyZfhLS7kvpWsj9SfLrGMweAqOEfcMjZWfd9oNblxCBiJYYrk+R8+vldGJBJoVE859JVPPvqDOf6KX+OG5ZJkVri0dN5oAB20NMyX+kJgwKVKk80= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295377; c=relaxed/simple; bh=TwQe0RY3pXX2m3AFgUO/7oeqrMHAsXOFqXwAkvcOrT4=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DKIgH68SRQIOetRrl355Trrz8xbjNhZYRaH8I3EcREVGe/RI/qBqoLPH+tt2W1sbzaz8kMm32jBNelenGOyxB+6UsP/jJ4tJQRhBHBMcSduZh1DceHVQLeDaAX98PuXG7d9kaIxbX/0JIVKS6EnIO+77Uet1bLmGYpPBDjGj1oM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EF9zPSZH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EF9zPSZH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 25B6BC433C7; Wed, 13 Mar 2024 02:02:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295377; bh=TwQe0RY3pXX2m3AFgUO/7oeqrMHAsXOFqXwAkvcOrT4=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=EF9zPSZHiZFP3cCR54tqDt0OrT6Imeiohv309+GlnJQKqp1c7ly1ai4Kmf96LW29o dyQTzB/236cMnf9uOkB0Pf8LOnEegW0nzaN4Ud2Fl7fnPR+BXZiRb5dTnJT/I2CcvH bWTCjlqbmqkMeJRNSV+tfCzO2f1xtxaOlzdIhwBwV0LPTHwBHwbUtFxELGGoS85yxd wMscCjNOj1PJvcRQ+fkKAiS9tLrS4KMSZ0SfYFTqPtHNsY0d5xhtezam0Nx44oqsFo f6yLPyzxG/5S5wB8GdjeLlgrIVxvrOuQ4k4OFi+EXbQ7tk2YggxvFAAhczScydxPp8 tst4cqGYTM7KQ== Date: Tue, 12 Mar 2024 19:02:56 -0700 Subject: [PATCH 38/67] xfs: set inode sick state flags when we zap either ondisk fork From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431741.2061787.10784889103633621285.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: d9041681dd2f5334529a68868c9266631c384de4 In a few patches, we'll add some online repair code that tries to massage the ondisk inode record just enough to get it to pass the inode verifiers so that we can continue with more file repairs. Part of that massaging can include zapping the ondisk forks to clear errors. After that point, the bmap fork repair functions will rebuild the zapped forks. Christoph asked for stronger protections against online repair zapping a fork to get the inode to load vs. other threads trying to access the partially repaired file. Do this by adding a special "[DA]FORK_ZAPPED" inode health flag whenever repair zaps a fork, and sprinkling checks for that flag into the various file operations for things that don't like handling an unexpected zero-extents fork. In practice xfs_scrub will scrub and fix the forks almost immediately after zapping them, so the window is very small. However, if a crash or unmount should occur, we can still detect these zapped inode forks by looking for a zero-extents fork when data was expected. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_health.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libxfs/xfs_health.h b/libxfs/xfs_health.h index 99e796256c5d..6296993ff8f3 100644 --- a/libxfs/xfs_health.h +++ b/libxfs/xfs_health.h @@ -68,6 +68,11 @@ struct xfs_fsop_geom; #define XFS_SICK_INO_SYMLINK (1 << 6) /* symbolic link remote target */ #define XFS_SICK_INO_PARENT (1 << 7) /* parent pointers */ +#define XFS_SICK_INO_BMBTD_ZAPPED (1 << 8) /* data fork erased */ +#define XFS_SICK_INO_BMBTA_ZAPPED (1 << 9) /* attr fork erased */ +#define XFS_SICK_INO_DIR_ZAPPED (1 << 10) /* directory erased */ +#define XFS_SICK_INO_SYMLINK_ZAPPED (1 << 11) /* symlink erased */ + /* Primary evidence of health problems in a given group. */ #define XFS_SICK_FS_PRIMARY (XFS_SICK_FS_COUNTERS | \ XFS_SICK_FS_UQUOTA | \ @@ -97,6 +102,11 @@ struct xfs_fsop_geom; XFS_SICK_INO_SYMLINK | \ XFS_SICK_INO_PARENT) +#define XFS_SICK_INO_ZAPPED (XFS_SICK_INO_BMBTD_ZAPPED | \ + XFS_SICK_INO_BMBTA_ZAPPED | \ + XFS_SICK_INO_DIR_ZAPPED | \ + XFS_SICK_INO_SYMLINK_ZAPPED) + /* These functions must be provided by the xfs implementation. */ void xfs_fs_mark_sick(struct xfs_mount *mp, unsigned int mask); From patchwork Wed Mar 13 02:03:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590880 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 015628C1E for ; Wed, 13 Mar 2024 02:03:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295393; cv=none; b=iR7l1+BtWo9IvxLQhMvWXh2U0RRjle2HzTNz3GRGpSOTNiLYiE6THd/2WwsfSvB2g8PL05+4tjTSvMEt6qQrkn3GAIz5KGQ4GQoOt9vEuiUG7/yU5jXHt2fmf2qACLHOB74goVaS5B414y17eR01uqWLMS03FchT7RbfSrkcvjI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295393; c=relaxed/simple; bh=3kxywaNzhSQcLJwuPUBsBTnZQgO7bTvdlB8W/jm1AhU=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BUiOMjQ2LJhTT3Rlx5HfiqesWOvF4qGPNnsEvKZDc3zk4+4OcT75EPeN8i5Be/1dF2/3TfYwxIUhE2D1mlLuy+iaYC08qpo1vLhFoe9RS/dvhrye2Hxc0UnT/rYbdJ1LLCCAMZkKqhQ71Z7KjJk9tRBczVNfHDG9yiDw6YxGYDQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZFXbDJ+d; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZFXbDJ+d" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CCC55C433F1; Wed, 13 Mar 2024 02:03:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295392; bh=3kxywaNzhSQcLJwuPUBsBTnZQgO7bTvdlB8W/jm1AhU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=ZFXbDJ+d9/Htf2nnlfVNdM1k6541MVnjsDLqEY0P/PWkDd5qx/f3Kc7A+PQGIAxRM kSoNLLG+1RLVBvhqgQgPxsRvrarRBwzKJZbR/PXpEobIeTU+WHbFAJv1cDeMTW9oYK 8zDFnCeHPpBBsCLAIWmzNuhOO7qwL3hgS9ciQOBy1LNMcJkFH1ZmMgiHgF+0LT9k0n ZxOzTns7pDX1R4adO1RiaEyRGQVmHlo5QD1xKkTfEJVEDK2Yu/eoHCzSQ4L6ymsEXl g9P2gw0r+sjrcxCGNEbuFa9DBt0OKl4su+UBg+PnnnuIQUTxM0cseNAELcO5Rt3xrK lrJ1zUAku39eg== Date: Tue, 12 Mar 2024 19:03:12 -0700 Subject: [PATCH 39/67] xfs: zap broken inode forks From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431755.2061787.13320579564164713423.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: e744cef206055954517648070d2b3aaa3d2515ba Determine if inode fork damage is responsible for the inode being unable to pass the ifork verifiers in xfs_iget and zap the fork contents if this is true. Once this is done the fork will be empty but we'll be able to construct an in-core inode, and a subsequent call to the inode fork repair ioctl will search the rmapbt to rebuild the records that were in the fork. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_attr_leaf.c | 13 +++---------- libxfs/xfs_attr_leaf.h | 3 ++- libxfs/xfs_bmap.c | 22 ++++++++++++++++------ libxfs/xfs_bmap.h | 2 ++ libxfs/xfs_dir2_priv.h | 3 ++- libxfs/xfs_dir2_sf.c | 13 +++---------- libxfs/xfs_inode_fork.c | 33 ++++++++++++++++++++++++++------- libxfs/xfs_shared.h | 2 +- libxfs/xfs_symlink_remote.c | 8 ++------ 9 files changed, 57 insertions(+), 42 deletions(-) diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index baa168318f91..8329348eb78b 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -1037,23 +1037,16 @@ xfs_attr_shortform_allfit( return xfs_attr_shortform_bytesfit(dp, bytes); } -/* Verify the consistency of an inline attribute fork. */ +/* Verify the consistency of a raw inline attribute fork. */ xfs_failaddr_t xfs_attr_shortform_verify( - struct xfs_inode *ip) + struct xfs_attr_shortform *sfp, + size_t size) { - struct xfs_attr_shortform *sfp; struct xfs_attr_sf_entry *sfep; struct xfs_attr_sf_entry *next_sfep; char *endp; - struct xfs_ifork *ifp; int i; - int64_t size; - - ASSERT(ip->i_af.if_format == XFS_DINODE_FMT_LOCAL); - ifp = xfs_ifork_ptr(ip, XFS_ATTR_FORK); - sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data; - size = ifp->if_bytes; /* * Give up if the attribute is way too short. diff --git a/libxfs/xfs_attr_leaf.h b/libxfs/xfs_attr_leaf.h index 368f4d9fa1d5..ce6743463c86 100644 --- a/libxfs/xfs_attr_leaf.h +++ b/libxfs/xfs_attr_leaf.h @@ -56,7 +56,8 @@ int xfs_attr_sf_findname(struct xfs_da_args *args, unsigned int *basep); int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); int xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes); -xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_inode *ip); +xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_shortform *sfp, + size_t size); void xfs_attr_fork_remove(struct xfs_inode *ip, struct xfs_trans *tp); /* diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 6d23c5e3e652..534a516b59ba 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -6162,19 +6162,18 @@ xfs_bmap_finish_one( return error; } -/* Check that an inode's extent does not have invalid flags or bad ranges. */ +/* Check that an extent does not have invalid flags or bad ranges. */ xfs_failaddr_t -xfs_bmap_validate_extent( - struct xfs_inode *ip, +xfs_bmap_validate_extent_raw( + struct xfs_mount *mp, + bool rtfile, int whichfork, struct xfs_bmbt_irec *irec) { - struct xfs_mount *mp = ip->i_mount; - if (!xfs_verify_fileext(mp, irec->br_startoff, irec->br_blockcount)) return __this_address; - if (XFS_IS_REALTIME_INODE(ip) && whichfork == XFS_DATA_FORK) { + if (rtfile && whichfork == XFS_DATA_FORK) { if (!xfs_verify_rtbext(mp, irec->br_startblock, irec->br_blockcount)) return __this_address; @@ -6204,3 +6203,14 @@ xfs_bmap_intent_destroy_cache(void) kmem_cache_destroy(xfs_bmap_intent_cache); xfs_bmap_intent_cache = NULL; } + +/* Check that an inode's extent does not have invalid flags or bad ranges. */ +xfs_failaddr_t +xfs_bmap_validate_extent( + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *irec) +{ + return xfs_bmap_validate_extent_raw(ip->i_mount, + XFS_IS_REALTIME_INODE(ip), whichfork, irec); +} diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index e33470e39728..8518324db285 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -263,6 +263,8 @@ static inline uint32_t xfs_bmap_fork_to_state(int whichfork) } } +xfs_failaddr_t xfs_bmap_validate_extent_raw(struct xfs_mount *mp, bool rtfile, + int whichfork, struct xfs_bmbt_irec *irec); xfs_failaddr_t xfs_bmap_validate_extent(struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *irec); int xfs_bmap_complain_bad_rec(struct xfs_inode *ip, int whichfork, diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 7404a9ff1a92..1db2e60ba827 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -175,7 +175,8 @@ extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); extern int xfs_dir2_sf_removename(struct xfs_da_args *args); extern int xfs_dir2_sf_replace(struct xfs_da_args *args); -extern xfs_failaddr_t xfs_dir2_sf_verify(struct xfs_inode *ip); +xfs_failaddr_t xfs_dir2_sf_verify(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *sfp, int64_t size); int xfs_dir2_sf_entsize(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, int len); void xfs_dir2_sf_put_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 08b36c95ced2..260eccacf176 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -707,11 +707,10 @@ xfs_dir2_sf_check( /* Verify the consistency of an inline directory. */ xfs_failaddr_t xfs_dir2_sf_verify( - struct xfs_inode *ip) + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *sfp, + int64_t size) { - struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); - struct xfs_dir2_sf_hdr *sfp; struct xfs_dir2_sf_entry *sfep; struct xfs_dir2_sf_entry *next_sfep; char *endp; @@ -719,15 +718,9 @@ xfs_dir2_sf_verify( int i; int i8count; int offset; - int64_t size; int error; uint8_t filetype; - ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - - sfp = (struct xfs_dir2_sf_hdr *)ifp->if_u1.if_data; - size = ifp->if_bytes; - /* * Give up if the directory is way too short. */ diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 5cc056ff7a1b..3e2d7882a077 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -700,12 +700,22 @@ xfs_ifork_verify_local_data( xfs_failaddr_t fa = NULL; switch (VFS_I(ip)->i_mode & S_IFMT) { - case S_IFDIR: - fa = xfs_dir2_sf_verify(ip); + case S_IFDIR: { + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); + struct xfs_dir2_sf_hdr *sfp; + + sfp = (struct xfs_dir2_sf_hdr *)ifp->if_u1.if_data; + fa = xfs_dir2_sf_verify(mp, sfp, ifp->if_bytes); break; - case S_IFLNK: - fa = xfs_symlink_shortform_verify(ip); + } + case S_IFLNK: { + struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); + + fa = xfs_symlink_shortform_verify(ifp->if_u1.if_data, + ifp->if_bytes); break; + } default: break; } @@ -727,11 +737,20 @@ xfs_ifork_verify_local_attr( struct xfs_ifork *ifp = &ip->i_af; xfs_failaddr_t fa; - if (!xfs_inode_has_attr_fork(ip)) + if (!xfs_inode_has_attr_fork(ip)) { fa = __this_address; - else - fa = xfs_attr_shortform_verify(ip); + } else { + struct xfs_attr_shortform *sfp; + struct xfs_ifork *ifp; + int64_t size; + ASSERT(ip->i_af.if_format == XFS_DINODE_FMT_LOCAL); + ifp = xfs_ifork_ptr(ip, XFS_ATTR_FORK); + sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data; + size = ifp->if_bytes; + + fa = xfs_attr_shortform_verify(sfp, size); + } if (fa) { xfs_inode_verifier_error(ip, -EFSCORRUPTED, "attr fork", ifp->if_u1.if_data, ifp->if_bytes, fa); diff --git a/libxfs/xfs_shared.h b/libxfs/xfs_shared.h index c4381388c0c1..4220d3584c1b 100644 --- a/libxfs/xfs_shared.h +++ b/libxfs/xfs_shared.h @@ -139,7 +139,7 @@ bool xfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_inode *ip, struct xfs_ifork *ifp); -xfs_failaddr_t xfs_symlink_shortform_verify(struct xfs_inode *ip); +xfs_failaddr_t xfs_symlink_shortform_verify(void *sfp, int64_t size); /* Computed inode geometry for the filesystem. */ struct xfs_ino_geometry { diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index 29c9f1cc1212..cf894b5276ac 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -199,15 +199,11 @@ xfs_symlink_local_to_remote( */ xfs_failaddr_t xfs_symlink_shortform_verify( - struct xfs_inode *ip) + void *sfp, + int64_t size) { - struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); - char *sfp = (char *)ifp->if_u1.if_data; - int size = ifp->if_bytes; char *endp = sfp + size; - ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - /* * Zero length symlinks should never occur in memory as they are * never allowed to exist on disk. From patchwork Wed Mar 13 02:03:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590881 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 936C1AD5D for ; Wed, 13 Mar 2024 02:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295408; cv=none; b=cwJgqqIq4hUlN97EbRqFakC+96ZgY0A06pylo56bd+kLUqyGHBB+1AYTesSCzaooK7Tb7WZSkk/u3kF8LbBdXFNfM+3/JyamXKx3J7yKXED1gCtI7nQTzM1PuDc7G4EIfj92y+grLPxuMiugP1E+v1cmrSEvfNqRH3bAfT8a5yI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295408; c=relaxed/simple; bh=6LzswIXAfi1ike1HaZ2fs51j0Z2r0ykLzUO1cBmorsI=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uXov+ZQ58J0xkUSvSi3NJEIak2oiA7lJVlIWBC/AQ7k1GjWtI+bgKKlc9S18hSqkRgJVljNtLL0ZswUiKQTgFdp9Bb4eMMazm0v4Piz5ZcxTWS0yEWqe/rl7Dq5M4s/p4COWCu7MfBFvv1t3R1Xn+wUQfDq7xRAxOZA1uTHbC+s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dEoIaJ3R; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dEoIaJ3R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6970BC433C7; Wed, 13 Mar 2024 02:03:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295408; bh=6LzswIXAfi1ike1HaZ2fs51j0Z2r0ykLzUO1cBmorsI=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=dEoIaJ3RcaBSbz8q9WaGU57+oaqrQXS/FoBu9S5vyLRQnLouHkdrd8BC8sqPn4Nil zJcwWtE9qkUNRYIppf5sAJHPSUPgq9XVOiPuJouR4ANcZnXZk6ApmzXYy+0BOcCT3C mylWoyhHwLMbtc9f340Yo3Ej6lsgGL3rPjL4fZNdNuxeMyWkZdJww7wFafy2dJnkq7 T0VF7cH8CpWrMhqmddflp09TTFW1Ww9lyCW5SrV2ltC28wO2ZtqTWkQeGPkoneFMBW wYLgGxExTiFqaFxpOGg2nea9JS/N8ECC5W1jE0fZMY9F0ZhhvANXcLoDMIGaiAz7Hn 9pvUTRNj4PR9g== Date: Tue, 12 Mar 2024 19:03:28 -0700 Subject: [PATCH 40/67] xfs: repair inode fork block mapping data structures From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431770.2061787.9679226163287710712.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 8f71bede8efd820627ac05c19eac2758214bc896 Use the reverse-mapping btree information to rebuild an inode block map. Update the btree bulk loading code as necessary to support inode rooted btrees and fix some bitrot problems. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_bmap_btree.c | 121 +++++++++++++++++++++++++++++++++++++------- libxfs/xfs_bmap_btree.h | 5 ++ libxfs/xfs_btree_staging.c | 11 +++- libxfs/xfs_btree_staging.h | 2 - libxfs/xfs_iext_tree.c | 23 ++++++-- libxfs/xfs_inode_fork.c | 1 libxfs/xfs_inode_fork.h | 3 + 7 files changed, 136 insertions(+), 30 deletions(-) diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index c4d5c8a64747..73ba067df06e 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -15,6 +15,7 @@ #include "xfs_trans.h" #include "xfs_alloc.h" #include "xfs_btree.h" +#include "xfs_btree_staging.h" #include "xfs_bmap_btree.h" #include "xfs_bmap.h" #include "xfs_trace.h" @@ -286,10 +287,7 @@ xfs_bmbt_get_minrecs( int level) { if (level == cur->bc_nlevels - 1) { - struct xfs_ifork *ifp; - - ifp = xfs_ifork_ptr(cur->bc_ino.ip, - cur->bc_ino.whichfork); + struct xfs_ifork *ifp = xfs_btree_ifork_ptr(cur); return xfs_bmbt_maxrecs(cur->bc_mp, ifp->if_broot_bytes, level == 0) / 2; @@ -304,10 +302,7 @@ xfs_bmbt_get_maxrecs( int level) { if (level == cur->bc_nlevels - 1) { - struct xfs_ifork *ifp; - - ifp = xfs_ifork_ptr(cur->bc_ino.ip, - cur->bc_ino.whichfork); + struct xfs_ifork *ifp = xfs_btree_ifork_ptr(cur); return xfs_bmbt_maxrecs(cur->bc_mp, ifp->if_broot_bytes, level == 0); @@ -541,23 +536,19 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .keys_contiguous = xfs_bmbt_keys_contiguous, }; -/* - * Allocate a new bmap btree cursor. - */ -struct xfs_btree_cur * /* new bmap btree cursor */ -xfs_bmbt_init_cursor( - struct xfs_mount *mp, /* file system mount point */ - struct xfs_trans *tp, /* transaction pointer */ - struct xfs_inode *ip, /* inode owning the btree */ - int whichfork) /* data or attr fork */ +static struct xfs_btree_cur * +xfs_bmbt_init_common( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork) { - struct xfs_ifork *ifp = xfs_ifork_ptr(ip, whichfork); struct xfs_btree_cur *cur; + ASSERT(whichfork != XFS_COW_FORK); cur = xfs_btree_alloc_cursor(mp, tp, XFS_BTNUM_BMAP, mp->m_bm_maxlevels[whichfork], xfs_bmbt_cur_cache); - cur->bc_nlevels = be16_to_cpu(ifp->if_broot->bb_level) + 1; cur->bc_statoff = XFS_STATS_CALC_INDEX(xs_bmbt_2); cur->bc_ops = &xfs_bmbt_ops; @@ -565,10 +556,30 @@ xfs_bmbt_init_cursor( if (xfs_has_crc(mp)) cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; - cur->bc_ino.forksize = xfs_inode_fork_size(ip, whichfork); cur->bc_ino.ip = ip; cur->bc_ino.allocated = 0; cur->bc_ino.flags = 0; + + return cur; +} + +/* + * Allocate a new bmap btree cursor. + */ +struct xfs_btree_cur * +xfs_bmbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork) +{ + struct xfs_ifork *ifp = xfs_ifork_ptr(ip, whichfork); + struct xfs_btree_cur *cur; + + cur = xfs_bmbt_init_common(mp, tp, ip, whichfork); + + cur->bc_nlevels = be16_to_cpu(ifp->if_broot->bb_level) + 1; + cur->bc_ino.forksize = xfs_inode_fork_size(ip, whichfork); cur->bc_ino.whichfork = whichfork; return cur; @@ -585,6 +596,76 @@ xfs_bmbt_block_maxrecs( return blocklen / (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)); } +/* + * Allocate a new bmap btree cursor for reloading an inode block mapping data + * structure. Note that callers can use the staged cursor to reload extents + * format inode forks if they rebuild the iext tree and commit the staged + * cursor immediately. + */ +struct xfs_btree_cur * +xfs_bmbt_stage_cursor( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xbtree_ifakeroot *ifake) +{ + struct xfs_btree_cur *cur; + struct xfs_btree_ops *ops; + + /* data fork always has larger maxheight */ + cur = xfs_bmbt_init_common(mp, NULL, ip, XFS_DATA_FORK); + cur->bc_nlevels = ifake->if_levels; + cur->bc_ino.forksize = ifake->if_fork_size; + + /* Don't let anyone think we're attached to the real fork yet. */ + cur->bc_ino.whichfork = -1; + xfs_btree_stage_ifakeroot(cur, ifake, &ops); + ops->update_cursor = NULL; + return cur; +} + +/* + * Swap in the new inode fork root. Once we pass this point the newly rebuilt + * mappings are in place and we have to kill off any old btree blocks. + */ +void +xfs_bmbt_commit_staged_btree( + struct xfs_btree_cur *cur, + struct xfs_trans *tp, + int whichfork) +{ + struct xbtree_ifakeroot *ifake = cur->bc_ino.ifake; + struct xfs_ifork *ifp; + static const short brootflag[2] = {XFS_ILOG_DBROOT, XFS_ILOG_ABROOT}; + static const short extflag[2] = {XFS_ILOG_DEXT, XFS_ILOG_AEXT}; + int flags = XFS_ILOG_CORE; + + ASSERT(cur->bc_flags & XFS_BTREE_STAGING); + ASSERT(whichfork != XFS_COW_FORK); + + /* + * Free any resources hanging off the real fork, then shallow-copy the + * staging fork's contents into the real fork to transfer everything + * we just built. + */ + ifp = xfs_ifork_ptr(cur->bc_ino.ip, whichfork); + xfs_idestroy_fork(ifp); + memcpy(ifp, ifake->if_fork, sizeof(struct xfs_ifork)); + + switch (ifp->if_format) { + case XFS_DINODE_FMT_EXTENTS: + flags |= extflag[whichfork]; + break; + case XFS_DINODE_FMT_BTREE: + flags |= brootflag[whichfork]; + break; + default: + ASSERT(0); + break; + } + xfs_trans_log_inode(tp, cur->bc_ino.ip, flags); + xfs_btree_commit_ifakeroot(cur, tp, whichfork, &xfs_bmbt_ops); +} + /* * Calculate number of records in a bmap btree block. */ diff --git a/libxfs/xfs_bmap_btree.h b/libxfs/xfs_bmap_btree.h index 3e7a40a83835..151b8491f60e 100644 --- a/libxfs/xfs_bmap_btree.h +++ b/libxfs/xfs_bmap_btree.h @@ -11,6 +11,7 @@ struct xfs_btree_block; struct xfs_mount; struct xfs_inode; struct xfs_trans; +struct xbtree_ifakeroot; /* * Btree block header size depends on a superblock flag. @@ -106,6 +107,10 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); +struct xfs_btree_cur *xfs_bmbt_stage_cursor(struct xfs_mount *mp, + struct xfs_inode *ip, struct xbtree_ifakeroot *ifake); +void xfs_bmbt_commit_staged_btree(struct xfs_btree_cur *cur, + struct xfs_trans *tp, int whichfork); extern unsigned long long xfs_bmbt_calc_size(struct xfs_mount *mp, unsigned long long len); diff --git a/libxfs/xfs_btree_staging.c b/libxfs/xfs_btree_staging.c index d4164e37bd38..0ea44dcf14f3 100644 --- a/libxfs/xfs_btree_staging.c +++ b/libxfs/xfs_btree_staging.c @@ -405,7 +405,7 @@ xfs_btree_bload_prep_block( ASSERT(*bpp == NULL); /* Allocate a new incore btree root block. */ - new_size = bbl->iroot_size(cur, nr_this_block, priv); + new_size = bbl->iroot_size(cur, level, nr_this_block, priv); ifp->if_broot = kmem_zalloc(new_size, 0); ifp->if_broot_bytes = (int)new_size; @@ -596,7 +596,14 @@ xfs_btree_bload_level_geometry( unsigned int desired_npb; unsigned int maxnr; - maxnr = cur->bc_ops->get_maxrecs(cur, level); + /* + * Compute the absolute maximum number of records that we can store in + * the ondisk block or inode root. + */ + if (cur->bc_ops->get_dmaxrecs) + maxnr = cur->bc_ops->get_dmaxrecs(cur, level); + else + maxnr = cur->bc_ops->get_maxrecs(cur, level); /* * Compute the number of blocks we need to fill each block with the diff --git a/libxfs/xfs_btree_staging.h b/libxfs/xfs_btree_staging.h index f0a5007284ef..055ea43b1e18 100644 --- a/libxfs/xfs_btree_staging.h +++ b/libxfs/xfs_btree_staging.h @@ -53,7 +53,7 @@ typedef int (*xfs_btree_bload_get_records_fn)(struct xfs_btree_cur *cur, typedef int (*xfs_btree_bload_claim_block_fn)(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr, void *priv); typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur, - unsigned int nr_this_level, void *priv); + unsigned int level, unsigned int nr_this_level, void *priv); struct xfs_btree_bload { /* diff --git a/libxfs/xfs_iext_tree.c b/libxfs/xfs_iext_tree.c index 7f5c4f403d6d..5d0be2dc8fed 100644 --- a/libxfs/xfs_iext_tree.c +++ b/libxfs/xfs_iext_tree.c @@ -622,13 +622,11 @@ static inline void xfs_iext_inc_seq(struct xfs_ifork *ifp) } void -xfs_iext_insert( - struct xfs_inode *ip, +xfs_iext_insert_raw( + struct xfs_ifork *ifp, struct xfs_iext_cursor *cur, - struct xfs_bmbt_irec *irec, - int state) + struct xfs_bmbt_irec *irec) { - struct xfs_ifork *ifp = xfs_iext_state_to_fork(ip, state); xfs_fileoff_t offset = irec->br_startoff; struct xfs_iext_leaf *new = NULL; int nr_entries, i; @@ -662,12 +660,23 @@ xfs_iext_insert( xfs_iext_set(cur_rec(cur), irec); ifp->if_bytes += sizeof(struct xfs_iext_rec); - trace_xfs_iext_insert(ip, cur, state, _RET_IP_); - if (new) xfs_iext_insert_node(ifp, xfs_iext_leaf_key(new, 0), new, 2); } +void +xfs_iext_insert( + struct xfs_inode *ip, + struct xfs_iext_cursor *cur, + struct xfs_bmbt_irec *irec, + int state) +{ + struct xfs_ifork *ifp = xfs_iext_state_to_fork(ip, state); + + xfs_iext_insert_raw(ifp, cur, irec); + trace_xfs_iext_insert(ip, cur, state, _RET_IP_); +} + static struct xfs_iext_node * xfs_iext_rebalance_node( struct xfs_iext_node *parent, diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 3e2d7882a077..80f4215d24bd 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -518,6 +518,7 @@ xfs_idata_realloc( ifp->if_bytes = new_size; } +/* Free all memory and reset a fork back to its initial state. */ void xfs_idestroy_fork( struct xfs_ifork *ifp) diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 96d307784c85..535be5c03689 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -180,6 +180,9 @@ void xfs_init_local_fork(struct xfs_inode *ip, int whichfork, const void *data, int64_t size); xfs_extnum_t xfs_iext_count(struct xfs_ifork *ifp); +void xfs_iext_insert_raw(struct xfs_ifork *ifp, + struct xfs_iext_cursor *cur, + struct xfs_bmbt_irec *irec); void xfs_iext_insert(struct xfs_inode *, struct xfs_iext_cursor *cur, struct xfs_bmbt_irec *, int); void xfs_iext_remove(struct xfs_inode *, struct xfs_iext_cursor *, From patchwork Wed Mar 13 02:03:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590882 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 314ADAD5D for ; Wed, 13 Mar 2024 02:03:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295424; cv=none; b=cs58qSxV5APdTm4an3M9ZA6gMA2PwrtOIer0AGCNmYJSswMIwICH1sE40FTGO7oZ7XFBrs+mlLhFPD9JzPoHrsMm1i4vailkEQ1Hr3aJSXyQRxbUVigy8GIvGeRBqDMXFc3keOtHWKKoauuRMgGmmBHdq3iSYEVBl9mwAZ1hrA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295424; c=relaxed/simple; bh=ryqDiFrYX1eFWkwPVNgihPlJZdToKoXGovI0bDFM++U=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Z7mPXjzXLpKSFPYvfbgq5Ja30z4+W4n3pHPc6zTVF6LuEszA+bSgLYzngMvTSA2w153vF9ZYJBoPQrNxJ55Tenz73igPNJsEEWgy+O3yOEdbiNMPXq7232Itu4xa/OwC9McOd5jZnw6JgcUa4YCcX1E/22K1mFhEglB9GrMX6SY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fEqbCgZe; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fEqbCgZe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 11B40C433C7; Wed, 13 Mar 2024 02:03:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295424; bh=ryqDiFrYX1eFWkwPVNgihPlJZdToKoXGovI0bDFM++U=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=fEqbCgZeFdWeETHLRRXMxzn6+vlq05OyntyZsd17PXlVtOD1gMgRSBOKM+6a/obkZ O4CbXw5TTH8v4RJGLXGGdPrjbMeakQ9k0mcGbDxNnJ5dB/cTg33rdmgJjb4OYCOSZf 1xmiBEUEqQc0A/ydi9mgPeLXyBbQyK+PxEpzyqCj0J6Gt1cQXo1Plidu8q3mKTHWRL P2oHcjgE+zlXh2B2ryp2cWxWwynEUQjzCwIfnKsUtTs6kZbcCFK+sicmFlQwe7KoHI XgAVb06RxOxI36YUoFClNhcMBZ4Y0cpF5Gxb9uF/Kd3lRrTYi8819uduxvwL4lRZXk JBkxSqs78tlTQ== Date: Tue, 12 Mar 2024 19:03:43 -0700 Subject: [PATCH 41/67] xfs: create a ranged query function for refcount btrees From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431784.2061787.504878964029441438.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: d12bf8bac87a0d93e6e5fab67f399d1e3d3d5767 Implement ranged queries for refcount records. The next patch will use this to scan refcount data. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_refcount.c | 41 +++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_refcount.h | 10 ++++++++++ 2 files changed, 51 insertions(+) diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 3377fac1283b..de321ab9d91d 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -2030,6 +2030,47 @@ xfs_refcount_has_records( return xfs_btree_has_records(cur, &low, &high, NULL, outcome); } +struct xfs_refcount_query_range_info { + xfs_refcount_query_range_fn fn; + void *priv; +}; + +/* Format btree record and pass to our callback. */ +STATIC int +xfs_refcount_query_range_helper( + struct xfs_btree_cur *cur, + const union xfs_btree_rec *rec, + void *priv) +{ + struct xfs_refcount_query_range_info *query = priv; + struct xfs_refcount_irec irec; + xfs_failaddr_t fa; + + xfs_refcount_btrec_to_irec(rec, &irec); + fa = xfs_refcount_check_irec(cur->bc_ag.pag, &irec); + if (fa) + return xfs_refcount_complain_bad_rec(cur, fa, &irec); + + return query->fn(cur, &irec, query->priv); +} + +/* Find all refcount records between two keys. */ +int +xfs_refcount_query_range( + struct xfs_btree_cur *cur, + const struct xfs_refcount_irec *low_rec, + const struct xfs_refcount_irec *high_rec, + xfs_refcount_query_range_fn fn, + void *priv) +{ + union xfs_btree_irec low_brec = { .rc = *low_rec }; + union xfs_btree_irec high_brec = { .rc = *high_rec }; + struct xfs_refcount_query_range_info query = { .priv = priv, .fn = fn }; + + return xfs_btree_query_range(cur, &low_brec, &high_brec, + xfs_refcount_query_range_helper, &query); +} + int __init xfs_refcount_intent_init_cache(void) { diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 5c207f1c619c..9b56768a590c 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -127,4 +127,14 @@ extern struct kmem_cache *xfs_refcount_intent_cache; int __init xfs_refcount_intent_init_cache(void); void xfs_refcount_intent_destroy_cache(void); +typedef int (*xfs_refcount_query_range_fn)( + struct xfs_btree_cur *cur, + const struct xfs_refcount_irec *rec, + void *priv); + +int xfs_refcount_query_range(struct xfs_btree_cur *cur, + const struct xfs_refcount_irec *low_rec, + const struct xfs_refcount_irec *high_rec, + xfs_refcount_query_range_fn fn, void *priv); + #endif /* __XFS_REFCOUNT_H__ */ From patchwork Wed Mar 13 02:03:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590883 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C47CEB652 for ; Wed, 13 Mar 2024 02:03:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295439; cv=none; b=HZA13MrtaTuTVKutnu/VjMUbpaxmxuzCWj47PecGZmTxQFoeHUodVh7k87kqZ4MnRA7Wi217r3YE0HO56oM0q4j3rQZ+haDlJ3G3MsfTrmcSXllI9Zb8XBMCfdjoJopu3lgn9Rlq9L0jdOoQFMbZHwEn7FHlQTni1VM/reEKYvM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295439; c=relaxed/simple; bh=kfEd/p39tnm36M9e1MwkD9Sd+S05rXxL6FQnec9v/1w=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=s3eaiWc1+qHoD/xPuqIHOk4Y3QBVrTFB4FZtP47yvXWH8Q2Spnuo0roWmjEXGP/X9gncBK69B8YZkdweT8KhyQNQE3p7GJCBmtHgrtH+3AdxlFWT4oXQKyDno8N9lmJ2J4NVj3QC5UsBlrqO1v/9+B/txGShKo24mDPCxkadEVw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XESKkdzP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XESKkdzP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2750C433C7; Wed, 13 Mar 2024 02:03:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295439; bh=kfEd/p39tnm36M9e1MwkD9Sd+S05rXxL6FQnec9v/1w=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=XESKkdzPr5PriTZMarlBczrCucO5qxVZaAD4B5YLXapnpQQAK7lq75aF4gY1B8xaW RHoQnA9Wh157ELgkE8GsCwrvPTpLUnH/obKq64l362MvfBFU4NXP+YxKUezCvYTela ooMAsUXtMoTpio8r0v0BgWW/7E2gnxlAjmYL27QCEJZ+WhWuTrNgwzSwRO7SmeUKey nWLz/y1qvZ8Ryz48JObv2HOp24FiL6tz/wY54cYuPS/rQrxyKcUzX/oc4UaKvyjeJE 7Iw6BWNDTGBni+QeF6rAnyu22nCPWglMjCdK8Ots0Qo4Vovg1uG3D89mT7FowZQs57 WC8Xnh9KueJrg== Date: Tue, 12 Mar 2024 19:03:59 -0700 Subject: [PATCH 42/67] xfs: create a new inode fork block unmap helper From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431799.2061787.16604578276243163129.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: a59eb5fc21b2a6dc160ee6cdf77f20bc186a88fd Create a new helper to unmap blocks from an inode's fork. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_bmap.c | 41 ++++++++++++++++++++++++++++++++++++++++- libxfs/xfs_bmap.h | 5 ++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 534a516b59ba..3520235b58af 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -5233,7 +5233,7 @@ xfs_bmap_del_extent_real( * that value. If not all extents in the block range can be removed then * *done is set. */ -int /* error */ +static int __xfs_bunmapi( struct xfs_trans *tp, /* transaction pointer */ struct xfs_inode *ip, /* incore inode */ @@ -6214,3 +6214,42 @@ xfs_bmap_validate_extent( return xfs_bmap_validate_extent_raw(ip->i_mount, XFS_IS_REALTIME_INODE(ip), whichfork, irec); } + +/* + * Used in xfs_itruncate_extents(). This is the maximum number of extents + * freed from a file in a single transaction. + */ +#define XFS_ITRUNC_MAX_EXTENTS 2 + +/* + * Unmap every extent in part of an inode's fork. We don't do any higher level + * invalidation work at all. + */ +int +xfs_bunmapi_range( + struct xfs_trans **tpp, + struct xfs_inode *ip, + uint32_t flags, + xfs_fileoff_t startoff, + xfs_fileoff_t endoff) +{ + xfs_filblks_t unmap_len = endoff - startoff + 1; + int error = 0; + + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + + while (unmap_len > 0) { + ASSERT((*tpp)->t_highest_agno == NULLAGNUMBER); + error = __xfs_bunmapi(*tpp, ip, startoff, &unmap_len, flags, + XFS_ITRUNC_MAX_EXTENTS); + if (error) + goto out; + + /* free the just unmapped extents */ + error = xfs_defer_finish(tpp); + if (error) + goto out; + } +out: + return error; +} diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 8518324db285..4b83f6148e00 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -190,9 +190,6 @@ int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, uint32_t flags, xfs_extlen_t total, struct xfs_bmbt_irec *mval, int *nmap); -int __xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t bno, xfs_filblks_t *rlen, uint32_t flags, - xfs_extnum_t nexts); int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, uint32_t flags, xfs_extnum_t nexts, int *done); @@ -273,6 +270,8 @@ int xfs_bmap_complain_bad_rec(struct xfs_inode *ip, int whichfork, int xfs_bmapi_remap(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, xfs_fsblock_t startblock, uint32_t flags); +int xfs_bunmapi_range(struct xfs_trans **tpp, struct xfs_inode *ip, + uint32_t flags, xfs_fileoff_t startoff, xfs_fileoff_t endoff); extern struct kmem_cache *xfs_bmap_intent_cache; From patchwork Wed Mar 13 02:04:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590884 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72E2EB66C for ; Wed, 13 Mar 2024 02:04:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295455; cv=none; b=UXRHyULVBvNcuNyzdV9Qaw1lTeZlfxdWMizYSJIZ9DCrNl3X7xsb4tpM035bfhILR0Uf79VTiSJnRWg9GLfuXq4PuYDV3AnsCUQ+htOACtcXjuNq68fAJaQDmCV0crOf2LJAWTb9ctlKR3UDekkbpcY5chzViXCJf9DJISLwZ34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295455; c=relaxed/simple; bh=E1vdI4UORhhJbppasMkCQsrjasLsRUOLEa9F8QOnMy4=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=YD0Rl+N+R6lCI+8v3o1Ip65dCeKWKqt+otCWK1M6lJHIT0gDWCAQ010Q00DvLsFoO+z/SOiJIFBoLaugzc0u7q1TrDRUtQeJManBFhnfN2UvWMcs4+sdVGunlI+EjP3ayda6QbmcXZVDBGcqfUHOMNuBK30EXkCvKzUxtWFgbho= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FwQKGXls; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FwQKGXls" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4E083C433F1; Wed, 13 Mar 2024 02:04:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295455; bh=E1vdI4UORhhJbppasMkCQsrjasLsRUOLEa9F8QOnMy4=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=FwQKGXlszViS0BxcGaTdyexe3OWllGv1gcGYMx/OSUU8Z4J4f5y7WN/TqNh5NbmFN MERXZjwn9oug4AqLkOuJ1v7kafz5m/d54maSoG+9R8epQYO363Gf0PJtUsxYYftg+9 YJ6uQgAPZR1gdyLlg4bTx8Fio2ZHEbuh+7jvs4HbVH1ZTLNS4XvVQI0z/ofSDXa8bb YQDukKxotcK48CNcFwa7YyB8AITsTfzyh+tvhlcaTprlwz5MIdbTYaFA5jrOqHT2Pc e+vJKPi3RN81FTSy5823oSOdAyslMP6SlyXus7VuCVEpD0kzsP54DsL4n5zDni8Px7 gDm5DuLXw69KQ== Date: Tue, 12 Mar 2024 19:04:14 -0700 Subject: [PATCH 43/67] xfs: improve dquot iteration for scrub From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , linux-xfs@vger.kernel.org Message-ID: <171029431813.2061787.17351964239037898368.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 21d7500929c8a0b10e22a6755850c6f9a9280284 Upon a closer inspection of the quota record scrubber, I noticed that dqiterate wasn't actually walking all possible dquots for the mapped blocks in the quota file. This is due to xfs_qm_dqget_next skipping all XFS_IS_DQUOT_UNINITIALIZED dquots. For a fsck program, we really want to look at all the dquots, even if all counters and limits in the dquot record are zero. Rewrite the implementation to do this, as well as switching to an iterator paradigm to reduce the number of indirect calls. This enables removal of the old broken dqiterate code from xfs_dquot.c. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/xfs_format.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index f16974126ff9..e6ca188e2271 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1272,6 +1272,9 @@ static inline time64_t xfs_dq_bigtime_to_unix(uint32_t ondisk_seconds) #define XFS_DQ_GRACE_MIN ((int64_t)0) #define XFS_DQ_GRACE_MAX ((int64_t)U32_MAX) +/* Maximum id value for a quota record */ +#define XFS_DQ_ID_MAX (U32_MAX) + /* * This is the main portion of the on-disk representation of quota information * for a user. We pad this with some more expansion room to construct the on From patchwork Wed Mar 13 02:04:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590885 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13048CA4A for ; Wed, 13 Mar 2024 02:04:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295471; cv=none; b=Pxdhxf/K8DvzpN8p5zu91Npd2dylGD4LxdM9IHLaGt3mZtSGzLKpVUfnxeb5PACiguT81wxJNz23y6pxV3miCrj8jL5T/BH+EoBF9CpwaAPKPXqbigAHHKs+eDOtI/u1nMouNGuwLMGu1GVNGeb/Y3bnyypL2uMeTzaoWEJYqGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295471; c=relaxed/simple; bh=5t0uQYg27mmUsafZo8rWridbQG0coTZjNSqZ/kF+OUY=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qMk9o92ZT7Q6Q3qt7XN+VmO2P1mgZZ+rh7kJgltf3HtTKuxeLY7b1IxjLmpB3gz78kIvoMhVIVYMBn+M7qmwhVi3fT0h8NtkXJ297x0yD1ejEDMZDK3q37gFSpPQZUmy4R7pjErjk8gePlA0HpyCQBgFGh0iPANW/oAyOpiUK6o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PSuhJU41; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PSuhJU41" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0886C433A6; Wed, 13 Mar 2024 02:04:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295470; bh=5t0uQYg27mmUsafZo8rWridbQG0coTZjNSqZ/kF+OUY=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=PSuhJU41BM81HrlwsFnRxuqNt9LoaTJ9LFsOycKO4pNkEfXnZedALRwRGflZldep5 WplbQDed2wOTFLMZf55yTWmntkpd8/BfW5clbyoISugHDMACSZGt/J7+9Y6fgcVVNF 4XxvZMnbwGX4LceLvJaWxtpK3ww9E5QUJgHwrDAJZQssc5ho0/oqD8VW1ViOU0YyFI 2PDdFzQjjfYykIcrPmftCms2xZeCDktJAJxk+U0EUhvjkU2IYBNF+W5kyNUm3Lmh6f BWyJ+k7Uqxt0e5qtvP1VW7b8yUQSyJ2Nwg2POpMBxMObG8FVC2ScCMCUCFYgSZpGHk 3tbFf2p6pTV2A== Date: Tue, 12 Mar 2024 19:04:30 -0700 Subject: [PATCH 44/67] xfs: add lock protection when remove perag from radix tree From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Long Li , Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431828.2061787.7367710186504342954.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Long Li Source kernel commit: 07afd3173d0c6d24a47441839a835955ec6cf0d4 Take mp->m_perag_lock for deletions from the perag radix tree in xfs_initialize_perag to prevent racing with tagging operations. Lookups are fine - they are RCU protected so already deal with the tree changing shape underneath the lookup - but tagging operations require the tree to be stable while the tags are propagated back up to the root. Right now there's nothing stopping radix tree tagging from operating while a growfs operation is progress and adding/removing new entries into the radix tree. Hence we can have traversals that require a stable tree occurring at the same time we are removing unused entries from the radix tree which causes the shape of the tree to change. Likely this hasn't caused a problem in the past because we are only doing append addition and removal so the active AG part of the tree is not changing shape, but that doesn't mean it is safe. Just making the radix tree modifications serialise against each other is obviously correct. Signed-off-by: Long Li Reviewed-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_ag.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c index bdb8a08bbea7..1dbc01b97366 100644 --- a/libxfs/xfs_ag.c +++ b/libxfs/xfs_ag.c @@ -422,13 +422,17 @@ xfs_initialize_perag( out_remove_pag: xfs_defer_drain_free(&pag->pag_intents_drain); + spin_lock(&mp->m_perag_lock); radix_tree_delete(&mp->m_perag_tree, index); + spin_unlock(&mp->m_perag_lock); out_free_pag: kmem_free(pag); out_unwind_new_pags: /* unwind any prior newly initialized pags */ for (index = first_initialised; index < agcount; index++) { + spin_lock(&mp->m_perag_lock); pag = radix_tree_delete(&mp->m_perag_tree, index); + spin_unlock(&mp->m_perag_lock); if (!pag) break; xfs_buf_hash_destroy(pag); From patchwork Wed Mar 13 02:04:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590886 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CEBAB67D for ; Wed, 13 Mar 2024 02:04:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295487; cv=none; b=Bzn/ihwcQg1gceUoAw05PM64OTNejI9PEQTymmzSvr2djjzrIi9DpzzM9cAEqq/dP7qfvIOEm3Qmhf11dFl/irZ0N7F9Ue919h69TNZXUIfCUakEyHKsuruSb12WmCaIQRS0eJeYHBEqNX/IfiYz6PYAHalkkvwjnenGPO6pQwk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295487; c=relaxed/simple; bh=dD/5ABscXpA4fNy/ly0nuQ4mqf6qtgX/OYohk1K9Qqc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=X9UxNwNhg7uLcOV3pDyTWSnaxrmH2+rTPf0UIjv23O3s4o496PyZ8y/KzC8/vYibNhDBpIMD4+Duc7EDRuEHmjZaojTGzRbB8gzqJNwRSwTqgI9zxWE62U8J8nugfBUM3+ZvDZ68IUcNdZnhytosJtuZI0noTQH1ftwCEgYN6Vk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UvRzlGOm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UvRzlGOm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E6B2C433C7; Wed, 13 Mar 2024 02:04:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295486; bh=dD/5ABscXpA4fNy/ly0nuQ4mqf6qtgX/OYohk1K9Qqc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=UvRzlGOmR9oqzEQeg0y27CRiGQLZ1FZgOQRBg6OjfbjwoozS8ZI5BJ5Tid37zNChv uwte0Xlhsipae+JKB6ewAc+NctqBQNJg6Ewf4CqR06tLc5DgOm6LfGVELG1s9sKnFO TRgw06sUywlwlhH7KBGmbnBZlySkOSaAdbj+33JwJA34Qk6TNAvp5402nOeTi3O1fT qSxyV2Pv6ax6qrABULLpDc9bPZc+wCx9HWdLCvU4rPt1e4sWwcumxvBr5Kl/alhPlt rJOTG5p2Z3vM+AE0qyAwdELg0ncjm91fwQ+buw/MpjL5UkjZUsmX1FaiiJMaklYtfF vtnmLEiSFaasg== Date: Tue, 12 Mar 2024 19:04:46 -0700 Subject: [PATCH 45/67] xfs: fix perag leak when growfs fails From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Long Li , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431842.2061787.9951895152503197518.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Long Li Source kernel commit: 7823921887750b39d02e6b44faafdd1cc617c651 During growfs, if new ag in memory has been initialized, however sb_agcount has not been updated, if an error occurs at this time it will cause perag leaks as follows, these new AGs will not been freed during umount , because of these new AGs are not visible(that is included in mp->m_sb.sb_agcount). unreferenced object 0xffff88810be40200 (size 512): comm "xfs_growfs", pid 857, jiffies 4294909093 hex dump (first 32 bytes): 00 c0 c1 05 81 88 ff ff 04 00 00 00 00 00 00 00 ................ 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace (crc 381741e2): [] __kmalloc+0x386/0x4f0 [] kmem_alloc+0xb5/0x2f0 [] xfs_initialize_perag+0xc5/0x810 [] xfs_growfs_data+0x9bc/0xbc0 [] xfs_file_ioctl+0x5fe/0x14d0 [] __x64_sys_ioctl+0x144/0x1c0 [] do_syscall_64+0x3f/0xe0 [] entry_SYSCALL_64_after_hwframe+0x62/0x6a unreferenced object 0xffff88810be40800 (size 512): comm "xfs_growfs", pid 857, jiffies 4294909093 hex dump (first 32 bytes): 20 00 00 00 00 00 00 00 57 ef be dc 00 00 00 00 .......W....... 10 08 e4 0b 81 88 ff ff 10 08 e4 0b 81 88 ff ff ................ backtrace (crc bde50e2d): [] __kmalloc_node+0x3da/0x540 [] kvmalloc_node+0x99/0x160 [] bucket_table_alloc.isra.0+0x5f/0x400 [] rhashtable_init+0x405/0x760 [] xfs_initialize_perag+0x3a3/0x810 [] xfs_growfs_data+0x9bc/0xbc0 [] xfs_file_ioctl+0x5fe/0x14d0 [] __x64_sys_ioctl+0x144/0x1c0 [] do_syscall_64+0x3f/0xe0 [] entry_SYSCALL_64_after_hwframe+0x62/0x6a Factor out xfs_free_unused_perag_range() from xfs_initialize_perag(), used for freeing unused perag within a specified range in error handling, included in the error path of the growfs failure. Fixes: 1c1c6ebcf528 ("xfs: Replace per-ag array with a radix tree") Signed-off-by: Long Li Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_ag.c | 36 ++++++++++++++++++++++++++---------- libxfs/xfs_ag.h | 2 ++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c index 1dbc01b97366..0556d5547059 100644 --- a/libxfs/xfs_ag.c +++ b/libxfs/xfs_ag.c @@ -330,6 +330,31 @@ xfs_agino_range( return __xfs_agino_range(mp, xfs_ag_block_count(mp, agno), first, last); } +/* + * Free perag within the specified AG range, it is only used to free unused + * perags under the error handling path. + */ +void +xfs_free_unused_perag_range( + struct xfs_mount *mp, + xfs_agnumber_t agstart, + xfs_agnumber_t agend) +{ + struct xfs_perag *pag; + xfs_agnumber_t index; + + for (index = agstart; index < agend; index++) { + spin_lock(&mp->m_perag_lock); + pag = radix_tree_delete(&mp->m_perag_tree, index); + spin_unlock(&mp->m_perag_lock); + if (!pag) + break; + xfs_buf_hash_destroy(pag); + xfs_defer_drain_free(&pag->pag_intents_drain); + kmem_free(pag); + } +} + int xfs_initialize_perag( struct xfs_mount *mp, @@ -429,16 +454,7 @@ xfs_initialize_perag( kmem_free(pag); out_unwind_new_pags: /* unwind any prior newly initialized pags */ - for (index = first_initialised; index < agcount; index++) { - spin_lock(&mp->m_perag_lock); - pag = radix_tree_delete(&mp->m_perag_tree, index); - spin_unlock(&mp->m_perag_lock); - if (!pag) - break; - xfs_buf_hash_destroy(pag); - xfs_defer_drain_free(&pag->pag_intents_drain); - kmem_free(pag); - } + xfs_free_unused_perag_range(mp, first_initialised, agcount); return error; } diff --git a/libxfs/xfs_ag.h b/libxfs/xfs_ag.h index 67c3260ee789..4b343c4fac28 100644 --- a/libxfs/xfs_ag.h +++ b/libxfs/xfs_ag.h @@ -143,6 +143,8 @@ __XFS_AG_OPSTATE(prefers_metadata, PREFERS_METADATA) __XFS_AG_OPSTATE(allows_inodes, ALLOWS_INODES) __XFS_AG_OPSTATE(agfl_needs_reset, AGFL_NEEDS_RESET) +void xfs_free_unused_perag_range(struct xfs_mount *mp, xfs_agnumber_t agstart, + xfs_agnumber_t agend); int xfs_initialize_perag(struct xfs_mount *mp, xfs_agnumber_t agcount, xfs_rfsblock_t dcount, xfs_agnumber_t *maxagi); int xfs_initialize_perag_data(struct xfs_mount *mp, xfs_agnumber_t agno); From patchwork Wed Mar 13 02:05:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590887 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AFDF0BA2D for ; Wed, 13 Mar 2024 02:05:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295502; cv=none; b=PpDwxpWJPWPPc1Ozj7T5K8dWeiXTgJpeOhCd+S4wsQEQkUJspL4R5b/IJSiE/V3fvW5apBSQmBS8Gtzqj4z0bcq22C439NsMNebONxs9Vgcc1ILA6QApDi8Bx75bjcn4Txi7ZvYP0cLNGLWa4Z5HzRmP+gHL2DMiXJPROD2RR90= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295502; c=relaxed/simple; bh=N67Ef6epEgg6F7p1q8Uk6ObyAf+gHU0fOa4NCjoKago=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TYWtfqqDWYt8KRgUio5CiWikUN3S/+tq6zYi8EIE+izJa/3wvgfRdvPplquDuw8eeUOfrlxHh69id+W9HslVfvq8RaLhmrByCDoTXEWtsg1ePZmspNY5A1Mp9+hfd0JLccdz4hH8f0CTaVi81gM1GMArXjQnKTdA3GW41Fj3dLw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=moCsqa6y; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="moCsqa6y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3B9A4C433C7; Wed, 13 Mar 2024 02:05:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295502; bh=N67Ef6epEgg6F7p1q8Uk6ObyAf+gHU0fOa4NCjoKago=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=moCsqa6yddVSLcbupWucwmgWmXyAJtRfYLCPd3EikyMv4u1gV0EhPG1iDuvauu/Q/ NPDbsTQFjKqL3QgDi9cCISMhno9cXPv/RVsxVOAogdtEemP9LLchk77PIkCn0m9U8j XHdhnWirsmZi8smbmLRwyYGKmC3ilkH/AtqF46T69ZeWsLaHU9Ofn392o5TUe+EQxI dUlk1BvbT6x0agT7pyUoY8VKhohSSLHU19iSno5/TgTUhBMafgg/I7QZVJ2i5wVWwy bEVwcAyt4lflRkX4F4pSf98cB2WjZrLyJGEZs1C9vT/y5pKPbB7XPpgGIYRkrxfm7E gW1+oC2lrK4ZA== Date: Tue, 12 Mar 2024 19:05:01 -0700 Subject: [PATCH 46/67] xfs: remove the xfs_alloc_arg argument to xfs_bmap_btalloc_accounting From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431857.2061787.3941433054444287759.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: eef519d746bbfb90cbad4077c2d39d7a359c3282 xfs_bmap_btalloc_accounting only uses the len field from args, but that has just been propagated to ap->length field by the caller. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_bmap.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 3520235b58af..ad058bb126e2 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3259,8 +3259,7 @@ xfs_bmap_btalloc_select_lengths( /* Update all inode and quota accounting for the allocation we just did. */ static void xfs_bmap_btalloc_accounting( - struct xfs_bmalloca *ap, - struct xfs_alloc_arg *args) + struct xfs_bmalloca *ap) { if (ap->flags & XFS_BMAPI_COWFORK) { /* @@ -3273,7 +3272,7 @@ xfs_bmap_btalloc_accounting( * yet. */ if (ap->wasdel) { - xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)args->len); + xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)ap->length); return; } @@ -3285,22 +3284,22 @@ xfs_bmap_btalloc_accounting( * This essentially transfers the transaction quota reservation * to that of a delalloc extent. */ - ap->ip->i_delayed_blks += args->len; + ap->ip->i_delayed_blks += ap->length; xfs_trans_mod_dquot_byino(ap->tp, ap->ip, XFS_TRANS_DQ_RES_BLKS, - -(long)args->len); + -(long)ap->length); return; } /* data/attr fork only */ - ap->ip->i_nblocks += args->len; + ap->ip->i_nblocks += ap->length; xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); if (ap->wasdel) { - ap->ip->i_delayed_blks -= args->len; - xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)args->len); + ap->ip->i_delayed_blks -= ap->length; + xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)ap->length); } xfs_trans_mod_dquot_byino(ap->tp, ap->ip, ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : XFS_TRANS_DQ_BCOUNT, - args->len); + ap->length); } static int @@ -3374,7 +3373,7 @@ xfs_bmap_process_allocated_extent( ap->offset = orig_offset; else if (ap->offset + ap->length < orig_offset + orig_length) ap->offset = orig_offset + orig_length - ap->length; - xfs_bmap_btalloc_accounting(ap, args); + xfs_bmap_btalloc_accounting(ap); } #ifdef DEBUG From patchwork Wed Mar 13 02:05:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590888 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A41F79C5 for ; Wed, 13 Mar 2024 02:05:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295518; cv=none; b=XbgHvnQ5uWyQpOTqCsl9K42GEUvCk/1yffdTW4dcB8uvUfAFxwQ01qYm0FiVRhtHQXiKfyPcmQ+L5bUNaLPKlfZp2ic807aWqcFZuqnBSYI/+g5yEkSLKDvb27Axwoakz6HuGG2P1CG/yvLlHaMuraBZrozs54fy4JX4D0SHVKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295518; c=relaxed/simple; bh=KlaEV1usF/a6VUzPkA4PpxkTHRJxRJNLVNv6waIMthE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oOME3J04/yKhWhxmrMs/eJq4X43gfmOPCwHyGIAj1+LhJROqLiX/XIysxnx4/S4I6E1Gz1RVC7sZ/2KUykRxXpGr9Z9n8VsxwC5gLzEkWQClpmhlOe6tjCw+zHjF67Ne3w1cZKt6cwZK4zpWzehdPnEyorey1rX8tRvd6G2q8b8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cly6091V; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cly6091V" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CEC9AC433C7; Wed, 13 Mar 2024 02:05:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295517; bh=KlaEV1usF/a6VUzPkA4PpxkTHRJxRJNLVNv6waIMthE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=cly6091VrLR8DZgRhxRTpd6yE//Iwcm0h2t/R39Cef98UXYtYI/l+/30+tC8d+pYo GLlF86JxinGHvMy7Fasb+mRN1l9VRwF40Oq+nFIXyX3u9z4Vg8B1bvwq8Fqn/sREVZ pbaW0B6bmkkbtdZ/hW9HRvAJ/+1UhWz9UAaZ/VeGN9RLBksKVlKTntOG/kk/a5xbj7 +xHCiacp8ESZtSe1HK86ysO6nuNr9SQvrMdCajfQkVDBSpuzt3T/9GM1deCUP8WBOd YBsMayvOq6+QRN1PqoZQsaFl8ZqNJ5ElQjl61jcRm2G09D7adb/4+vKu/sDoFsDorA G04Syc0XICSmw== Date: Tue, 12 Mar 2024 19:05:17 -0700 Subject: [PATCH 47/67] xfs: also use xfs_bmap_btalloc_accounting for RT allocations From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431871.2061787.5782792122013176872.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 58643460546da1dc61593fc6fd78762798b4534f Make xfs_bmap_btalloc_accounting more generic by handling the RT quota reservations and then also use it from xfs_bmap_rtalloc instead of open coding the accounting logic there. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/libxfs_priv.h | 5 ++++- libxfs/xfs_bmap.c | 21 ++++++++++++++------- libxfs/xfs_bmap.h | 2 ++ libxfs/xfs_bmap_btree.c | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 30ff8dba9178..28ee192509c7 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -434,7 +434,10 @@ void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa); #define xfs_filestream_select_ag(...) (-ENOSYS) /* quota bits */ -#define xfs_trans_mod_dquot_byino(t,i,f,d) ((void) 0) +#define xfs_trans_mod_dquot_byino(t,i,f,d) ({ \ + uint _f = (f); \ + _f = _f; /* shut up gcc */ \ +}) #define xfs_trans_reserve_quota_nblks(t,i,b,n,f) (0) /* hack too silence gcc */ diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index ad058bb126e2..4f6bd8dff47e 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3257,10 +3257,14 @@ xfs_bmap_btalloc_select_lengths( } /* Update all inode and quota accounting for the allocation we just did. */ -static void -xfs_bmap_btalloc_accounting( +void +xfs_bmap_alloc_account( struct xfs_bmalloca *ap) { + bool isrt = XFS_IS_REALTIME_INODE(ap->ip) && + (ap->flags & XFS_BMAPI_ATTRFORK); + uint fld; + if (ap->flags & XFS_BMAPI_COWFORK) { /* * COW fork blocks are in-core only and thus are treated as @@ -3285,7 +3289,8 @@ xfs_bmap_btalloc_accounting( * to that of a delalloc extent. */ ap->ip->i_delayed_blks += ap->length; - xfs_trans_mod_dquot_byino(ap->tp, ap->ip, XFS_TRANS_DQ_RES_BLKS, + xfs_trans_mod_dquot_byino(ap->tp, ap->ip, isrt ? + XFS_TRANS_DQ_RES_RTBLKS : XFS_TRANS_DQ_RES_BLKS, -(long)ap->length); return; } @@ -3296,10 +3301,12 @@ xfs_bmap_btalloc_accounting( if (ap->wasdel) { ap->ip->i_delayed_blks -= ap->length; xfs_mod_delalloc(ap->ip->i_mount, -(int64_t)ap->length); + fld = isrt ? XFS_TRANS_DQ_DELRTBCOUNT : XFS_TRANS_DQ_DELBCOUNT; + } else { + fld = isrt ? XFS_TRANS_DQ_RTBCOUNT : XFS_TRANS_DQ_BCOUNT; } - xfs_trans_mod_dquot_byino(ap->tp, ap->ip, - ap->wasdel ? XFS_TRANS_DQ_DELBCOUNT : XFS_TRANS_DQ_BCOUNT, - ap->length); + + xfs_trans_mod_dquot_byino(ap->tp, ap->ip, fld, ap->length); } static int @@ -3373,7 +3380,7 @@ xfs_bmap_process_allocated_extent( ap->offset = orig_offset; else if (ap->offset + ap->length < orig_offset + orig_length) ap->offset = orig_offset + orig_length - ap->length; - xfs_bmap_btalloc_accounting(ap); + xfs_bmap_alloc_account(ap); } #ifdef DEBUG diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 4b83f6148e00..f6b73f1bad5f 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -116,6 +116,8 @@ static inline int xfs_bmapi_whichfork(uint32_t bmapi_flags) return XFS_DATA_FORK; } +void xfs_bmap_alloc_account(struct xfs_bmalloca *ap); + /* * Special values for xfs_bmbt_irec_t br_startblock field. */ diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 73ba067df06e..887ba56f3b7b 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -21,6 +21,7 @@ #include "xfs_trace.h" #include "xfs_rmap.h" #include "xfs_ag.h" +#include "xfs_quota_defs.h" static struct kmem_cache *xfs_bmbt_cur_cache; From patchwork Wed Mar 13 02:05:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590889 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD49A79C5 for ; Wed, 13 Mar 2024 02:05:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295533; cv=none; b=aT3RWuFF9oAqcdUYid3idmuVnjwv2XlBPVwddCuqyFIFA8Muviu72TF1rgXuIjnsjcfjDiEjbTlhS5mT9sEMk5cIwtREyBWreHnrfIHPBPrnAkxeX00ggVcU9rMj7GnoOuBTBNL6y0Wd/sqg897sXp2f+lbnlLMKId4Pu93LIMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295533; c=relaxed/simple; bh=YU7nz1stGlg5S8IZ8DrTLoVx1RAyf+WBmNkbFhPzwNo=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=erXTIJKrgrMNvbLMl9irQ+PHuydCL24CgM07UWBH6OBCjMB4QqIS7pvOgqBv4zRklfe83PG5HunZSdpLbvQv/mYlOuQx2QNKxdDBxkUTetuAJFe+b07TffrcgixOzraKQD6VtV/ecM5/EPRgtFJsw6W1CST1au3u0+5vkprK55M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hOyqQnBT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hOyqQnBT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70506C433F1; Wed, 13 Mar 2024 02:05:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295533; bh=YU7nz1stGlg5S8IZ8DrTLoVx1RAyf+WBmNkbFhPzwNo=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=hOyqQnBTH9pc+GYopMiDWpKijrEWsUt6x7hIbHzItiL2c+ppu76boxaxSXMG9yk7B 9XnnsIrkJPpxdgZvjW++WuDp5/6kD129MPG/2ga0JDnzC5DoyPKImR+s/fUwdmw0wX uGJshWGXt/pmoEfQTq8+ACTmuu+harlCXr130A8lvPYwD+1KGoU1bal+UdQnq07M0d atjmkN1MJr4lXy9uwVkU2PuDo37tji07ROOHRmyxoOflQVTnVcfsFBNWT1nELz22ll PVEM2HVCU7pDzhiBLOCA3tPC3tx4eRG77VZRXSdaBipyVQzfN2oul5rDnOEIMSV7om Pt28eAEVtDaAw== Date: Tue, 12 Mar 2024 19:05:33 -0700 Subject: [PATCH 48/67] xfs: return -ENOSPC from xfs_rtallocate_* From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431886.2061787.10702090808474301367.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: ce42b5d37527b282d38413c1b5f7283253f6562d Just return -ENOSPC instead of returning 0 and setting the return rt extent number to NULLRTEXTNO. This is turn removes all users of NULLRTEXTNO, so remove that as well. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_types.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index 035bf703d719..20b5375f2d9c 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -51,7 +51,6 @@ typedef void * xfs_failaddr_t; #define NULLRFSBLOCK ((xfs_rfsblock_t)-1) #define NULLRTBLOCK ((xfs_rtblock_t)-1) #define NULLFILEOFF ((xfs_fileoff_t)-1) -#define NULLRTEXTNO ((xfs_rtxnum_t)-1) #define NULLAGBLOCK ((xfs_agblock_t)-1) #define NULLAGNUMBER ((xfs_agnumber_t)-1) From patchwork Wed Mar 13 02:05:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590890 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 85861B652 for ; Wed, 13 Mar 2024 02:05:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295549; cv=none; b=OQvRjJ2mtdTjGOr+46Dt9Mbp3k5c6Q7ixsbF2F0JHgVRTI4HoWRDq6CdAtkSwmwbHbvwM5ldcPaPhrhyt1aW0w+hf0Vq2LAYY0EuGjsHTHVlHuVWqyZsQFTX2YmuYctw4IxNFCSw+tdIzj/OZO+SIp6FsekQETg4ovMZ2NKoV9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295549; c=relaxed/simple; bh=ln/bdOJCNmdC30DriNw+erDI9OxRke2HdFo6oKAbP74=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AcjWiWbl9nAkZP4FsxQCIT6NhVfKXolNXJWVHTsr7i0GPhpayvOvlW7ivh1meGXrUUFbfaIIN2JP+KNqGBQI7uIkiu8Zak1JiM/xCFtXy9Rusphrz30ekR7+6itEcOGzIXComyOdc57dNPALtUOnGILSxg4okI2TZyOYZLyPDRE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CNPfvpuW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CNPfvpuW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0BFDCC433C7; Wed, 13 Mar 2024 02:05:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295549; bh=ln/bdOJCNmdC30DriNw+erDI9OxRke2HdFo6oKAbP74=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=CNPfvpuWYHo2hbBnCyfNYcrtV+KEfw6psqvSavJOFqDHtS8nOT7UAxFwWigZAYCJP 5Vkb3j74G4agpevC4OY4WKqJCeBAthfAWWGea0EHApTpeorPz2lMxXqqFasfP08VwZ reBUx7R3GTSpHeZR9oqqI/rXKqDEvlrCgfTRBTAuzt4G9aUf//7Khu8k/F97igxlG6 BSRBGDblbsG13RAFoiWbD9R2pXe9bre4dGFPdLdp6B8Njwfuutcl8D/f13ic7XvUF1 n+ltzBahaSq5V0lzv7JLxV9xgGBAX6u8Jbyv7wxgjrvy/hjgIc+gd0uSo4gGLUpr9q 03HFcUlvf3GCg== Date: Tue, 12 Mar 2024 19:05:48 -0700 Subject: [PATCH 49/67] xfs: indicate if xfs_bmap_adjacent changed ap->blkno From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431900.2061787.12869819211714775705.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 676544c27e710aee7f8357f57abd348d98b1ccd4 Add a return value to xfs_bmap_adjacent to indicate if it did change ap->blkno or not. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/libxfs_priv.h | 2 +- libxfs/xfs_bmap.c | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 28ee192509c7..705b66bed13f 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -565,7 +565,7 @@ int xfs_bmap_extsize_align(struct xfs_mount *mp, struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp, xfs_extlen_t extsz, int rt, int eof, int delay, int convert, xfs_fileoff_t *offp, xfs_extlen_t *lenp); -void xfs_bmap_adjacent(struct xfs_bmalloca *ap); +bool xfs_bmap_adjacent(struct xfs_bmalloca *ap); int xfs_bmap_last_extent(struct xfs_trans *tp, struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *rec, int *is_empty); diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 4f6bd8dff47e..b977032d8244 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3038,7 +3038,8 @@ xfs_bmap_extsize_align( #define XFS_ALLOC_GAP_UNITS 4 -void +/* returns true if ap->blkno was modified */ +bool xfs_bmap_adjacent( struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { @@ -3073,13 +3074,14 @@ xfs_bmap_adjacent( if (adjust && ISVALID(ap->blkno + adjust, ap->prev.br_startblock)) ap->blkno += adjust; + return true; } /* * If not at eof, then compare the two neighbor blocks. * Figure out whether either one gives us a good starting point, * and pick the better one. */ - else if (!ap->eof) { + if (!ap->eof) { xfs_fsblock_t gotbno; /* right side block number */ xfs_fsblock_t gotdiff=0; /* right side difference */ xfs_fsblock_t prevbno; /* left side block number */ @@ -3159,14 +3161,21 @@ xfs_bmap_adjacent( * If both valid, pick the better one, else the only good * one, else ap->blkno is already set (to 0 or the inode block). */ - if (prevbno != NULLFSBLOCK && gotbno != NULLFSBLOCK) + if (prevbno != NULLFSBLOCK && gotbno != NULLFSBLOCK) { ap->blkno = prevdiff <= gotdiff ? prevbno : gotbno; - else if (prevbno != NULLFSBLOCK) + return true; + } + if (prevbno != NULLFSBLOCK) { ap->blkno = prevbno; - else if (gotbno != NULLFSBLOCK) + return true; + } + if (gotbno != NULLFSBLOCK) { ap->blkno = gotbno; + return true; + } } #undef ISVALID + return false; } int From patchwork Wed Mar 13 02:06:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590891 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7217B663 for ; Wed, 13 Mar 2024 02:06:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295564; cv=none; b=SN2WPLfBg+ZnvjBv/sm2odAphHLJxq8osvt/P84bnWR3aVeXe/NLuS1xtYCN2OtYLGg82WIwI68Tn63G5t3+GUC/MlSk1oM8NQi4Thhywh3NbV0j1IroD34tPAzMhWDJl+92Q1vYmozL9osP4mFYKW9sMUx8h6GuZyqPxvhvbVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295564; c=relaxed/simple; bh=d135qYkL5tZTrvIZtfe1/acmvqKeoAyrztESqwQiWjE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=h/QkFXXMdZK9e406PDVyT0IEoDMhaHTspP5eWmsQnLBWomSqVdHWODiHMMcsT24Is0L2tzs16CTrPPf0hZaEjltcWFmdtoAHs3+U9oYLNXn4U/j3vPEhcQsXBhEf/Z3ur3ntAIr4qBTdEejhKSKfOqAS/50wOh6Zw/SuFR1iE80= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dQLP/xx5; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dQLP/xx5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A3DA0C433F1; Wed, 13 Mar 2024 02:06:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295564; bh=d135qYkL5tZTrvIZtfe1/acmvqKeoAyrztESqwQiWjE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=dQLP/xx5+a37EFEiZXyAG43OY1F6iJzl4wNGbaBMlaK3Xly4iMVEBEZ4YbQiYIscD NAmPst16P2ZiVnojQ8oz6o/+gjSn6Sj1xL9e8dBeJIFqUrM/0lA1yNWx5c/TNVJMrp Wr8Toun9ujaBy9yVjyRWoOjpVXk9x7h8V+KJWEw65hB2JdKFJJk8pUk0wPe0fV36vT 6wYsmG1DJK6vdiefE/p7V0Wz3SAAse9XvkfD1bSLTQ1IkvNLgi+R2NqjyQrOrG19JS SWNb9qlf82dtPoBaXKYgOoztyqiX2Vn7gE2tiUvPp3vk40k5FLLDwwV75ayrUF8fPE IdbmuwUi8rFjg== Date: Tue, 12 Mar 2024 19:06:04 -0700 Subject: [PATCH 50/67] xfs: move xfs_rtget_summary to xfs_rtbitmap.c From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431915.2061787.9801038684009357665.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: c2adcfa31ff606264fab6e69129d6d45c9ddb7cb xfs_rtmodify_summary_int is only used inside xfs_rtbitmap.c and to implement xfs_rtget_summary. Move xfs_rtget_summary to xfs_rtbitmap.c as the exported API and mark xfs_rtmodify_summary_int static. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_rtbitmap.c | 14 ++++++++++++++ libxfs/xfs_rtbitmap.h | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index 726543abb51a..adeaffed7764 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -517,6 +517,20 @@ xfs_rtmodify_summary( return xfs_rtmodify_summary_int(args, log, bbno, delta, NULL); } +/* + * Read and return the summary information for a given extent size, bitmap block + * combination. + */ +int +xfs_rtget_summary( + struct xfs_rtalloc_args *args, + int log, /* log2 of extent size */ + xfs_fileoff_t bbno, /* bitmap block number */ + xfs_suminfo_t *sum) /* out: summary info for this block */ +{ + return xfs_rtmodify_summary_int(args, log, bbno, 0, sum); +} + /* Log rtbitmap block from the word @from to the byte before @next. */ static inline void xfs_trans_log_rtbitmap( diff --git a/libxfs/xfs_rtbitmap.h b/libxfs/xfs_rtbitmap.h index 1c84b52de3d4..274dc7dae1fa 100644 --- a/libxfs/xfs_rtbitmap.h +++ b/libxfs/xfs_rtbitmap.h @@ -321,8 +321,8 @@ int xfs_rtfind_forw(struct xfs_rtalloc_args *args, xfs_rtxnum_t start, xfs_rtxnum_t limit, xfs_rtxnum_t *rtblock); int xfs_rtmodify_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start, xfs_rtxlen_t len, int val); -int xfs_rtmodify_summary_int(struct xfs_rtalloc_args *args, int log, - xfs_fileoff_t bbno, int delta, xfs_suminfo_t *sum); +int xfs_rtget_summary(struct xfs_rtalloc_args *args, int log, + xfs_fileoff_t bbno, xfs_suminfo_t *sum); int xfs_rtmodify_summary(struct xfs_rtalloc_args *args, int log, xfs_fileoff_t bbno, int delta); int xfs_rtfree_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start, From patchwork Wed Mar 13 02:06:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590892 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F791BA27 for ; Wed, 13 Mar 2024 02:06:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295580; cv=none; b=DeO5oSbk7fhjTz292cN6rbbgw1zqACUBkhmBWHZFRIgGGbo4eU42clp1iYhCvriLq/cHKMhGld/oUfomL2iGYy5W40jQ/lfAjO7FjPRy4QGznXJlYHBkAZqIIdjToC66BRFETxGnXwtiD2RE6m5XMcQf4nTz1WciEtcFtDdAXXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295580; c=relaxed/simple; bh=edfwR++0CB/YoHE25GT+WFHJeCmxvltWaGUo6WFqPsw=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ATCDxLg7NmLXlfHxZB69M4KGpiVvOPm96pnEChneihjBRJIo6vwAdqo+qmuSLg9HznsT0mqbNWfhT+ip7MacJEzwaVPWfGJCxUU2VuCP1ueYntFqU6OwD+GvrF7gELG4urkmlH0ztMSFs8Wz+0YXNOLEO6AGbcpCGjRNJG2W40s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CA8+PGy7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CA8+PGy7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48072C433F1; Wed, 13 Mar 2024 02:06:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295580; bh=edfwR++0CB/YoHE25GT+WFHJeCmxvltWaGUo6WFqPsw=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=CA8+PGy7LIiDbOOlvj3jdlJJgmbemA/HwW9pWruzkkgkORdlHtMjHTm4cCdbMhxza csjVqwCv9a8B2p6L3qyzQquLyU5RLQ3RX4pxIZ0fr6rNmRze+osb7zx6ty8EFbQTe7 /0vpctSu+tqWe7v7GxvOhmBdAo/TDGgq8Z0Gg6GjZ1J7rlqgslSL9hWMvIQTC2IIN7 MeTp67FLJjCbVQ0gaiCQ26KqRAyRbmYDOiRj31jJrmNqrXV2ZaQZQjvkJ+CC+RLmSU PbVfV2Jp5n5RKfPVVQy50pWHOoiY/BwCKTQvDnq7H88Ac5uuTxw0r0pp6egpLc7q5P xrUNPizlwqpNg== Date: Tue, 12 Mar 2024 19:06:19 -0700 Subject: [PATCH 51/67] xfs: split xfs_rtmodify_summary_int From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431929.2061787.9927966550049035309.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: b271b314119eca1fb98a2c4e15304ce562802f0c Inline the logic of xfs_rtmodify_summary_int into xfs_rtmodify_summary and xfs_rtget_summary instead of having a somewhat awkward helper to share a little bit of code. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_rtbitmap.c | 90 +++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 58 deletions(-) diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index adeaffed7764..bbf955be852a 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -450,63 +450,9 @@ xfs_trans_log_rtsummary( } /* - * Read and/or modify the summary information for a given extent size, - * bitmap block combination. - * Keeps track of a current summary block, so we don't keep reading - * it from the buffer cache. - * - * Summary information is returned in *sum if specified. - * If no delta is specified, returns summary only. + * Modify the summary information for a given extent size, bitmap block + * combination. */ -int -xfs_rtmodify_summary_int( - struct xfs_rtalloc_args *args, - int log, /* log2 of extent size */ - xfs_fileoff_t bbno, /* bitmap block number */ - int delta, /* change to make to summary info */ - xfs_suminfo_t *sum) /* out: summary info for this block */ -{ - struct xfs_mount *mp = args->mp; - int error; - xfs_fileoff_t sb; /* summary fsblock */ - xfs_rtsumoff_t so; /* index into the summary file */ - unsigned int infoword; - - /* - * Compute entry number in the summary file. - */ - so = xfs_rtsumoffs(mp, log, bbno); - /* - * Compute the block number in the summary file. - */ - sb = xfs_rtsumoffs_to_block(mp, so); - - error = xfs_rtsummary_read_buf(args, sb); - if (error) - return error; - - /* - * Point to the summary information, modify/log it, and/or copy it out. - */ - infoword = xfs_rtsumoffs_to_infoword(mp, so); - if (delta) { - xfs_suminfo_t val = xfs_suminfo_add(args, infoword, delta); - - if (mp->m_rsum_cache) { - if (val == 0 && log + 1 == mp->m_rsum_cache[bbno]) - mp->m_rsum_cache[bbno] = log; - if (val != 0 && log >= mp->m_rsum_cache[bbno]) - mp->m_rsum_cache[bbno] = log + 1; - } - xfs_trans_log_rtsummary(args, infoword); - if (sum) - *sum = val; - } else if (sum) { - *sum = xfs_suminfo_get(args, infoword); - } - return 0; -} - int xfs_rtmodify_summary( struct xfs_rtalloc_args *args, @@ -514,7 +460,28 @@ xfs_rtmodify_summary( xfs_fileoff_t bbno, /* bitmap block number */ int delta) /* in/out: summary block number */ { - return xfs_rtmodify_summary_int(args, log, bbno, delta, NULL); + struct xfs_mount *mp = args->mp; + xfs_rtsumoff_t so = xfs_rtsumoffs(mp, log, bbno); + unsigned int infoword; + xfs_suminfo_t val; + int error; + + error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so)); + if (error) + return error; + + infoword = xfs_rtsumoffs_to_infoword(mp, so); + val = xfs_suminfo_add(args, infoword, delta); + + if (mp->m_rsum_cache) { + if (val == 0 && log + 1 == mp->m_rsum_cache[bbno]) + mp->m_rsum_cache[bbno] = log; + if (val != 0 && log >= mp->m_rsum_cache[bbno]) + mp->m_rsum_cache[bbno] = log + 1; + } + + xfs_trans_log_rtsummary(args, infoword); + return 0; } /* @@ -528,7 +495,14 @@ xfs_rtget_summary( xfs_fileoff_t bbno, /* bitmap block number */ xfs_suminfo_t *sum) /* out: summary info for this block */ { - return xfs_rtmodify_summary_int(args, log, bbno, 0, sum); + struct xfs_mount *mp = args->mp; + xfs_rtsumoff_t so = xfs_rtsumoffs(mp, log, bbno); + int error; + + error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so)); + if (!error) + *sum = xfs_suminfo_get(args, xfs_rtsumoffs_to_infoword(mp, so)); + return error; } /* Log rtbitmap block from the word @from to the byte before @next. */ From patchwork Wed Mar 13 02:06:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590893 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DEC2BA27 for ; Wed, 13 Mar 2024 02:06:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295596; cv=none; b=UBxSn6fJI83KLVYJJsQGDIeLd/7CgB7IPao1j2atqcrenVQAeN9JHunkAGW1wLV9ngTl0N0UY8yrjOd1Z7fvQ/1qvAGhH5fILZmRv1o1U/oNTpuehbdrTGDu0Hu7aFd17GQ9f0K7DkvPFTlXbkxtUC1qxhoCqgBGno8YBhy31Go= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295596; c=relaxed/simple; bh=hf1XHQME6cOXumdYrXR7WXApK7eVEM5f3o1K5knPNu0=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=grsFUGc/QJ5ijs9hey8t33KrS4+RpEv/zhQ9iTLczOUqUBYBvWgdpUJrVB+DphqwKdZUQMQdg7FvQPgmx7A61PjONS1IJKAaIb23Ls5yd5uuKjSPeEJSUIpOzvXPI5UHpMt3OD5ryv6TCegAUloRHIsclz4pMcG3rb9f3wGyREY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nbTxCQCb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nbTxCQCb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D3EC4C433C7; Wed, 13 Mar 2024 02:06:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295595; bh=hf1XHQME6cOXumdYrXR7WXApK7eVEM5f3o1K5knPNu0=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=nbTxCQCb8/zhC2AoUeZpLOoQc0+eAkmQkBhGmaY0QHyqE0i6Kx4cbPWSS+/LBAn6R fma0Clq+x3EI9t0Nl61n/aRCpGxyFnmvTAY2Y86b7z8B91AMp4+8GHosAbeO/AODRY sIFg+HcESAkLxKIWOPvsXjC1b/LSpPB0VQqn5l98PO7Vw12Mkt5UU1tpceZbv0yq1E nZsrEATTOhRaCQQYkAGvGr38KkYi/RM6M6BzHNY0X90ziSgrIpnGGyLUSh4ZAu6suI VPScMO21KzAURyVz8p+nHzNSWCdBoXvvvxf40NIbqX9gXSJc5nd4mlksl48opF5vHO bY81EWx3DHwCQ== Date: Tue, 12 Mar 2024 19:06:35 -0700 Subject: [PATCH 52/67] xfs: remove rt-wrappers from xfs_format.h From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431944.2061787.16040978514955489550.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 3abfe6c2759e2e3000b13f8ce8a1a325e80987a1 xfs_format.h has a bunch odd wrappers for helper functions and mount structure access using RT* prefixes. Replace them with their open coded versions (for those that weren't entirely unused) and remove the wrappers. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- db/check.c | 4 ++-- libxfs/xfs_format.h | 8 -------- libxfs/xfs_rtbitmap.c | 24 ++++++++++++------------ repair/rt.c | 6 ++---- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/db/check.c b/db/check.c index 2f2fbc7cbd81..91d0c094064b 100644 --- a/db/check.c +++ b/db/check.c @@ -3688,7 +3688,7 @@ process_rtbitmap( } else if (prevbit == 1) { len = ((int)bmbno - start_bmbno) * bitsperblock + (bit - start_bit); - log = XFS_RTBLOCKLOG(len); + log = libxfs_highbit64(len); offs = xfs_rtsumoffs(mp, log, start_bmbno); inc_sumcount(mp, sumcompute, offs); prevbit = 0; @@ -3701,7 +3701,7 @@ process_rtbitmap( if (prevbit == 1) { len = ((int)bmbno - start_bmbno) * bitsperblock + (bit - start_bit); - log = XFS_RTBLOCKLOG(len); + log = libxfs_highbit64(len); offs = xfs_rtsumoffs(mp, log, start_bmbno); inc_sumcount(mp, sumcompute, offs); } diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index e6ca188e2271..7d2873a79a48 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1156,20 +1156,12 @@ static inline bool xfs_dinode_has_large_extent_counts( #define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ #define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ -#define XFS_BLOCKSIZE(mp) ((mp)->m_sb.sb_blocksize) -#define XFS_BLOCKMASK(mp) ((mp)->m_blockmask) - /* * RT bit manipulation macros. */ #define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b)) #define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b)) -#define XFS_RTLOBIT(w) xfs_lowbit32(w) -#define XFS_RTHIBIT(w) xfs_highbit32(w) - -#define XFS_RTBLOCKLOG(b) xfs_highbit64(b) - /* * Dquot and dquot block format definitions */ diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index bbf955be852a..eefc45c64e20 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -193,7 +193,7 @@ xfs_rtfind_back( /* * Different. Mark where we are and return. */ - i = bit - XFS_RTHIBIT(wdiff); + i = bit - xfs_highbit32(wdiff); *rtx = start - i + 1; return 0; } @@ -231,7 +231,7 @@ xfs_rtfind_back( /* * Different, mark where we are and return. */ - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); *rtx = start - i + 1; return 0; } @@ -270,7 +270,7 @@ xfs_rtfind_back( /* * Different, mark where we are and return. */ - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); *rtx = start - i + 1; return 0; } else @@ -346,7 +346,7 @@ xfs_rtfind_forw( /* * Different. Mark where we are and return. */ - i = XFS_RTLOBIT(wdiff) - bit; + i = xfs_lowbit32(wdiff) - bit; *rtx = start + i - 1; return 0; } @@ -384,7 +384,7 @@ xfs_rtfind_forw( /* * Different, mark where we are and return. */ - i += XFS_RTLOBIT(wdiff); + i += xfs_lowbit32(wdiff); *rtx = start + i - 1; return 0; } @@ -421,7 +421,7 @@ xfs_rtfind_forw( /* * Different, mark where we are and return. */ - i += XFS_RTLOBIT(wdiff); + i += xfs_lowbit32(wdiff); *rtx = start + i - 1; return 0; } else @@ -706,7 +706,7 @@ xfs_rtfree_range( */ if (preblock < start) { error = xfs_rtmodify_summary(args, - XFS_RTBLOCKLOG(start - preblock), + xfs_highbit64(start - preblock), xfs_rtx_to_rbmblock(mp, preblock), -1); if (error) { return error; @@ -718,7 +718,7 @@ xfs_rtfree_range( */ if (postblock > end) { error = xfs_rtmodify_summary(args, - XFS_RTBLOCKLOG(postblock - end), + xfs_highbit64(postblock - end), xfs_rtx_to_rbmblock(mp, end + 1), -1); if (error) { return error; @@ -729,7 +729,7 @@ xfs_rtfree_range( * (new) free extent. */ return xfs_rtmodify_summary(args, - XFS_RTBLOCKLOG(postblock + 1 - preblock), + xfs_highbit64(postblock + 1 - preblock), xfs_rtx_to_rbmblock(mp, preblock), 1); } @@ -798,7 +798,7 @@ xfs_rtcheck_range( /* * Different, compute first wrong bit and return. */ - i = XFS_RTLOBIT(wdiff) - bit; + i = xfs_lowbit32(wdiff) - bit; *new = start + i; *stat = 0; return 0; @@ -837,7 +837,7 @@ xfs_rtcheck_range( /* * Different, compute first wrong bit and return. */ - i += XFS_RTLOBIT(wdiff); + i += xfs_lowbit32(wdiff); *new = start + i; *stat = 0; return 0; @@ -875,7 +875,7 @@ xfs_rtcheck_range( /* * Different, compute first wrong bit and return. */ - i += XFS_RTLOBIT(wdiff); + i += xfs_lowbit32(wdiff); *new = start + i; *stat = 0; return 0; diff --git a/repair/rt.c b/repair/rt.c index e49487829af2..4c81e2114c77 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -14,8 +14,6 @@ #include "err_protos.h" #include "rt.h" -#define xfs_highbit64 libxfs_highbit64 /* for XFS_RTBLOCKLOG macro */ - void rtinit(xfs_mount_t *mp) { @@ -115,7 +113,7 @@ generate_rtinfo( } } else if (in_extent == 1) { len = (int) (extno - start_ext); - log = XFS_RTBLOCKLOG(len); + log = libxfs_highbit64(len); offs = xfs_rtsumoffs(mp, log, start_bmbno); inc_sumcount(mp, sumcompute, offs); in_extent = 0; @@ -131,7 +129,7 @@ generate_rtinfo( } if (in_extent == 1) { len = (int) (extno - start_ext); - log = XFS_RTBLOCKLOG(len); + log = libxfs_highbit64(len); offs = xfs_rtsumoffs(mp, log, start_bmbno); inc_sumcount(mp, sumcompute, offs); } From patchwork Wed Mar 13 02:06:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590894 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3DE179C5 for ; Wed, 13 Mar 2024 02:06:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295611; cv=none; b=gAzeb47HA7xSKOiMXEXGO6Aqp8o4bU1jsOXfbAHyfYHcPFlMgntb2hEaqZPiqaaWFLcOFDvyIGM0aTPSlqFhOAZoLUGmv6xhQrKIT8hdfiYBZVGied1Awe5LNwFSmHmKCZmoAfbQ9bAy43JqQlDpiZHyVlphjQOr1RH2e5eIqOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295611; c=relaxed/simple; bh=B2EbIgeRtSa5Y2GXh7GeFxWa27tQ3HgCzCNnvz5+UEg=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ccr4/V86PTxBlWUNoXaDZS7+aEhLFFJz2Zf/0bAV2Sc54WBMkcOvgueceedR/vho6g4FcJVrecovq+oZfbv50XEkyQKeZGsdsORtEpAn4qWW2Gq2H7f8bqHAEkiOvFrB8yX6guGR89FUjint9kIbazfzd2HmhjjCcv/nkljv17A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=o7Hpgb0J; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="o7Hpgb0J" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8166FC433C7; Wed, 13 Mar 2024 02:06:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295611; bh=B2EbIgeRtSa5Y2GXh7GeFxWa27tQ3HgCzCNnvz5+UEg=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=o7Hpgb0Jq6IR1FmIOdP4tR/b+ZH59ye9qp9p+R0eIrWkcuC48Q2eWDRI4QTt9nIVy P4ZnozvyMb7eGcicG6eSuwJYP6hdJWFA1NlheTH9Ei7W6LwW3Sil6t6QLygY1HRD4F ZWviAxD5cpU6FvPzUCiW8Nsr5zJbMLm7O7dRxK8jg8Gr9pzt0qxz2iZK5UXTrXUCvj 8IcfAP0NAccg98hMntr4SzUs/xNgOcpObdBHEKd3l4giRgxf2gDhPdLM1dLz+i4MQr U1OIGELYqz1tflgflInr8AqR/AZuK9WL6+zuAc1IFyXMiE6l+1AyiERCbGCZq829It PWINN1Y/WDk6Q== Date: Tue, 12 Mar 2024 19:06:51 -0700 Subject: [PATCH 53/67] xfs: remove XFS_RTMIN/XFS_RTMAX From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431958.2061787.12672887305529191027.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: a39f5ccc30d5a00b7e6d921aa387ad17d1e6d168 Use the kernel min/max helpers instead. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_format.h | 6 ------ libxfs/xfs_rtbitmap.c | 8 ++++---- mkfs/proto.c | 4 ++-- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 7d2873a79a48..382ab1e71c0b 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1156,12 +1156,6 @@ static inline bool xfs_dinode_has_large_extent_counts( #define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ #define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ -/* - * RT bit manipulation macros. - */ -#define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b)) -#define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b)) - /* * Dquot and dquot block format definitions */ diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index eefc45c64e20..79af7cda3441 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -182,7 +182,7 @@ xfs_rtfind_back( * Calculate first (leftmost) bit number to look at, * and mask for all the relevant bits in this word. */ - firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); + firstbit = max_t(xfs_srtblock_t, bit - len + 1, 0); mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << firstbit; /* @@ -336,7 +336,7 @@ xfs_rtfind_forw( * Calculate last (rightmost) bit number to look at, * and mask for all the relevant bits in this word. */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + lastbit = min(bit + len, XFS_NBWORD); mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; /* * Calculate the difference between the value there @@ -571,7 +571,7 @@ xfs_rtmodify_range( /* * Compute first bit not changed and mask of relevant bits. */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + lastbit = min(bit + len, XFS_NBWORD); mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; /* * Set/clear the active bits. @@ -785,7 +785,7 @@ xfs_rtcheck_range( /* * Compute first bit not examined. */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + lastbit = min(bit + len, XFS_NBWORD); /* * Mask of relevant bits. */ diff --git a/mkfs/proto.c b/mkfs/proto.c index f8e00c4b56f0..10b929b2ec37 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -793,8 +793,8 @@ rtfreesp_init( res_failed(error); libxfs_trans_ijoin(tp, mp->m_rbmip, 0); - ertx = XFS_RTMIN(mp->m_sb.sb_rextents, - rtx + NBBY * mp->m_sb.sb_blocksize); + ertx = min(mp->m_sb.sb_rextents, + rtx + NBBY * mp->m_sb.sb_blocksize); error = -libxfs_rtfree_extent(tp, rtx, (xfs_rtxlen_t)(ertx - rtx)); From patchwork Wed Mar 13 02:07:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590895 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 68C6279C5 for ; Wed, 13 Mar 2024 02:07:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295627; cv=none; b=C7eFjCPn5DGfTMNXPiAyu6OC8UItR/96XUJ3WEIUVU+cqeV1Qqq/osDB+edM3r5DrfhTRoeE5Qb5KZQqVyFhsXnwKuIMp6eZntGNcAs23qcEqvXLfAEM6DIb/J5PLCymzQj+LQKyc6LZTpxDZIrPoNtFS5AhT7yZ509mFwGoDPc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295627; c=relaxed/simple; bh=86u8XVXo9WbhasyfPaYy9M90qtUrFAfdYMsRrsmc/TQ=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gRVf6WWawyM3hfmk59sdSlbwtduTF9kpYsOH9LKkjLdIQLZF087fmddtiLEsQ2zwmPgGeJPsHsqOUUm2zZ9RFlCZsvWhkgMxOOXIJoNqK32QCVpQfrTOvJzfPKDNaq9KNXL4BuENPrhw+jYvGbKF/qp1/DGnhjZQedW6S3rLvzU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=km5zteb9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="km5zteb9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F315C43390; Wed, 13 Mar 2024 02:07:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295627; bh=86u8XVXo9WbhasyfPaYy9M90qtUrFAfdYMsRrsmc/TQ=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=km5zteb94ENB3ExsHukmEKMJ3CzWIvOnwbuU0+AZmWfNzpoHWtAmPtH40Gl+WDQqn y6EYhkYtsTi3uOkhXXF+tjjJPgF0gzC6clfAmyyGOPazwM67ce+8h3FgGuv1A0jqA4 UVnpBHc2+xmEBYO4+QlprLvmOHpKIrZvcFFAJyKAEGNzBugYse4eVY3xXdhPsBfRyP bRWLqwITsFGUb8FiX936RHfQTy2oGzIrQxwEM/tNWG7sqmLCMcm7dgz17kkWzzFs/h +n9i2MA2+akZSVh2cghlRvwl/tVYQA9BGxk1+atV8eoAO1vZgTaZ0vs88ZuzJlXupF rjKE9aobZYvGQ== Date: Tue, 12 Mar 2024 19:07:06 -0700 Subject: [PATCH 54/67] xfs: make if_data a void pointer From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431972.2061787.17434728385863254413.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 6e145f943bd86be47e54101fa5939f9ed0cb73e5 The xfs_ifork structure currently has a union of the if_root void pointer and the if_data char pointer. In either case it is an opaque pointer that depends on the fork format. Replace the union with a single if_data void pointer as that is what almost all callers want. Only the symlink NULL termination code in xfs_init_local_fork actually needs a new local variable now. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- db/namei.c | 4 +-- libxfs/util.c | 2 + libxfs/xfs_attr.c | 3 +- libxfs/xfs_attr_leaf.c | 62 +++++++++++++++++-------------------------- libxfs/xfs_bmap.c | 4 +-- libxfs/xfs_dir2.c | 2 + libxfs/xfs_dir2_block.c | 6 +--- libxfs/xfs_dir2_sf.c | 61 +++++++++++++++++------------------------- libxfs/xfs_iext_tree.c | 36 ++++++++++++------------- libxfs/xfs_inode_fork.c | 53 +++++++++++++++++-------------------- libxfs/xfs_inode_fork.h | 8 ++---- libxfs/xfs_symlink_remote.c | 4 +-- repair/phase6.c | 9 +++--- 13 files changed, 107 insertions(+), 147 deletions(-) diff --git a/db/namei.c b/db/namei.c index 063721ca98f2..5a6fd2036a37 100644 --- a/db/namei.c +++ b/db/namei.c @@ -290,14 +290,12 @@ list_sfdir( struct xfs_mount *mp = dp->i_mount; struct xfs_da_geometry *geo = args->geo; struct xfs_dir2_sf_entry *sfep; - struct xfs_dir2_sf_hdr *sfp; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; xfs_ino_t ino; xfs_dir2_dataptr_t off; unsigned int i; uint8_t filetype; - sfp = (struct xfs_dir2_sf_hdr *)dp->i_df.if_u1.if_data; - /* . and .. entries */ off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, geo->data_entry_offset); diff --git a/libxfs/util.c b/libxfs/util.c index 8517bfb64b52..8cea0c1500b4 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -316,7 +316,7 @@ libxfs_init_new_inode( case S_IFLNK: ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS; ip->i_df.if_bytes = 0; - ip->i_df.if_u1.if_root = NULL; + ip->i_df.if_data = NULL; break; default: ASSERT(0); diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index cb6c8d081fd3..d7512efd42a8 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -1047,9 +1047,8 @@ xfs_attr_set( static inline int xfs_attr_sf_totsize(struct xfs_inode *dp) { - struct xfs_attr_shortform *sf; + struct xfs_attr_shortform *sf = dp->i_af.if_data; - sf = (struct xfs_attr_shortform *)dp->i_af.if_u1.if_data; return be16_to_cpu(sf->hdr.totsize); } diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 8329348eb78b..5ab52bf1aa66 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -688,7 +688,7 @@ xfs_attr_shortform_create( if (ifp->if_format == XFS_DINODE_FMT_EXTENTS) ifp->if_format = XFS_DINODE_FMT_LOCAL; xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK); - hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data; + hdr = ifp->if_data; memset(hdr, 0, sizeof(*hdr)); hdr->totsize = cpu_to_be16(sizeof(*hdr)); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); @@ -709,14 +709,13 @@ xfs_attr_sf_findname( struct xfs_attr_sf_entry **sfep, unsigned int *basep) { - struct xfs_attr_shortform *sf; + struct xfs_attr_shortform *sf = args->dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; unsigned int base = sizeof(struct xfs_attr_sf_hdr); int size = 0; int end; int i; - sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data; sfe = &sf->list[0]; end = sf->hdr.count; for (i = 0; i < end; sfe = xfs_attr_sf_nextentry(sfe), @@ -748,29 +747,25 @@ xfs_attr_shortform_add( struct xfs_da_args *args, int forkoff) { - struct xfs_attr_shortform *sf; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_ifork *ifp = &dp->i_af; + struct xfs_attr_shortform *sf = ifp->if_data; struct xfs_attr_sf_entry *sfe; int offset, size; - struct xfs_mount *mp; - struct xfs_inode *dp; - struct xfs_ifork *ifp; trace_xfs_attr_sf_add(args); - dp = args->dp; - mp = dp->i_mount; dp->i_forkoff = forkoff; - ifp = &dp->i_af; ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data; if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST) ASSERT(0); offset = (char *)sfe - (char *)sf; size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen); xfs_idata_realloc(dp, size, XFS_ATTR_FORK); - sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data; + sf = ifp->if_data; sfe = (struct xfs_attr_sf_entry *)((char *)sf + offset); sfe->namelen = args->namelen; @@ -808,20 +803,16 @@ int xfs_attr_sf_removename( struct xfs_da_args *args) { - struct xfs_attr_shortform *sf; + struct xfs_inode *dp = args->dp; + struct xfs_mount *mp = dp->i_mount; + struct xfs_attr_shortform *sf = dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; int size = 0, end, totsize; unsigned int base; - struct xfs_mount *mp; - struct xfs_inode *dp; int error; trace_xfs_attr_sf_remove(args); - dp = args->dp; - mp = dp->i_mount; - sf = (struct xfs_attr_shortform *)dp->i_af.if_u1.if_data; - error = xfs_attr_sf_findname(args, &sfe, &base); /* @@ -875,18 +866,17 @@ xfs_attr_sf_removename( */ /*ARGSUSED*/ int -xfs_attr_shortform_lookup(xfs_da_args_t *args) +xfs_attr_shortform_lookup( + struct xfs_da_args *args) { - struct xfs_attr_shortform *sf; - struct xfs_attr_sf_entry *sfe; - int i; - struct xfs_ifork *ifp; + struct xfs_ifork *ifp = &args->dp->i_af; + struct xfs_attr_shortform *sf = ifp->if_data; + struct xfs_attr_sf_entry *sfe; + int i; trace_xfs_attr_sf_lookup(args); - ifp = &args->dp->i_af; ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data; sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = xfs_attr_sf_nextentry(sfe), i++) { @@ -906,14 +896,13 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args) */ int xfs_attr_shortform_getvalue( - struct xfs_da_args *args) + struct xfs_da_args *args) { - struct xfs_attr_shortform *sf; - struct xfs_attr_sf_entry *sfe; - int i; + struct xfs_attr_shortform *sf = args->dp->i_af.if_data; + struct xfs_attr_sf_entry *sfe; + int i; ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL); - sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data; sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = xfs_attr_sf_nextentry(sfe), i++) { @@ -930,25 +919,22 @@ int xfs_attr_shortform_to_leaf( struct xfs_da_args *args) { - struct xfs_inode *dp; - struct xfs_attr_shortform *sf; + struct xfs_inode *dp = args->dp; + struct xfs_ifork *ifp = &dp->i_af; + struct xfs_attr_shortform *sf = ifp->if_data; struct xfs_attr_sf_entry *sfe; struct xfs_da_args nargs; char *tmpbuffer; int error, i, size; xfs_dablk_t blkno; struct xfs_buf *bp; - struct xfs_ifork *ifp; trace_xfs_attr_sf_to_leaf(args); - dp = args->dp; - ifp = &dp->i_af; - sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data; size = be16_to_cpu(sf->hdr.totsize); tmpbuffer = kmem_alloc(size, 0); ASSERT(tmpbuffer != NULL); - memcpy(tmpbuffer, ifp->if_u1.if_data, size); + memcpy(tmpbuffer, ifp->if_data, size); sf = (struct xfs_attr_shortform *)tmpbuffer; xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index b977032d8244..5e6a5e1f355b 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -741,7 +741,7 @@ xfs_bmap_local_to_extents_empty( ASSERT(ifp->if_nextents == 0); xfs_bmap_forkoff_reset(ip, whichfork); - ifp->if_u1.if_root = NULL; + ifp->if_data = NULL; ifp->if_height = 0; ifp->if_format = XFS_DINODE_FMT_EXTENTS; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); @@ -826,7 +826,7 @@ xfs_bmap_local_to_extents( xfs_bmap_local_to_extents_empty(tp, ip, whichfork); flags |= XFS_ILOG_CORE; - ifp->if_u1.if_root = NULL; + ifp->if_data = NULL; ifp->if_height = 0; rec.br_startoff = 0; diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index c19684b34017..a781520c856d 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -195,7 +195,7 @@ xfs_dir_isempty( return 1; if (dp->i_disk_size > xfs_inode_data_fork_size(dp)) return 0; - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; return !sfp->count; } diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index bb9301b76880..bf950c7001f8 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -1086,7 +1086,7 @@ xfs_dir2_sf_to_block( int newoffset; /* offset from current entry */ unsigned int offset = geo->data_entry_offset; xfs_dir2_sf_entry_t *sfep; /* sf entry pointer */ - xfs_dir2_sf_hdr_t *oldsfp; /* old shortform header */ + struct xfs_dir2_sf_hdr *oldsfp = ifp->if_data; xfs_dir2_sf_hdr_t *sfp; /* shortform header */ __be16 *tagp; /* end of data entry */ struct xfs_name name; @@ -1096,10 +1096,8 @@ xfs_dir2_sf_to_block( ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); - oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data; - ASSERT(ifp->if_bytes == dp->i_disk_size); - ASSERT(ifp->if_u1.if_data != NULL); + ASSERT(oldsfp != NULL); ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count)); ASSERT(dp->i_df.if_nextents == 0); diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 260eccacf176..b2b43e937476 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -364,25 +364,23 @@ int /* error */ xfs_dir2_sf_addname( xfs_da_args_t *args) /* operation arguments */ { - xfs_inode_t *dp; /* incore directory inode */ + struct xfs_inode *dp = args->dp; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int error; /* error return value */ int incr_isize; /* total change in size */ int new_isize; /* size after adding name */ int objchange; /* changing to 8-byte inodes */ xfs_dir2_data_aoff_t offset = 0; /* offset for new entry */ int pick; /* which algorithm to use */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ xfs_dir2_sf_entry_t *sfep = NULL; /* shortform entry */ trace_xfs_dir2_sf_addname(args); ASSERT(xfs_dir2_sf_lookup(args) == -ENOENT); - dp = args->dp; ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); ASSERT(dp->i_df.if_bytes == dp->i_disk_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(sfp != NULL); ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Compute entry (and change in) size. @@ -462,11 +460,9 @@ xfs_dir2_sf_addname_easy( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; - int byteoff; /* byte offset in sf dir */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; + int byteoff = (int)((char *)sfep - (char *)sfp); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - byteoff = (int)((char *)sfep - (char *)sfp); /* * Grow the in-inode space. */ @@ -475,7 +471,7 @@ xfs_dir2_sf_addname_easy( /* * Need to set up again due to realloc of the inode data. */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; sfep = (xfs_dir2_sf_entry_t *)((char *)sfp + byteoff); /* * Fill in the new entry. @@ -528,11 +524,10 @@ xfs_dir2_sf_addname_hard( /* * Copy the old directory to the stack buffer. */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; old_isize = (int)dp->i_disk_size; buf = kmem_alloc(old_isize, 0); oldsfp = (xfs_dir2_sf_hdr_t *)buf; - memcpy(oldsfp, sfp, old_isize); + memcpy(oldsfp, dp->i_df.if_data, old_isize); /* * Loop over the old directory finding the place we're going * to insert the new entry. @@ -560,7 +555,7 @@ xfs_dir2_sf_addname_hard( /* * Reset the pointer since the buffer was reallocated. */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; /* * Copy the first part of the directory, including the header. */ @@ -610,11 +605,10 @@ xfs_dir2_sf_addname_pick( int i; /* entry number */ xfs_dir2_data_aoff_t offset; /* data block offset */ xfs_dir2_sf_entry_t *sfep; /* shortform entry */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int size; /* entry's data size */ int used; /* data bytes used */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir2_data_entsize(mp, args->namelen); offset = args->geo->data_first_offset; sfep = xfs_dir2_sf_firstentry(sfp); @@ -673,14 +667,13 @@ xfs_dir2_sf_check( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int i; /* entry number */ int i8count; /* number of big inode#s */ xfs_ino_t ino; /* entry inode number */ int offset; /* data offset */ xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; offset = args->geo->data_first_offset; ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; @@ -834,7 +827,7 @@ xfs_dir2_sf_create( /* * Fill in the header, */ - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; sfp->i8count = i8count; /* * Now can put in the inode number, since i8count is set. @@ -857,9 +850,9 @@ xfs_dir2_sf_lookup( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int i; /* entry index */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ enum xfs_dacmp cmp; /* comparison result */ xfs_dir2_sf_entry_t *ci_sfep; /* case-insens. entry */ @@ -870,8 +863,7 @@ xfs_dir2_sf_lookup( ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); ASSERT(dp->i_df.if_bytes == dp->i_disk_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(sfp != NULL); ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Special case for . @@ -933,13 +925,13 @@ xfs_dir2_sf_removename( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int byteoff; /* offset of removed entry */ int entsize; /* this entry's size */ int i; /* shortform entry index */ int newsize; /* new inode size */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ trace_xfs_dir2_sf_removename(args); @@ -947,8 +939,7 @@ xfs_dir2_sf_removename( oldsize = (int)dp->i_disk_size; ASSERT(oldsize >= offsetof(struct xfs_dir2_sf_hdr, parent)); ASSERT(dp->i_df.if_bytes == oldsize); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(sfp != NULL); ASSERT(oldsize >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* * Loop over the old directory entries. @@ -989,7 +980,7 @@ xfs_dir2_sf_removename( * Reallocate, making it smaller. */ xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; /* * Are we changing inode number size? */ @@ -1012,13 +1003,12 @@ xfs_dir2_sf_replace_needblock( struct xfs_inode *dp, xfs_ino_t inum) { + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int newsize; - struct xfs_dir2_sf_hdr *sfp; if (dp->i_df.if_format != XFS_DINODE_FMT_LOCAL) return false; - sfp = (struct xfs_dir2_sf_hdr *)dp->i_df.if_u1.if_data; newsize = dp->i_df.if_bytes + (sfp->count + 1) * XFS_INO64_DIFF; return inum > XFS_DIR2_MAX_SHORT_INUM && @@ -1034,19 +1024,18 @@ xfs_dir2_sf_replace( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *sfp = dp->i_df.if_data; int i; /* entry index */ xfs_ino_t ino=0; /* entry old inode number */ int i8elevated; /* sf_toino8 set i8count=1 */ xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */ - xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ trace_xfs_dir2_sf_replace(args); ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL); ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent)); ASSERT(dp->i_df.if_bytes == dp->i_disk_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + ASSERT(sfp != NULL); ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count)); /* @@ -1069,7 +1058,7 @@ xfs_dir2_sf_replace( */ xfs_dir2_sf_toino8(args); i8elevated = 1; - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; } else i8elevated = 0; @@ -1150,11 +1139,11 @@ xfs_dir2_sf_toino4( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *oldsfp = dp->i_df.if_data; char *buf; /* old dir's buffer */ int i; /* entry index */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ @@ -1168,7 +1157,6 @@ xfs_dir2_sf_toino4( */ oldsize = dp->i_df.if_bytes; buf = kmem_alloc(oldsize, 0); - oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; ASSERT(oldsfp->i8count == 1); memcpy(buf, oldsfp, oldsize); /* @@ -1181,7 +1169,7 @@ xfs_dir2_sf_toino4( * Reset our pointers, the data has moved. */ oldsfp = (xfs_dir2_sf_hdr_t *)buf; - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; /* * Fill in the new header. */ @@ -1223,11 +1211,11 @@ xfs_dir2_sf_toino8( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; + struct xfs_dir2_sf_hdr *oldsfp = dp->i_df.if_data; char *buf; /* old dir's buffer */ int i; /* entry index */ int newsize; /* new inode size */ xfs_dir2_sf_entry_t *oldsfep; /* old sf entry */ - xfs_dir2_sf_hdr_t *oldsfp; /* old sf directory */ int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ @@ -1241,7 +1229,6 @@ xfs_dir2_sf_toino8( */ oldsize = dp->i_df.if_bytes; buf = kmem_alloc(oldsize, 0); - oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; ASSERT(oldsfp->i8count == 0); memcpy(buf, oldsfp, oldsize); /* @@ -1254,7 +1241,7 @@ xfs_dir2_sf_toino8( * Reset our pointers, the data has moved. */ oldsfp = (xfs_dir2_sf_hdr_t *)buf; - sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + sfp = dp->i_df.if_data; /* * Fill in the new header. */ diff --git a/libxfs/xfs_iext_tree.c b/libxfs/xfs_iext_tree.c index 5d0be2dc8fed..24124039fdd8 100644 --- a/libxfs/xfs_iext_tree.c +++ b/libxfs/xfs_iext_tree.c @@ -158,7 +158,7 @@ static void * xfs_iext_find_first_leaf( struct xfs_ifork *ifp) { - struct xfs_iext_node *node = ifp->if_u1.if_root; + struct xfs_iext_node *node = ifp->if_data; int height; if (!ifp->if_height) @@ -176,7 +176,7 @@ static void * xfs_iext_find_last_leaf( struct xfs_ifork *ifp) { - struct xfs_iext_node *node = ifp->if_u1.if_root; + struct xfs_iext_node *node = ifp->if_data; int height, i; if (!ifp->if_height) @@ -306,7 +306,7 @@ xfs_iext_find_level( xfs_fileoff_t offset, int level) { - struct xfs_iext_node *node = ifp->if_u1.if_root; + struct xfs_iext_node *node = ifp->if_data; int height, i; if (!ifp->if_height) @@ -402,12 +402,12 @@ xfs_iext_grow( int i; if (ifp->if_height == 1) { - struct xfs_iext_leaf *prev = ifp->if_u1.if_root; + struct xfs_iext_leaf *prev = ifp->if_data; node->keys[0] = xfs_iext_leaf_key(prev, 0); node->ptrs[0] = prev; } else { - struct xfs_iext_node *prev = ifp->if_u1.if_root; + struct xfs_iext_node *prev = ifp->if_data; ASSERT(ifp->if_height > 1); @@ -418,7 +418,7 @@ xfs_iext_grow( for (i = 1; i < KEYS_PER_NODE; i++) node->keys[i] = XFS_IEXT_KEY_INVALID; - ifp->if_u1.if_root = node; + ifp->if_data = node; ifp->if_height++; } @@ -430,7 +430,7 @@ xfs_iext_update_node( int level, void *ptr) { - struct xfs_iext_node *node = ifp->if_u1.if_root; + struct xfs_iext_node *node = ifp->if_data; int height, i; for (height = ifp->if_height; height > level; height--) { @@ -583,11 +583,11 @@ xfs_iext_alloc_root( { ASSERT(ifp->if_bytes == 0); - ifp->if_u1.if_root = kmem_zalloc(sizeof(struct xfs_iext_rec), KM_NOFS); + ifp->if_data = kmem_zalloc(sizeof(struct xfs_iext_rec), KM_NOFS); ifp->if_height = 1; /* now that we have a node step into it */ - cur->leaf = ifp->if_u1.if_root; + cur->leaf = ifp->if_data; cur->pos = 0; } @@ -603,9 +603,9 @@ xfs_iext_realloc_root( if (new_size / sizeof(struct xfs_iext_rec) == RECS_PER_LEAF) new_size = NODE_SIZE; - new = krealloc(ifp->if_u1.if_root, new_size, GFP_NOFS | __GFP_NOFAIL); + new = krealloc(ifp->if_data, new_size, GFP_NOFS | __GFP_NOFAIL); memset(new + ifp->if_bytes, 0, new_size - ifp->if_bytes); - ifp->if_u1.if_root = new; + ifp->if_data = new; cur->leaf = new; } @@ -786,8 +786,8 @@ xfs_iext_remove_node( * If we are at the root and only one entry is left we can just * free this node and update the root pointer. */ - ASSERT(node == ifp->if_u1.if_root); - ifp->if_u1.if_root = node->ptrs[0]; + ASSERT(node == ifp->if_data); + ifp->if_data = node->ptrs[0]; ifp->if_height--; kmem_free(node); } @@ -863,8 +863,8 @@ xfs_iext_free_last_leaf( struct xfs_ifork *ifp) { ifp->if_height--; - kmem_free(ifp->if_u1.if_root); - ifp->if_u1.if_root = NULL; + kmem_free(ifp->if_data); + ifp->if_data = NULL; } void @@ -881,7 +881,7 @@ xfs_iext_remove( trace_xfs_iext_remove(ip, cur, state, _RET_IP_); ASSERT(ifp->if_height > 0); - ASSERT(ifp->if_u1.if_root != NULL); + ASSERT(ifp->if_data != NULL); ASSERT(xfs_iext_valid(ifp, cur)); xfs_iext_inc_seq(ifp); @@ -1051,9 +1051,9 @@ void xfs_iext_destroy( struct xfs_ifork *ifp) { - xfs_iext_destroy_node(ifp->if_u1.if_root, ifp->if_height); + xfs_iext_destroy_node(ifp->if_data, ifp->if_height); ifp->if_bytes = 0; ifp->if_height = 0; - ifp->if_u1.if_root = NULL; + ifp->if_data = NULL; } diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 80f4215d24bd..fbcda5f544a7 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -48,12 +48,15 @@ xfs_init_local_fork( mem_size++; if (size) { - ifp->if_u1.if_data = kmem_alloc(mem_size, KM_NOFS); - memcpy(ifp->if_u1.if_data, data, size); + char *new_data = kmem_alloc(mem_size, KM_NOFS); + + memcpy(new_data, data, size); if (zero_terminate) - ifp->if_u1.if_data[size] = '\0'; + new_data[size] = '\0'; + + ifp->if_data = new_data; } else { - ifp->if_u1.if_data = NULL; + ifp->if_data = NULL; } ifp->if_bytes = size; @@ -123,7 +126,7 @@ xfs_iformat_extents( } ifp->if_bytes = 0; - ifp->if_u1.if_root = NULL; + ifp->if_data = NULL; ifp->if_height = 0; if (size) { dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork); @@ -210,7 +213,7 @@ xfs_iformat_btree( ifp->if_broot, size); ifp->if_bytes = 0; - ifp->if_u1.if_root = NULL; + ifp->if_data = NULL; ifp->if_height = 0; return 0; } @@ -507,14 +510,14 @@ xfs_idata_realloc( return; if (new_size == 0) { - kmem_free(ifp->if_u1.if_data); - ifp->if_u1.if_data = NULL; + kmem_free(ifp->if_data); + ifp->if_data = NULL; ifp->if_bytes = 0; return; } - ifp->if_u1.if_data = krealloc(ifp->if_u1.if_data, new_size, - GFP_NOFS | __GFP_NOFAIL); + ifp->if_data = krealloc(ifp->if_data, new_size, + GFP_NOFS | __GFP_NOFAIL); ifp->if_bytes = new_size; } @@ -530,8 +533,8 @@ xfs_idestroy_fork( switch (ifp->if_format) { case XFS_DINODE_FMT_LOCAL: - kmem_free(ifp->if_u1.if_data); - ifp->if_u1.if_data = NULL; + kmem_free(ifp->if_data); + ifp->if_data = NULL; break; case XFS_DINODE_FMT_EXTENTS: case XFS_DINODE_FMT_BTREE: @@ -624,9 +627,9 @@ xfs_iflush_fork( case XFS_DINODE_FMT_LOCAL: if ((iip->ili_fields & dataflag[whichfork]) && (ifp->if_bytes > 0)) { - ASSERT(ifp->if_u1.if_data != NULL); + ASSERT(ifp->if_data != NULL); ASSERT(ifp->if_bytes <= xfs_inode_fork_size(ip, whichfork)); - memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes); + memcpy(cp, ifp->if_data, ifp->if_bytes); } break; @@ -704,17 +707,15 @@ xfs_ifork_verify_local_data( case S_IFDIR: { struct xfs_mount *mp = ip->i_mount; struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); - struct xfs_dir2_sf_hdr *sfp; + struct xfs_dir2_sf_hdr *sfp = ifp->if_data; - sfp = (struct xfs_dir2_sf_hdr *)ifp->if_u1.if_data; fa = xfs_dir2_sf_verify(mp, sfp, ifp->if_bytes); break; } case S_IFLNK: { struct xfs_ifork *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); - fa = xfs_symlink_shortform_verify(ifp->if_u1.if_data, - ifp->if_bytes); + fa = xfs_symlink_shortform_verify(ifp->if_data, ifp->if_bytes); break; } default: @@ -723,7 +724,7 @@ xfs_ifork_verify_local_data( if (fa) { xfs_inode_verifier_error(ip, -EFSCORRUPTED, "data fork", - ip->i_df.if_u1.if_data, ip->i_df.if_bytes, fa); + ip->i_df.if_data, ip->i_df.if_bytes, fa); return -EFSCORRUPTED; } @@ -741,20 +742,14 @@ xfs_ifork_verify_local_attr( if (!xfs_inode_has_attr_fork(ip)) { fa = __this_address; } else { - struct xfs_attr_shortform *sfp; - struct xfs_ifork *ifp; - int64_t size; + struct xfs_ifork *ifp = &ip->i_af; - ASSERT(ip->i_af.if_format == XFS_DINODE_FMT_LOCAL); - ifp = xfs_ifork_ptr(ip, XFS_ATTR_FORK); - sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data; - size = ifp->if_bytes; - - fa = xfs_attr_shortform_verify(sfp, size); + ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); + fa = xfs_attr_shortform_verify(ifp->if_data, ifp->if_bytes); } if (fa) { xfs_inode_verifier_error(ip, -EFSCORRUPTED, "attr fork", - ifp->if_u1.if_data, ifp->if_bytes, fa); + ifp->if_data, ifp->if_bytes, fa); return -EFSCORRUPTED; } diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 535be5c03689..7edcf0e8cd53 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -13,14 +13,12 @@ struct xfs_dinode; * File incore extent information, present for each of data & attr forks. */ struct xfs_ifork { - int64_t if_bytes; /* bytes in if_u1 */ + int64_t if_bytes; /* bytes in if_data */ struct xfs_btree_block *if_broot; /* file's incore btree root */ unsigned int if_seq; /* fork mod counter */ int if_height; /* height of the extent tree */ - union { - void *if_root; /* extent tree root */ - char *if_data; /* inline file data */ - } if_u1; + void *if_data; /* extent tree root or + inline data */ xfs_extnum_t if_nextents; /* # of extents in this fork */ short if_broot_bytes; /* bytes allocated for root */ int8_t if_format; /* format of this fork */ diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index cf894b5276ac..fa90b179314d 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -172,7 +172,7 @@ xfs_symlink_local_to_remote( if (!xfs_has_crc(mp)) { bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + memcpy(bp->b_addr, ifp->if_data, ifp->if_bytes); xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); return; } @@ -188,7 +188,7 @@ xfs_symlink_local_to_remote( buf = bp->b_addr; buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); - memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); + memcpy(buf, ifp->if_data, ifp->if_bytes); xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsymlink_hdr) + ifp->if_bytes - 1); } diff --git a/repair/phase6.c b/repair/phase6.c index fcb26d594b10..43a4c1406372 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -515,7 +515,7 @@ mk_rbmino(xfs_mount_t *mp) * now the ifork */ ip->i_df.if_bytes = 0; - ip->i_df.if_u1.if_root = NULL; + ip->i_df.if_data = NULL; ip->i_disk_size = mp->m_sb.sb_rbmblocks * mp->m_sb.sb_blocksize; @@ -770,7 +770,7 @@ mk_rsumino(xfs_mount_t *mp) * now the ifork */ ip->i_df.if_bytes = 0; - ip->i_df.if_u1.if_root = NULL; + ip->i_df.if_data = NULL; ip->i_disk_size = mp->m_rsumsize; @@ -870,7 +870,7 @@ mk_root_dir(xfs_mount_t *mp) * now the ifork */ ip->i_df.if_bytes = 0; - ip->i_df.if_u1.if_root = NULL; + ip->i_df.if_data = NULL; /* * initialize the directory @@ -2472,7 +2472,7 @@ shortform_dir2_entry_check( { xfs_ino_t lino; xfs_ino_t parent; - struct xfs_dir2_sf_hdr *sfp; + struct xfs_dir2_sf_hdr *sfp = ip->i_df.if_data; struct xfs_dir2_sf_entry *sfep; struct xfs_dir2_sf_entry *next_sfep; struct xfs_ifork *ifp; @@ -2487,7 +2487,6 @@ shortform_dir2_entry_check( int i8; ifp = &ip->i_df; - sfp = (struct xfs_dir2_sf_hdr *) ifp->if_u1.if_data; *ino_dirty = 0; bytes_deleted = 0; From patchwork Wed Mar 13 02:07:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590896 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5541ACA4A for ; Wed, 13 Mar 2024 02:07:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295643; cv=none; b=ioxJSq6JGO5u5owqRW2nmoOc+UDY5lh1e40nznZjkmJj6M92+6Kn1yDGctf0w6hLk1UoWv6br9UmZ1k8KlmrUY/+NDivZFoNE1y09EMJ51h7gLy6lM7ZUG+uXjWPQYS84BN8FVoDq2OJQ4wPSxNYi5yljkae8n0SwfoqIDwk3LE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295643; c=relaxed/simple; bh=WLJp2YP+naCrWIAjPxUxGLUkBCL8keVyKbUcZhse7OM=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=PHVU+68L53yr9KfncCObl4he0nsheB8325M5J7RwH93gjrXoVG9aLYBS/lV5pW1a2QBMm7Lq8tVS2qpITqq9T7DzMJRvjn3nXZN9xKJtWXm55wYqoNbPxiyUXcjLGC1N50PQq+hH9BtPzjpuKdpKVOCQ0MC/pEUV1sRGq2MZMUI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZlsrJJ+E; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZlsrJJ+E" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D5D5EC43390; Wed, 13 Mar 2024 02:07:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295642; bh=WLJp2YP+naCrWIAjPxUxGLUkBCL8keVyKbUcZhse7OM=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=ZlsrJJ+EK7m8ktH4ow30qgPQkfOmgoDnEemiehil+yuf+8C6YllAz9hsoZ1dahY8q JZlnh/4f8/N/xjsr/IXmOGcVJTGFGxEqSS5gDmA4vhJFg2RUGGZOrK8FCcBvvRnf3M zxu4eeM8Puosw9EIjtFQBFWWiBT2yB1pd8SXrhbmvukXBgyVJxmyKC9BfFlBl4U/E3 j8ekXZo8MbUGcKXKUlqvnC0KZDCcHb164KLMluDjC/ahNfoh7T2qjTFyzcgJaQvDYf g5JAMmOPv7gkViY+gFWjdCLeJPoIJjbUB6zry5sLwpJBboSLelfwZG971fMww/tXei nZX0U35jzwzJg== Date: Tue, 12 Mar 2024 19:07:22 -0700 Subject: [PATCH 55/67] xfs: return if_data from xfs_idata_realloc From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029431987.2061787.14608920128175270319.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 45c76a2add55b332d965c901e14004ae0134a67e Many of the xfs_idata_realloc callers need to set a local pointer to the just reallocated if_data memory. Return the pointer to simplify them a bit and use the opportunity to re-use krealloc for freeing if_data if the size hits 0. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr_leaf.c | 7 +++---- libxfs/xfs_dir2_sf.c | 25 ++++++++++--------------- libxfs/xfs_inode_fork.c | 20 ++++++++------------ libxfs/xfs_inode_fork.h | 2 +- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 5ab52bf1aa66..a21740a87aea 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -687,8 +687,8 @@ xfs_attr_shortform_create( ASSERT(ifp->if_bytes == 0); if (ifp->if_format == XFS_DINODE_FMT_EXTENTS) ifp->if_format = XFS_DINODE_FMT_LOCAL; - xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK); - hdr = ifp->if_data; + + hdr = xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK); memset(hdr, 0, sizeof(*hdr)); hdr->totsize = cpu_to_be16(sizeof(*hdr)); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); @@ -764,8 +764,7 @@ xfs_attr_shortform_add( offset = (char *)sfe - (char *)sf; size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen); - xfs_idata_realloc(dp, size, XFS_ATTR_FORK); - sf = ifp->if_data; + sf = xfs_idata_realloc(dp, size, XFS_ATTR_FORK); sfe = (struct xfs_attr_sf_entry *)((char *)sf + offset); sfe->namelen = args->namelen; diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index b2b43e937476..37c7e1d5cc8a 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -466,12 +466,11 @@ xfs_dir2_sf_addname_easy( /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, xfs_dir2_sf_entsize(mp, sfp, args->namelen), + sfp = xfs_idata_realloc(dp, xfs_dir2_sf_entsize(mp, sfp, args->namelen), XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. */ - sfp = dp->i_df.if_data; sfep = (xfs_dir2_sf_entry_t *)((char *)sfp + byteoff); /* * Fill in the new entry. @@ -551,11 +550,8 @@ xfs_dir2_sf_addname_hard( * the data. */ xfs_idata_realloc(dp, -old_isize, XFS_DATA_FORK); - xfs_idata_realloc(dp, new_isize, XFS_DATA_FORK); - /* - * Reset the pointer since the buffer was reallocated. - */ - sfp = dp->i_df.if_data; + sfp = xfs_idata_realloc(dp, new_isize, XFS_DATA_FORK); + /* * Copy the first part of the directory, including the header. */ @@ -820,15 +816,13 @@ xfs_dir2_sf_create( ASSERT(dp->i_df.if_bytes == 0); i8count = pino > XFS_DIR2_MAX_SHORT_INUM; size = xfs_dir2_sf_hdr_size(i8count); + /* - * Make a buffer for the data. + * Make a buffer for the data and fill in the header. */ - xfs_idata_realloc(dp, size, XFS_DATA_FORK); - /* - * Fill in the header, - */ - sfp = dp->i_df.if_data; + sfp = xfs_idata_realloc(dp, size, XFS_DATA_FORK); sfp->i8count = i8count; + /* * Now can put in the inode number, since i8count is set. */ @@ -976,11 +970,12 @@ xfs_dir2_sf_removename( */ sfp->count--; dp->i_disk_size = newsize; + /* * Reallocate, making it smaller. */ - xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); - sfp = dp->i_df.if_data; + sfp = xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK); + /* * Are we changing inode number size? */ diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index fbcda5f544a7..c95abd43ab0b 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -494,7 +494,7 @@ xfs_iroot_realloc( * byte_diff -- the change in the number of bytes, positive or negative, * requested for the if_data array. */ -void +void * xfs_idata_realloc( struct xfs_inode *ip, int64_t byte_diff, @@ -506,19 +506,15 @@ xfs_idata_realloc( ASSERT(new_size >= 0); ASSERT(new_size <= xfs_inode_fork_size(ip, whichfork)); - if (byte_diff == 0) - return; - - if (new_size == 0) { - kmem_free(ifp->if_data); - ifp->if_data = NULL; - ifp->if_bytes = 0; - return; + if (byte_diff) { + ifp->if_data = krealloc(ifp->if_data, new_size, + GFP_NOFS | __GFP_NOFAIL); + if (new_size == 0) + ifp->if_data = NULL; + ifp->if_bytes = new_size; } - ifp->if_data = krealloc(ifp->if_data, new_size, - GFP_NOFS | __GFP_NOFAIL); - ifp->if_bytes = new_size; + return ifp->if_data; } /* Free all memory and reset a fork back to its initial state. */ diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 7edcf0e8cd53..96303249d28a 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -168,7 +168,7 @@ int xfs_iformat_attr_fork(struct xfs_inode *, struct xfs_dinode *); void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, struct xfs_inode_log_item *, int); void xfs_idestroy_fork(struct xfs_ifork *ifp); -void xfs_idata_realloc(struct xfs_inode *ip, int64_t byte_diff, +void * xfs_idata_realloc(struct xfs_inode *ip, int64_t byte_diff, int whichfork); void xfs_iroot_realloc(struct xfs_inode *, int, int); int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); From patchwork Wed Mar 13 02:07:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590897 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E55B01118A for ; Wed, 13 Mar 2024 02:07:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295659; cv=none; b=kvEctFp53iD4qMnCjD1HP8FbQGM2x9Qz8W4Jz3FemKFulNbzSBPHrskgSeBnT86iGpF8yzgcLMr2R5uRnkeEMe55USYL7qxY6LrjqEj0Eo71ZNHWK+nkXO3S2Y7nT0ZostpWetRl1I4EcG5QApmflkMp6wdpWEbT5FqvLG3OJbQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295659; c=relaxed/simple; bh=mOw8CccvHbHCehi3U6VNsNfH48qL6QGyo7km5BG70ZE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oVc4yYKPZ//la0ZK0WP1S1CQ5m+PNFbekll2a08vCW2I6QL69zhi3NR2OlIc/PoMDdXSUu/lNzIO7cNadHCbzDvK2DRnnudUzoJel7UtNrSiXCsXP2aclpsOHY5sYFrZ4Aq0I3rW8ixlOxM5Ifnxbp/heDjxsAUo4TkfweqJiEU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fa5wypp2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fa5wypp2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7FD25C433F1; Wed, 13 Mar 2024 02:07:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295658; bh=mOw8CccvHbHCehi3U6VNsNfH48qL6QGyo7km5BG70ZE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=fa5wypp2p5r/fO5IPl42/FpZZRmLHRsm3X3fHNgg+OLxfT36P2xnT/LbIapitXZQx eimzUzsdwmVGUZqmHoxDHn8kQ0zx8ZoKDqqwNMmG+mkks+lEM0+JjXmzzLtOlJl+em G/F5xdG/dLrCmRx6DtZEaGQm2wYmtet8jaaUo0xmf8HJbhRNxap+ltGUd6VRHad0G+ oSVOogksQ6bR5agJulQktmAhWD+3Rdysa+Tf0P9lwJBOhnjvhD3mQBtOYwDM47092r t/nyXp5jkrcVyJtXbla20fH7OuqFifikTRB86epmCAc+45qevOT+G1JtI8h6bFb5Go 73mUyRTZk8G/Q== Date: Tue, 12 Mar 2024 19:07:38 -0700 Subject: [PATCH 56/67] xfs: move the xfs_attr_sf_lookup tracepoint From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432002.2061787.337713190211374202.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 14f2e4ab5d0310c2bb231941d9884fa5bae47fab trace_xfs_attr_sf_lookup is currently only called by xfs_attr_shortform_lookup, which despit it's name is a simple helper for xfs_attr_shortform_addname, which has it's own tracing. Move the callsite to xfs_attr_shortform_getvalue, which is the closest thing to a high level lookup we have for the Linux xattr API. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr_leaf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index a21740a87aea..10ed518f30ee 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -873,8 +873,6 @@ xfs_attr_shortform_lookup( struct xfs_attr_sf_entry *sfe; int i; - trace_xfs_attr_sf_lookup(args); - ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; @@ -902,6 +900,9 @@ xfs_attr_shortform_getvalue( int i; ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL); + + trace_xfs_attr_sf_lookup(args); + sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; sfe = xfs_attr_sf_nextentry(sfe), i++) { From patchwork Wed Mar 13 02:07:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590898 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 68036BA27 for ; Wed, 13 Mar 2024 02:07:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295674; cv=none; b=anw1ZfZMG2pxVyU7iGUJTe8KBqzG/Dw8ZVXtttOUDPWRlWrXNgIDQ116ZZmMvNvrC4h/X9iMaKCDF7tvxm7bWlKnC1N6JIBbtzjhGQB4VvP1TFvflmonfBD+W/IjG6PJPjZzV+p8/ANv/oXMKJNonBQd91pAPSu9hqpChow80A0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295674; c=relaxed/simple; bh=VS7ptxSZAcJGfyWLrfDdj+JqTdCGGb4RiY6mm5SnFuc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=icrlPzsdN6pGQFX0ZEC/Dvvc6Qs+gV0TRD/ZoKADvWOQ0yG4jG/181eA0gJYlByS9HTqw+KqtPF/lgAc2Z40YkBD+113Ek85bnE2ZZxQDwipPLDI9ZX3scR1p83ihvgynt/aeDJLp5VXNSYgQOqNjotVz9HtF/jh+4+gq1/99ZM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EzDdXa8B; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EzDdXa8B" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2FE1AC433C7; Wed, 13 Mar 2024 02:07:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295674; bh=VS7ptxSZAcJGfyWLrfDdj+JqTdCGGb4RiY6mm5SnFuc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=EzDdXa8BQuSy4QAM8G9XsL1uUeSFATN6Gibk9+nFXxh1nl06QMAmdJZTp5FBGWxGu Dn8Mscmo1mj3VsmPxZql50sSeZQ+q4DexLjRAEnEWlJxwq7GTIIq5PZHJhHOglIF9c go9qzcZYEknEGLYr2TW6Wymp0UdZxOJUt95vU8hqv87SVFpgcEsgU5cSgNUIunMX8Y tOd2Mr61iHR6RohIE6oh9ea9TDKFeVB4vM37D/IJtmGrqbX4OoKnUYYyNTrnRsQUl9 BZGRm/CAKYWkk2WB1aUdlKZZvibM1H7nK1D1i8j7mXkUDytxyijY0j7Ek4PUs9Nh8V OUHOB7qROFtqw== Date: Tue, 12 Mar 2024 19:07:53 -0700 Subject: [PATCH 57/67] xfs: simplify xfs_attr_sf_findname From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432017.2061787.18266714849190682437.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 6c8d169bbd51fc10d1d0029d495962881315b4c2 xfs_attr_sf_findname has the simple job of finding a xfs_attr_sf_entry in the attr fork, but the convoluted calling convention obfuscates that. Return the found entry as the return value instead of an pointer argument, as the -ENOATTR/-EEXIST can be trivally derived from that, and remove the basep argument, as it is equivalent of the offset of sfe in the data for if an sfe was found, or an offset of totsize if not was found. To simplify the totsize computation add a xfs_attr_sf_endptr helper that returns the imaginative xfs_attr_sf_entry at the end of the current attrs. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr.c | 7 ++- libxfs/xfs_attr_leaf.c | 102 ++++++++++++++++++------------------------------ libxfs/xfs_attr_leaf.h | 4 -- libxfs/xfs_attr_sf.h | 7 +++ 4 files changed, 51 insertions(+), 69 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index d7512efd42a8..d5a5ae6e219f 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -860,8 +860,11 @@ xfs_attr_lookup( if (!xfs_inode_hasattr(dp)) return -ENOATTR; - if (dp->i_af.if_format == XFS_DINODE_FMT_LOCAL) - return xfs_attr_sf_findname(args, NULL, NULL); + if (dp->i_af.if_format == XFS_DINODE_FMT_LOCAL) { + if (xfs_attr_sf_findname(args)) + return -EEXIST; + return -ENOATTR; + } if (xfs_attr_is_leaf(dp)) { error = xfs_attr_leaf_hasname(args, &bp); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 10ed518f30ee..6ea364059a4e 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -695,47 +695,24 @@ xfs_attr_shortform_create( } /* - * Return -EEXIST if attr is found, or -ENOATTR if not - * args: args containing attribute name and namelen - * sfep: If not null, pointer will be set to the last attr entry found on - -EEXIST. On -ENOATTR pointer is left at the last entry in the list - * basep: If not null, pointer is set to the byte offset of the entry in the - * list on -EEXIST. On -ENOATTR, pointer is left at the byte offset of - * the last entry in the list + * Return the entry if the attr in args is found, or NULL if not. */ -int +struct xfs_attr_sf_entry * xfs_attr_sf_findname( - struct xfs_da_args *args, - struct xfs_attr_sf_entry **sfep, - unsigned int *basep) + struct xfs_da_args *args) { - struct xfs_attr_shortform *sf = args->dp->i_af.if_data; - struct xfs_attr_sf_entry *sfe; - unsigned int base = sizeof(struct xfs_attr_sf_hdr); - int size = 0; - int end; - int i; + struct xfs_attr_shortform *sf = args->dp->i_af.if_data; + struct xfs_attr_sf_entry *sfe; - sfe = &sf->list[0]; - end = sf->hdr.count; - for (i = 0; i < end; sfe = xfs_attr_sf_nextentry(sfe), - base += size, i++) { - size = xfs_attr_sf_entsize(sfe); - if (!xfs_attr_match(args, sfe->namelen, sfe->nameval, - sfe->flags)) - continue; - break; + for (sfe = &sf->list[0]; + sfe < xfs_attr_sf_endptr(sf); + sfe = xfs_attr_sf_nextentry(sfe)) { + if (xfs_attr_match(args, sfe->namelen, sfe->nameval, + sfe->flags)) + return sfe; } - if (sfep != NULL) - *sfep = sfe; - - if (basep != NULL) - *basep = base; - - if (i == end) - return -ENOATTR; - return -EEXIST; + return NULL; } /* @@ -752,21 +729,19 @@ xfs_attr_shortform_add( struct xfs_ifork *ifp = &dp->i_af; struct xfs_attr_shortform *sf = ifp->if_data; struct xfs_attr_sf_entry *sfe; - int offset, size; + int size; trace_xfs_attr_sf_add(args); dp->i_forkoff = forkoff; ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST) - ASSERT(0); + ASSERT(!xfs_attr_sf_findname(args)); - offset = (char *)sfe - (char *)sf; size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen); sf = xfs_idata_realloc(dp, size, XFS_ATTR_FORK); - sfe = (struct xfs_attr_sf_entry *)((char *)sf + offset); + sfe = xfs_attr_sf_endptr(sf); sfe->namelen = args->namelen; sfe->valuelen = args->valuelen; sfe->flags = args->attr_filter; @@ -806,39 +781,38 @@ xfs_attr_sf_removename( struct xfs_mount *mp = dp->i_mount; struct xfs_attr_shortform *sf = dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; - int size = 0, end, totsize; - unsigned int base; - int error; + uint16_t totsize = be16_to_cpu(sf->hdr.totsize); + void *next, *end; + int size = 0; trace_xfs_attr_sf_remove(args); - error = xfs_attr_sf_findname(args, &sfe, &base); - - /* - * If we are recovering an operation, finding nothing to - * remove is not an error - it just means there was nothing - * to clean up. - */ - if (error == -ENOATTR && (args->op_flags & XFS_DA_OP_RECOVERY)) - return 0; - if (error != -EEXIST) - return error; - size = xfs_attr_sf_entsize(sfe); + sfe = xfs_attr_sf_findname(args); + if (!sfe) { + /* + * If we are recovering an operation, finding nothing to remove + * is not an error, it just means there was nothing to clean up. + */ + if (args->op_flags & XFS_DA_OP_RECOVERY) + return 0; + return -ENOATTR; + } /* * Fix up the attribute fork data, covering the hole */ - end = base + size; - totsize = be16_to_cpu(sf->hdr.totsize); - if (end != totsize) - memmove(&((char *)sf)[base], &((char *)sf)[end], totsize - end); + size = xfs_attr_sf_entsize(sfe); + next = xfs_attr_sf_nextentry(sfe); + end = xfs_attr_sf_endptr(sf); + if (next < end) + memmove(sfe, next, end - next); sf->hdr.count--; - be16_add_cpu(&sf->hdr.totsize, -size); - - /* - * Fix up the start offset of the attribute fork - */ totsize -= size; + sf->hdr.totsize = cpu_to_be16(totsize); + + /* + * Fix up the start offset of the attribute fork + */ if (totsize == sizeof(xfs_attr_sf_hdr_t) && xfs_has_attr2(mp) && (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) && !(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE))) { diff --git a/libxfs/xfs_attr_leaf.h b/libxfs/xfs_attr_leaf.h index ce6743463c86..56fcd689eedf 100644 --- a/libxfs/xfs_attr_leaf.h +++ b/libxfs/xfs_attr_leaf.h @@ -51,9 +51,7 @@ int xfs_attr_shortform_lookup(struct xfs_da_args *args); int xfs_attr_shortform_getvalue(struct xfs_da_args *args); int xfs_attr_shortform_to_leaf(struct xfs_da_args *args); int xfs_attr_sf_removename(struct xfs_da_args *args); -int xfs_attr_sf_findname(struct xfs_da_args *args, - struct xfs_attr_sf_entry **sfep, - unsigned int *basep); +struct xfs_attr_sf_entry *xfs_attr_sf_findname(struct xfs_da_args *args); int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); int xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes); xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_shortform *sfp, diff --git a/libxfs/xfs_attr_sf.h b/libxfs/xfs_attr_sf.h index 37578b369d9b..a774d4d87763 100644 --- a/libxfs/xfs_attr_sf.h +++ b/libxfs/xfs_attr_sf.h @@ -48,4 +48,11 @@ xfs_attr_sf_nextentry(struct xfs_attr_sf_entry *sfep) return (void *)sfep + xfs_attr_sf_entsize(sfep); } +/* pointer to the space after the last entry, e.g. for adding a new one */ +static inline struct xfs_attr_sf_entry * +xfs_attr_sf_endptr(struct xfs_attr_shortform *sf) +{ + return (void *)sf + be16_to_cpu(sf->hdr.totsize); +} + #endif /* __XFS_ATTR_SF_H__ */ From patchwork Wed Mar 13 02:08:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590899 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 14897BA27 for ; Wed, 13 Mar 2024 02:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295690; cv=none; b=VA/0558qRY6dsPGmbWUTyXWhGModA86UY5eD3Qq1l+zyO172KFkToPwEcj5M7gfwTb4Ao9NqrcCdV5oGW9uN6yCnorrsViWBzSyA16A/jSRV8eRzn1Ayi+oR3iNSQZvouoHVhuEHUjquWSQMiBLCi+TQKQo3m2Pr5Lu0XvkaXyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295690; c=relaxed/simple; bh=qhhd2kcCn2PmyXVvDC2qrGVb+kMyaXwp/hrdG/IPeAc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=T8qf14xbETzCiKpmvCJoblkAiF36ezUzaAfmc3i9RznDHNeHwljcRAEJ+AGkkuzYR+E7ytQc2M9v5EIccX0MC9BhfLW32oBIkSPAnf3/Ewx4fWXqbLVvxkQcN80BuNj0GFMsBGoKsALaVG32j6T/5YRK2qcaUPkMPKNk8kGcYVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Fd3ZLYZh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Fd3ZLYZh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D8D2EC433C7; Wed, 13 Mar 2024 02:08:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295689; bh=qhhd2kcCn2PmyXVvDC2qrGVb+kMyaXwp/hrdG/IPeAc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=Fd3ZLYZhzlhJ9euIuvQHnMsApXImwfZcaPn45l+kyWejOfcbf3eGSHuRIzpNQO+ld qjbzytopCRjy6JSV+qyC/OaMYDxEwfWMcrope7bjhFd2o5qWq7GuWsbPzHT5oBkFMa RDYN/Xkf4I8EnJYceCMq4CF4muSuu2f3SNltJPTe5DRk7PNQykIThV7a0coo6pVDF8 uEru70szRTVYRZTgct9zI63te5dwVie9BoXLMh0MvPOCSZc/v5BX5YC6asAV5eMZU6 kqA2Xnh9V26sVPS9wf4Y4ErW72vAgy3peJ7NA6uZMwZD9aJ64rTy2Zg4X+F9Oq+cWn xpLAFZSaBWuxg== Date: Tue, 12 Mar 2024 19:08:09 -0700 Subject: [PATCH 58/67] xfs: remove xfs_attr_shortform_lookup From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432031.2061787.2932885239966257817.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 22b7b1f597a6a21fb7b3791a55f3a7ae54d2dfe4 xfs_attr_shortform_lookup is only used by xfs_attr_shortform_addname, which is much better served by calling xfs_attr_sf_findname. Switch it over and remove xfs_attr_shortform_lookup. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr.c | 21 +++++++-------------- libxfs/xfs_attr_leaf.c | 24 ------------------------ libxfs/xfs_attr_leaf.h | 1 - 3 files changed, 7 insertions(+), 39 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index d5a5ae6e219f..a383024dbd7f 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -1064,19 +1064,14 @@ xfs_attr_shortform_addname( struct xfs_da_args *args) { int newsize, forkoff; - int error; trace_xfs_attr_sf_addname(args); - error = xfs_attr_shortform_lookup(args); - switch (error) { - case -ENOATTR: - if (args->op_flags & XFS_DA_OP_REPLACE) - return error; - break; - case -EEXIST: + if (xfs_attr_sf_findname(args)) { + int error; + if (!(args->op_flags & XFS_DA_OP_REPLACE)) - return error; + return -EEXIST; error = xfs_attr_sf_removename(args); if (error) @@ -1089,11 +1084,9 @@ xfs_attr_shortform_addname( * around. */ args->op_flags &= ~XFS_DA_OP_REPLACE; - break; - case 0: - break; - default: - return error; + } else { + if (args->op_flags & XFS_DA_OP_REPLACE) + return -ENOATTR; } if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 6ea364059a4e..8f1678d296a7 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -834,30 +834,6 @@ xfs_attr_sf_removename( return 0; } -/* - * Look up a name in a shortform attribute list structure. - */ -/*ARGSUSED*/ -int -xfs_attr_shortform_lookup( - struct xfs_da_args *args) -{ - struct xfs_ifork *ifp = &args->dp->i_af; - struct xfs_attr_shortform *sf = ifp->if_data; - struct xfs_attr_sf_entry *sfe; - int i; - - ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL); - sfe = &sf->list[0]; - for (i = 0; i < sf->hdr.count; - sfe = xfs_attr_sf_nextentry(sfe), i++) { - if (xfs_attr_match(args, sfe->namelen, sfe->nameval, - sfe->flags)) - return -EEXIST; - } - return -ENOATTR; -} - /* * Retrieve the attribute value and length. * diff --git a/libxfs/xfs_attr_leaf.h b/libxfs/xfs_attr_leaf.h index 56fcd689eedf..35e668ae744f 100644 --- a/libxfs/xfs_attr_leaf.h +++ b/libxfs/xfs_attr_leaf.h @@ -47,7 +47,6 @@ struct xfs_attr3_icleaf_hdr { */ void xfs_attr_shortform_create(struct xfs_da_args *args); void xfs_attr_shortform_add(struct xfs_da_args *args, int forkoff); -int xfs_attr_shortform_lookup(struct xfs_da_args *args); int xfs_attr_shortform_getvalue(struct xfs_da_args *args); int xfs_attr_shortform_to_leaf(struct xfs_da_args *args); int xfs_attr_sf_removename(struct xfs_da_args *args); From patchwork Wed Mar 13 02:08:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590900 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4F3CBA27 for ; Wed, 13 Mar 2024 02:08:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295706; cv=none; b=AI8bVzZNvdC7jAswEj9jPM3c58hSsLH/yaOAz+XGh0Y90rPrERGHx8PYJ18doFAUXwq+6c8MotGRD6IXIhaUvNgLQEsHKXcmEGHctYA5tm2pednp9W5XzZshSF69RWrfHH1IQZzOpg4ksxEyFnOUA/jufGqkezdufvtmQCA4xTQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295706; c=relaxed/simple; bh=luixzqVMW8xrR2J9k8AKFXLQ0fTYfIKvWXkOUDFsiYo=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CECTctIkSGbesr3WWR9WnC3/VHwbkum+jFNR+yOq8dXYS2eUIxJvPXMabzMP/3/CQHVONxmxixBBEqprIIQSBI2ulhnFBnU074JI3S+xYco5RuxMuJ7ktCPVHEGiqdnfOhepXLrT1wd038jXHFoWdKAnCHlT3pi3/LEHDM4DfV0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nW8lNIc3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nW8lNIc3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8357DC433F1; Wed, 13 Mar 2024 02:08:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295705; bh=luixzqVMW8xrR2J9k8AKFXLQ0fTYfIKvWXkOUDFsiYo=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=nW8lNIc3pmzgPT5lAVCDwmodtGtY3BJWGf8EbCwQwpHF8lMy2Z1YN8t/4ZT6DmuHB MB6keEmzBJ86VPJ1v4CV+Jbz0ZqDfsGer8EtulUKzcePrm2Yt+yweHcEdN8B4mMYMf Gzybnwm9rlO26HkVIqhhK7ZU8/LhGnt9l1wEaZhTK603YpT1RXmYhMS7QO9ygldaLk zrpk5JgNSgrNSsD9v2JOh3sranw4v7ref3M/WTyJBLb3jPFrE+mljpcl4iD9rc7/0J BAA22bAQRTv40Y5zg3q+QgeFBSkN7QOHUKrXP4FjZdY7Pi4mNZNg4DQpl5GkOk+qyj HgKX42cuatY1g== Date: Tue, 12 Mar 2024 19:08:25 -0700 Subject: [PATCH 59/67] xfs: use xfs_attr_sf_findname in xfs_attr_shortform_getvalue From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432045.2061787.2868680894600493998.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 1fb4b0def7b5a5bf91ad62a112d8d3f6dc76585f xfs_attr_shortform_getvalue duplicates the logic in xfs_attr_sf_findname. Use the helper instead. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr_leaf.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 8f1678d296a7..9b6dcff349c9 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -845,23 +845,17 @@ int xfs_attr_shortform_getvalue( struct xfs_da_args *args) { - struct xfs_attr_shortform *sf = args->dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; - int i; ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL); trace_xfs_attr_sf_lookup(args); - sfe = &sf->list[0]; - for (i = 0; i < sf->hdr.count; - sfe = xfs_attr_sf_nextentry(sfe), i++) { - if (xfs_attr_match(args, sfe->namelen, sfe->nameval, - sfe->flags)) - return xfs_attr_copy_value(args, - &sfe->nameval[args->namelen], sfe->valuelen); - } - return -ENOATTR; + sfe = xfs_attr_sf_findname(args); + if (!sfe) + return -ENOATTR; + return xfs_attr_copy_value(args, &sfe->nameval[args->namelen], + sfe->valuelen); } /* Convert from using the shortform to the leaf format. */ From patchwork Wed Mar 13 02:08:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590901 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5951CBA27 for ; Wed, 13 Mar 2024 02:08:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295721; cv=none; b=Pkg2+ejRUTvJl5uY4nX0dh+KQPBAypWnx/hBpP/i+rJhvapU0Xfl2rNKuHsWZJyr5ik3TTDRIjGN/1IvdTiW2/3A4Hy06KSYl/JAYG1xm4HhYT4g6g/wYTcIxnSwHbVxDwIugHKcvtu8mHf4lCiQloPrK5x/XKpJrVxp7HlTPLU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295721; c=relaxed/simple; bh=7YEGsB51gwrO2aqjwPoqUKrSSDaE7oBgbp50+4CBIUs=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rEJxblxdMWf0y2FT//H6yvNvUgwV/B8LfdsSyb10VNYEMKdi8iTdI3uMAxQB/v16yIEo3bx0tDGJODAyXbg/Mxr3YBMVkihcChzkfHgLd0pCTHQUjlKzWxgGwUVXbfvTtLRet4D0vQc/MuC6iRKQ56yQZYdIi42wk46pIE6XFO8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LhpRfIX6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LhpRfIX6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2CD13C433F1; Wed, 13 Mar 2024 02:08:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295721; bh=7YEGsB51gwrO2aqjwPoqUKrSSDaE7oBgbp50+4CBIUs=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=LhpRfIX61ukpyJJWb5FAk13kOYcY0y/6QB7J23MmE/6+cj7dqaNrUF3DphRdnTw4n Sf7/ISA9qTcVLZHGDkxP5Nb7qXoZqd0/qk9WYHDyVvHs6SwmxYXQXVVwfMWnKsTmix x/qn4OPwlaaxOPRNCax15WBoiYJmortiG+yR4R4frOl+5KKDeRJOvbMyKgaC9UGQCR k5osqB8/jQU0+Bwe7gQmBok1qaJzqUGEaGOSBSq9qc0JQDWfKsvGZCLjXj6hfieAJq 6iLC8uQZSwS4lztXEz7YKjfliAPOilh3QfE45/byRH+6x4f4Wf+FGQM8elCfOktR5x 5RLqDlDzt2JYA== Date: Tue, 12 Mar 2024 19:08:40 -0700 Subject: [PATCH 60/67] xfs: remove struct xfs_attr_shortform From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432060.2061787.16949571056384761159.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 414147225400a0c4562ebfb0fdd40f065099ede4 sparse complains about struct xfs_attr_shortform because it embeds a structure with a variable sized array in a variable sized array. Given that xfs_attr_shortform is not a very useful structure, and the dir2 equivalent has been removed a long time ago, remove it as well. Provide a xfs_attr_sf_firstentry helper that returns the first xfs_attr_sf_entry behind a xfs_attr_sf_hdr to replace the structure dereference. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- db/attrshort.c | 33 ++++++++++++++++----------------- db/check.c | 8 ++++---- db/inode.c | 6 +++--- db/metadump.c | 16 +++++++--------- libxfs/libxfs_api_defs.h | 2 ++ libxfs/xfs_attr.c | 4 ++-- libxfs/xfs_attr_leaf.c | 37 ++++++++++++++++++------------------- libxfs/xfs_attr_leaf.h | 2 +- libxfs/xfs_attr_sf.h | 13 ++++++++++--- libxfs/xfs_da_format.h | 31 ++++++++++++++++++------------- libxfs/xfs_inode_fork.c | 5 ++--- libxfs/xfs_ondisk.h | 14 +++++++------- repair/attr_repair.c | 44 ++++++++++++++++++++------------------------ repair/dinode.c | 21 +++++++++++---------- 14 files changed, 121 insertions(+), 115 deletions(-) diff --git a/db/attrshort.c b/db/attrshort.c index e234fbd83653..c98b90be3ec0 100644 --- a/db/attrshort.c +++ b/db/attrshort.c @@ -18,9 +18,8 @@ static int attr_sf_entry_value_offset(void *obj, int startoff, int idx); static int attr_shortform_list_count(void *obj, int startoff); static int attr_shortform_list_offset(void *obj, int startoff, int idx); -#define OFF(f) bitize(offsetof(struct xfs_attr_shortform, f)) const field_t attr_shortform_flds[] = { - { "hdr", FLDT_ATTR_SF_HDR, OI(OFF(hdr)), C1, 0, TYP_NONE }, + { "hdr", FLDT_ATTR_SF_HDR, OI(0), C1, 0, TYP_NONE }, { "list", FLDT_ATTR_SF_ENTRY, attr_shortform_list_offset, attr_shortform_list_count, FLD_ARRAY|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } @@ -71,11 +70,11 @@ attr_sf_entry_size( { struct xfs_attr_sf_entry *e; int i; - struct xfs_attr_shortform *sf; + struct xfs_attr_sf_hdr *hdr; ASSERT(bitoffs(startoff) == 0); - sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff)); - e = &sf->list[0]; + hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff)); + e = libxfs_attr_sf_firstentry(hdr); for (i = 0; i < idx; i++) e = xfs_attr_sf_nextentry(e); return bitize((int)xfs_attr_sf_entsize(e)); @@ -113,11 +112,11 @@ attr_shortform_list_count( void *obj, int startoff) { - struct xfs_attr_shortform *sf; + struct xfs_attr_sf_hdr *hdr; ASSERT(bitoffs(startoff) == 0); - sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff)); - return sf->hdr.count; + hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff)); + return hdr->count; } static int @@ -128,14 +127,14 @@ attr_shortform_list_offset( { struct xfs_attr_sf_entry *e; int i; - struct xfs_attr_shortform *sf; + struct xfs_attr_sf_hdr *hdr; ASSERT(bitoffs(startoff) == 0); - sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff)); - e = &sf->list[0]; + hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff)); + e = libxfs_attr_sf_firstentry(hdr); for (i = 0; i < idx; i++) e = xfs_attr_sf_nextentry(e); - return bitize((int)((char *)e - (char *)sf)); + return bitize((int)((char *)e - (char *)hdr)); } /*ARGSUSED*/ @@ -147,13 +146,13 @@ attrshort_size( { struct xfs_attr_sf_entry *e; int i; - struct xfs_attr_shortform *sf; + struct xfs_attr_sf_hdr *hdr; ASSERT(bitoffs(startoff) == 0); ASSERT(idx == 0); - sf = (struct xfs_attr_shortform *)((char *)obj + byteize(startoff)); - e = &sf->list[0]; - for (i = 0; i < sf->hdr.count; i++) + hdr = (struct xfs_attr_sf_hdr *)((char *)obj + byteize(startoff)); + e = libxfs_attr_sf_firstentry(hdr); + for (i = 0; i < hdr->count; i++) e = xfs_attr_sf_nextentry(e); - return bitize((int)((char *)e - (char *)sf)); + return bitize((int)((char *)e - (char *)hdr)); } diff --git a/db/check.c b/db/check.c index 91d0c094064b..0a53ab7dfde6 100644 --- a/db/check.c +++ b/db/check.c @@ -3069,7 +3069,7 @@ process_lclinode( blkmap_t **blkmapp, int whichfork) { - struct xfs_attr_shortform *asf; + struct xfs_attr_sf_hdr *hdr; xfs_fsblock_t bno; bno = XFS_INO_TO_FSB(mp, id->ino); @@ -3082,12 +3082,12 @@ process_lclinode( error++; } else if (whichfork == XFS_ATTR_FORK) { - asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip); - if (be16_to_cpu(asf->hdr.totsize) > XFS_DFORK_ASIZE(dip, mp)) { + hdr = XFS_DFORK_APTR(dip); + if (be16_to_cpu(hdr->totsize) > XFS_DFORK_ASIZE(dip, mp)) { if (!sflag || id->ilist || CHECK_BLIST(bno)) dbprintf(_("local inode %lld attr is too large " "(size %d)\n"), - id->ino, be16_to_cpu(asf->hdr.totsize)); + id->ino, be16_to_cpu(hdr->totsize)); error++; } } diff --git a/db/inode.c b/db/inode.c index c9b506b905d0..7a5f5a0cb987 100644 --- a/db/inode.c +++ b/db/inode.c @@ -356,7 +356,7 @@ inode_a_size( int startoff, int idx) { - struct xfs_attr_shortform *asf; + struct xfs_attr_sf_hdr *hdr; struct xfs_dinode *dip; ASSERT(startoff == 0); @@ -364,8 +364,8 @@ inode_a_size( dip = obj; switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: - asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip); - return bitize(be16_to_cpu(asf->hdr.totsize)); + hdr = XFS_DFORK_APTR(dip); + return bitize(be16_to_cpu(hdr->totsize)); case XFS_DINODE_FMT_EXTENTS: return (int)xfs_dfork_attr_extents(dip) * bitsz(xfs_bmbt_rec_t); case XFS_DINODE_FMT_BTREE: diff --git a/db/metadump.c b/db/metadump.c index bac35b9cc68c..536d089fbac6 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1035,16 +1035,15 @@ process_sf_attr( * values with 'v' (to see a valid string length, as opposed to NULLs) */ - struct xfs_attr_shortform *asfp; - struct xfs_attr_sf_entry *asfep; + struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip); + struct xfs_attr_sf_entry *asfep = libxfs_attr_sf_firstentry(hdr); int ino_attr_size; int i; - asfp = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip); - if (asfp->hdr.count == 0) + if (hdr->count == 0) return; - ino_attr_size = be16_to_cpu(asfp->hdr.totsize); + ino_attr_size = be16_to_cpu(hdr->totsize); if (ino_attr_size > XFS_DFORK_ASIZE(dip, mp)) { ino_attr_size = XFS_DFORK_ASIZE(dip, mp); if (metadump.show_warnings) @@ -1052,9 +1051,8 @@ process_sf_attr( (long long)metadump.cur_ino); } - asfep = &asfp->list[0]; - for (i = 0; (i < asfp->hdr.count) && - ((char *)asfep - (char *)asfp < ino_attr_size); i++) { + for (i = 0; (i < hdr->count) && + ((char *)asfep - (char *)hdr < ino_attr_size); i++) { int namelen = asfep->namelen; @@ -1063,7 +1061,7 @@ process_sf_attr( print_warning("zero length attr entry in inode " "%llu", (long long)metadump.cur_ino); break; - } else if ((char *)asfep - (char *)asfp + + } else if ((char *)asfep - (char *)hdr + xfs_attr_sf_entsize(asfep) > ino_attr_size) { if (metadump.show_warnings) print_warning("attr entry length in inode %llu " diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 7c055e8aa61e..36afc5d0234d 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -40,6 +40,8 @@ #define xfs_attr_leaf_newentsize libxfs_attr_leaf_newentsize #define xfs_attr_namecheck libxfs_attr_namecheck #define xfs_attr_set libxfs_attr_set +#define xfs_attr_sf_firstentry libxfs_attr_sf_firstentry +#define xfs_attr_shortform_verify libxfs_attr_shortform_verify #define __xfs_bmap_add_free __libxfs_bmap_add_free #define xfs_bmapi_read libxfs_bmapi_read diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index a383024dbd7f..055d204101a5 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -1050,9 +1050,9 @@ xfs_attr_set( static inline int xfs_attr_sf_totsize(struct xfs_inode *dp) { - struct xfs_attr_shortform *sf = dp->i_af.if_data; + struct xfs_attr_sf_hdr *sf = dp->i_af.if_data; - return be16_to_cpu(sf->hdr.totsize); + return be16_to_cpu(sf->totsize); } /* diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 9b6dcff349c9..cf172b6ea4ab 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -701,10 +701,10 @@ struct xfs_attr_sf_entry * xfs_attr_sf_findname( struct xfs_da_args *args) { - struct xfs_attr_shortform *sf = args->dp->i_af.if_data; + struct xfs_attr_sf_hdr *sf = args->dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; - for (sfe = &sf->list[0]; + for (sfe = xfs_attr_sf_firstentry(sf); sfe < xfs_attr_sf_endptr(sf); sfe = xfs_attr_sf_nextentry(sfe)) { if (xfs_attr_match(args, sfe->namelen, sfe->nameval, @@ -727,7 +727,7 @@ xfs_attr_shortform_add( struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; struct xfs_ifork *ifp = &dp->i_af; - struct xfs_attr_shortform *sf = ifp->if_data; + struct xfs_attr_sf_hdr *sf = ifp->if_data; struct xfs_attr_sf_entry *sfe; int size; @@ -747,8 +747,8 @@ xfs_attr_shortform_add( sfe->flags = args->attr_filter; memcpy(sfe->nameval, args->name, args->namelen); memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen); - sf->hdr.count++; - be16_add_cpu(&sf->hdr.totsize, size); + sf->count++; + be16_add_cpu(&sf->totsize, size); xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); xfs_sbversion_add_attr2(mp, args->trans); @@ -779,9 +779,9 @@ xfs_attr_sf_removename( { struct xfs_inode *dp = args->dp; struct xfs_mount *mp = dp->i_mount; - struct xfs_attr_shortform *sf = dp->i_af.if_data; + struct xfs_attr_sf_hdr *sf = dp->i_af.if_data; struct xfs_attr_sf_entry *sfe; - uint16_t totsize = be16_to_cpu(sf->hdr.totsize); + uint16_t totsize = be16_to_cpu(sf->totsize); void *next, *end; int size = 0; @@ -806,9 +806,9 @@ xfs_attr_sf_removename( end = xfs_attr_sf_endptr(sf); if (next < end) memmove(sfe, next, end - next); - sf->hdr.count--; + sf->count--; totsize -= size; - sf->hdr.totsize = cpu_to_be16(totsize); + sf->totsize = cpu_to_be16(totsize); /* * Fix up the start offset of the attribute fork @@ -865,21 +865,21 @@ xfs_attr_shortform_to_leaf( { struct xfs_inode *dp = args->dp; struct xfs_ifork *ifp = &dp->i_af; - struct xfs_attr_shortform *sf = ifp->if_data; + struct xfs_attr_sf_hdr *sf = ifp->if_data; struct xfs_attr_sf_entry *sfe; + int size = be16_to_cpu(sf->totsize); struct xfs_da_args nargs; char *tmpbuffer; - int error, i, size; + int error, i; xfs_dablk_t blkno; struct xfs_buf *bp; trace_xfs_attr_sf_to_leaf(args); - size = be16_to_cpu(sf->hdr.totsize); tmpbuffer = kmem_alloc(size, 0); ASSERT(tmpbuffer != NULL); memcpy(tmpbuffer, ifp->if_data, size); - sf = (struct xfs_attr_shortform *)tmpbuffer; + sf = (struct xfs_attr_sf_hdr *)tmpbuffer; xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK); @@ -902,8 +902,8 @@ xfs_attr_shortform_to_leaf( nargs.trans = args->trans; nargs.op_flags = XFS_DA_OP_OKNOENT; - sfe = &sf->list[0]; - for (i = 0; i < sf->hdr.count; i++) { + sfe = xfs_attr_sf_firstentry(sf); + for (i = 0; i < sf->count; i++) { nargs.name = sfe->nameval; nargs.namelen = sfe->namelen; nargs.value = &sfe->nameval[nargs.namelen]; @@ -970,10 +970,10 @@ xfs_attr_shortform_allfit( /* Verify the consistency of a raw inline attribute fork. */ xfs_failaddr_t xfs_attr_shortform_verify( - struct xfs_attr_shortform *sfp, + struct xfs_attr_sf_hdr *sfp, size_t size) { - struct xfs_attr_sf_entry *sfep; + struct xfs_attr_sf_entry *sfep = xfs_attr_sf_firstentry(sfp); struct xfs_attr_sf_entry *next_sfep; char *endp; int i; @@ -987,8 +987,7 @@ xfs_attr_shortform_verify( endp = (char *)sfp + size; /* Check all reported entries */ - sfep = &sfp->list[0]; - for (i = 0; i < sfp->hdr.count; i++) { + for (i = 0; i < sfp->count; i++) { /* * struct xfs_attr_sf_entry has a variable length. * Check the fixed-offset parts of the structure are diff --git a/libxfs/xfs_attr_leaf.h b/libxfs/xfs_attr_leaf.h index 35e668ae744f..9b9948639c0f 100644 --- a/libxfs/xfs_attr_leaf.h +++ b/libxfs/xfs_attr_leaf.h @@ -53,7 +53,7 @@ int xfs_attr_sf_removename(struct xfs_da_args *args); struct xfs_attr_sf_entry *xfs_attr_sf_findname(struct xfs_da_args *args); int xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp); int xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes); -xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_shortform *sfp, +xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_attr_sf_hdr *sfp, size_t size); void xfs_attr_fork_remove(struct xfs_inode *ip, struct xfs_trans *tp); diff --git a/libxfs/xfs_attr_sf.h b/libxfs/xfs_attr_sf.h index a774d4d87763..9abf7de95465 100644 --- a/libxfs/xfs_attr_sf.h +++ b/libxfs/xfs_attr_sf.h @@ -41,7 +41,14 @@ static inline int xfs_attr_sf_entsize(struct xfs_attr_sf_entry *sfep) return struct_size(sfep, nameval, sfep->namelen + sfep->valuelen); } -/* next entry in struct */ +/* first entry in the SF attr fork */ +static inline struct xfs_attr_sf_entry * +xfs_attr_sf_firstentry(struct xfs_attr_sf_hdr *hdr) +{ + return (struct xfs_attr_sf_entry *)(hdr + 1); +} + +/* next entry after sfep */ static inline struct xfs_attr_sf_entry * xfs_attr_sf_nextentry(struct xfs_attr_sf_entry *sfep) { @@ -50,9 +57,9 @@ xfs_attr_sf_nextentry(struct xfs_attr_sf_entry *sfep) /* pointer to the space after the last entry, e.g. for adding a new one */ static inline struct xfs_attr_sf_entry * -xfs_attr_sf_endptr(struct xfs_attr_shortform *sf) +xfs_attr_sf_endptr(struct xfs_attr_sf_hdr *sf) { - return (void *)sf + be16_to_cpu(sf->hdr.totsize); + return (void *)sf + be16_to_cpu(sf->totsize); } #endif /* __XFS_ATTR_SF_H__ */ diff --git a/libxfs/xfs_da_format.h b/libxfs/xfs_da_format.h index f9015f88eca7..24f9d1461f9a 100644 --- a/libxfs/xfs_da_format.h +++ b/libxfs/xfs_da_format.h @@ -578,20 +578,25 @@ xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) #define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ /* - * Entries are packed toward the top as tight as possible. + * Attribute storage when stored inside the inode. + * + * Small attribute lists are packed as tightly as possible so as to fit into the + * literal area of the inode. + * + * These "shortform" attribute forks consist of a single xfs_attr_sf_hdr header + * followed by zero or more xfs_attr_sf_entry structures. */ -struct xfs_attr_shortform { - struct xfs_attr_sf_hdr { /* constant-structure header block */ - __be16 totsize; /* total bytes in shortform list */ - __u8 count; /* count of active entries */ - __u8 padding; - } hdr; - struct xfs_attr_sf_entry { - uint8_t namelen; /* actual length of name (no NULL) */ - uint8_t valuelen; /* actual length of value (no NULL) */ - uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ - uint8_t nameval[]; /* name & value bytes concatenated */ - } list[]; /* variable sized array */ +struct xfs_attr_sf_hdr { /* constant-structure header block */ + __be16 totsize; /* total bytes in shortform list */ + __u8 count; /* count of active entries */ + __u8 padding; +}; + +struct xfs_attr_sf_entry { + __u8 namelen; /* actual length of name (no NULL) */ + __u8 valuelen; /* actual length of value (no NULL) */ + __u8 flags; /* flags bits (XFS_ATTR_*) */ + __u8 nameval[]; /* name & value bytes concatenated */ }; typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index c95abd43ab0b..208b283ba338 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -277,10 +277,9 @@ static uint16_t xfs_dfork_attr_shortform_size( struct xfs_dinode *dip) { - struct xfs_attr_shortform *atp = - (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip); + struct xfs_attr_sf_hdr *sf = XFS_DFORK_APTR(dip); - return be16_to_cpu(atp->hdr.totsize); + return be16_to_cpu(sf->totsize); } void diff --git a/libxfs/xfs_ondisk.h b/libxfs/xfs_ondisk.h index d9c988c5ad69..81885a6a028e 100644 --- a/libxfs/xfs_ondisk.h +++ b/libxfs/xfs_ondisk.h @@ -93,13 +93,13 @@ xfs_check_ondisk_structs(void) XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, namelen, 8); XFS_CHECK_OFFSET(xfs_attr_leaf_name_remote_t, name, 9); XFS_CHECK_STRUCT_SIZE(xfs_attr_leafblock_t, 32); - XFS_CHECK_STRUCT_SIZE(struct xfs_attr_shortform, 4); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.totsize, 0); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, hdr.count, 2); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].namelen, 4); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].valuelen, 5); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].flags, 6); - XFS_CHECK_OFFSET(struct xfs_attr_shortform, list[0].nameval, 7); + XFS_CHECK_STRUCT_SIZE(struct xfs_attr_sf_hdr, 4); + XFS_CHECK_OFFSET(struct xfs_attr_sf_hdr, totsize, 0); + XFS_CHECK_OFFSET(struct xfs_attr_sf_hdr, count, 2); + XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, namelen, 0); + XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, valuelen, 1); + XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, flags, 2); + XFS_CHECK_OFFSET(struct xfs_attr_sf_entry, nameval, 3); XFS_CHECK_STRUCT_SIZE(xfs_da_blkinfo_t, 12); XFS_CHECK_STRUCT_SIZE(xfs_da_intnode_t, 16); XFS_CHECK_STRUCT_SIZE(xfs_da_node_entry_t, 8); diff --git a/repair/attr_repair.c b/repair/attr_repair.c index c3a6d50267e2..31c50c127d41 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -210,27 +210,25 @@ process_shortform_attr( struct xfs_dinode *dip, int *repair) { - struct xfs_attr_shortform *asf; + struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip); struct xfs_attr_sf_entry *currententry, *nextentry, *tempentry; int i, junkit; int currentsize, remainingspace; *repair = 0; - asf = (struct xfs_attr_shortform *) XFS_DFORK_APTR(dip); - /* Assumption: hdr.totsize is less than a leaf block and was checked * by lclinode for valid sizes. Check the count though. */ - if (asf->hdr.count == 0) + if (hdr->count == 0) /* then the total size should just be the header length */ - if (be16_to_cpu(asf->hdr.totsize) != sizeof(xfs_attr_sf_hdr_t)) { + if (be16_to_cpu(hdr->totsize) != sizeof(xfs_attr_sf_hdr_t)) { /* whoops there's a discrepancy. Clear the hdr */ if (!no_modify) { do_warn( _("there are no attributes in the fork for inode %" PRIu64 "\n"), ino); - asf->hdr.totsize = + hdr->totsize = cpu_to_be16(sizeof(xfs_attr_sf_hdr_t)); *repair = 1; return(1); @@ -243,15 +241,15 @@ process_shortform_attr( } currentsize = sizeof(xfs_attr_sf_hdr_t); - remainingspace = be16_to_cpu(asf->hdr.totsize) - currentsize; - nextentry = &asf->list[0]; - for (i = 0; i < asf->hdr.count; i++) { + remainingspace = be16_to_cpu(hdr->totsize) - currentsize; + nextentry = libxfs_attr_sf_firstentry(hdr); + for (i = 0; i < hdr->count; i++) { currententry = nextentry; junkit = 0; /* don't go off the end if the hdr.count was off */ if ((currentsize + (sizeof(struct xfs_attr_sf_entry) - 1)) > - be16_to_cpu(asf->hdr.totsize)) + be16_to_cpu(hdr->totsize)) break; /* get out and reset count and totSize */ /* if the namelen is 0, can't get to the rest of the entries */ @@ -326,7 +324,7 @@ process_shortform_attr( ((intptr_t) currententry + xfs_attr_sf_entsize(currententry)); memmove(currententry,tempentry,remainingspace); - asf->hdr.count -= 1; + hdr->count -= 1; i--; /* no worries, it will wrap back to 0 */ *repair = 1; continue; /* go back up now */ @@ -344,33 +342,33 @@ process_shortform_attr( } /* end the loop */ - if (asf->hdr.count != i) { + if (hdr->count != i) { if (no_modify) { do_warn( _("would have corrected attribute entry count in inode %" PRIu64 " from %d to %d\n"), - ino, asf->hdr.count, i); + ino, hdr->count, i); } else { do_warn( _("corrected attribute entry count in inode %" PRIu64 ", was %d, now %d\n"), - ino, asf->hdr.count, i); - asf->hdr.count = i; + ino, hdr->count, i); + hdr->count = i; *repair = 1; } } /* ASSUMPTION: currentsize <= totsize */ - if (be16_to_cpu(asf->hdr.totsize) != currentsize) { + if (be16_to_cpu(hdr->totsize) != currentsize) { if (no_modify) { do_warn( _("would have corrected attribute totsize in inode %" PRIu64 " from %d to %d\n"), - ino, be16_to_cpu(asf->hdr.totsize), + ino, be16_to_cpu(hdr->totsize), currentsize); } else { do_warn( _("corrected attribute entry totsize in inode %" PRIu64 ", was %d, now %d\n"), - ino, be16_to_cpu(asf->hdr.totsize), + ino, be16_to_cpu(hdr->totsize), currentsize); - asf->hdr.totsize = cpu_to_be16(currentsize); + hdr->totsize = cpu_to_be16(currentsize); *repair = 1; } } @@ -1232,14 +1230,12 @@ process_attributes( int err; __u8 aformat = dip->di_aformat; #ifdef DEBUG - struct xfs_attr_shortform *asf; - - asf = (struct xfs_attr_shortform *) XFS_DFORK_APTR(dip); + struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dip); #endif if (aformat == XFS_DINODE_FMT_LOCAL) { - ASSERT(be16_to_cpu(asf->hdr.totsize) <= - XFS_DFORK_ASIZE(dip, mp)); + ASSERT(be16_to_cpu(hdr->totsize) <= XFS_DFORK_ASIZE(dip, mp)); + err = process_shortform_attr(mp, ino, dip, repair); } else if (aformat == XFS_DINODE_FMT_EXTENTS || aformat == XFS_DINODE_FMT_BTREE) { diff --git a/repair/dinode.c b/repair/dinode.c index c1cfadc8833e..636e753fc744 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -99,10 +99,10 @@ _("would have cleared inode %" PRIu64 " attributes\n"), ino_num); */ if (!no_modify) { - struct xfs_attr_shortform *asf = (struct xfs_attr_shortform *) - XFS_DFORK_APTR(dino); - asf->hdr.totsize = cpu_to_be16(sizeof(xfs_attr_sf_hdr_t)); - asf->hdr.count = 0; + struct xfs_attr_sf_hdr *hdr = XFS_DFORK_APTR(dino); + + hdr->totsize = cpu_to_be16(sizeof(struct xfs_attr_sf_hdr)); + hdr->count = 0; dino->di_forkoff = 0; /* got to do this after asf is set */ } @@ -993,7 +993,7 @@ process_lclinode( struct xfs_dinode *dip, int whichfork) { - struct xfs_attr_shortform *asf; + struct xfs_attr_sf_hdr *hdr; xfs_ino_t lino; lino = XFS_AGINO_TO_INO(mp, agno, ino); @@ -1005,18 +1005,19 @@ process_lclinode( XFS_DFORK_DSIZE(dip, mp)); return(1); } else if (whichfork == XFS_ATTR_FORK) { - asf = (struct xfs_attr_shortform *)XFS_DFORK_APTR(dip); - if (be16_to_cpu(asf->hdr.totsize) > XFS_DFORK_ASIZE(dip, mp)) { + hdr = XFS_DFORK_APTR(dip); + + if (be16_to_cpu(hdr->totsize) > XFS_DFORK_ASIZE(dip, mp)) { do_warn( _("local inode %" PRIu64 " attr fork too large (size %d, max = %zu)\n"), - lino, be16_to_cpu(asf->hdr.totsize), + lino, be16_to_cpu(hdr->totsize), XFS_DFORK_ASIZE(dip, mp)); return(1); } - if (be16_to_cpu(asf->hdr.totsize) < sizeof(xfs_attr_sf_hdr_t)) { + if (be16_to_cpu(hdr->totsize) < sizeof(xfs_attr_sf_hdr_t)) { do_warn( _("local inode %" PRIu64 " attr too small (size = %d, min size = %zd)\n"), - lino, be16_to_cpu(asf->hdr.totsize), + lino, be16_to_cpu(hdr->totsize), sizeof(xfs_attr_sf_hdr_t)); return(1); } From patchwork Wed Mar 13 02:08:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590902 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F32EEC14F for ; Wed, 13 Mar 2024 02:08:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295737; cv=none; b=HE8WXIMGd+5A3HoS267QVc+M4hTjc9nHdtkMUdEHy7U5qfZLhANKgvLEUkoWzutD74YQUe7q+KPIk692ZQltpSfyzpQ4TxqOHIfAxVAxgHX9TFoxb5DcX63b0Tluf555ZnheVWpZ0UOuKJBRFK8SfatHjKeEZQGMiJXFQEThvM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295737; c=relaxed/simple; bh=UutiBFRJ8CWIySPlNN/mdsduMD8h0dLf8Er/+yK6SXg=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=c9x8VP6GMAZVZmtlJq/13WDqJ1tf5j2GEjZ3rdclEZ+TR2qRf+bSpuOBgG/M5OswolKKgyOdLI12lxZg1pEr946DI/91hN1r43CChjZyp6xrU1eTvEY1sJCrqG/uAFDVNjgJ+se+kyePWKpqnFxrOhxLAXy8SHU38EmdwcSTLbA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gbCw2E/f; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gbCw2E/f" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA024C433B1; Wed, 13 Mar 2024 02:08:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295736; bh=UutiBFRJ8CWIySPlNN/mdsduMD8h0dLf8Er/+yK6SXg=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=gbCw2E/f6ZAUXHywtxm2MLpZUkbaO/R2TAC3iK90AxjmXVCxCHm14hpnLE1YQVvSd S18gEJKEToGYDg5Mul3OqXo3RPBzmfYrrWAvD4VKUnMNp9gTL1mgMOCGHC9fO3x9El XyigTRHz9n0SVpdfjebQlYUx7sv9sTOqT7isctwwpIqcdLFVY/YFjq74N6taYoQC+r LhToVIw6NO+rauJpKikXZqYiyLtGX1GczbcQm+RtJOJICeCXlU2GODDW9OKGRDjctN S6wBmgctEDKCHPAHq0B1kD1Dow7XsEIFja2qyxN/h9Jzl/fkrEJ0D4ucJbcOZs8Vg1 eM5w4cEECUsgQ== Date: Tue, 12 Mar 2024 19:08:56 -0700 Subject: [PATCH 61/67] xfs: remove xfs_attr_sf_hdr_t From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432075.2061787.15988267555200998016.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 074aea4be1a4074be49a7ec41c674cc02b52fd60 Remove the last two users of the typedef. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- db/attrshort.c | 2 +- libxfs/xfs_attr_leaf.c | 4 ++-- libxfs/xfs_attr_sf.h | 8 -------- repair/attr_repair.c | 6 +++--- repair/dinode.c | 4 ++-- 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/db/attrshort.c b/db/attrshort.c index c98b90be3ec0..7c386d46f88f 100644 --- a/db/attrshort.c +++ b/db/attrshort.c @@ -25,7 +25,7 @@ const field_t attr_shortform_flds[] = { { NULL } }; -#define HOFF(f) bitize(offsetof(xfs_attr_sf_hdr_t, f)) +#define HOFF(f) bitize(offsetof(struct xfs_attr_sf_hdr, f)) const field_t attr_sf_hdr_flds[] = { { "totsize", FLDT_UINT16D, OI(HOFF(totsize)), C1, 0, TYP_NONE }, { "count", FLDT_UINT8D, OI(HOFF(count)), C1, 0, TYP_NONE }, diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index cf172b6ea4ab..e3f8f67b5195 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -813,7 +813,7 @@ xfs_attr_sf_removename( /* * Fix up the start offset of the attribute fork */ - if (totsize == sizeof(xfs_attr_sf_hdr_t) && xfs_has_attr2(mp) && + if (totsize == sizeof(struct xfs_attr_sf_hdr) && xfs_has_attr2(mp) && (dp->i_df.if_format != XFS_DINODE_FMT_BTREE) && !(args->op_flags & (XFS_DA_OP_ADDNAME | XFS_DA_OP_REPLACE))) { xfs_attr_fork_remove(dp, args->trans); @@ -821,7 +821,7 @@ xfs_attr_sf_removename( xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); dp->i_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); ASSERT(dp->i_forkoff); - ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || + ASSERT(totsize > sizeof(struct xfs_attr_sf_hdr) || (args->op_flags & XFS_DA_OP_ADDNAME) || !xfs_has_attr2(mp) || dp->i_df.if_format == XFS_DINODE_FMT_BTREE); diff --git a/libxfs/xfs_attr_sf.h b/libxfs/xfs_attr_sf.h index 9abf7de95465..bc4422223024 100644 --- a/libxfs/xfs_attr_sf.h +++ b/libxfs/xfs_attr_sf.h @@ -6,14 +6,6 @@ #ifndef __XFS_ATTR_SF_H__ #define __XFS_ATTR_SF_H__ -/* - * Attribute storage when stored inside the inode. - * - * Small attribute lists are packed as tightly as possible so as - * to fit into the literal area of the inode. - */ -typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t; - /* * We generate this then sort it, attr_list() must return things in hash-order. */ diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 31c50c127d41..01e4afb90d5c 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -222,14 +222,14 @@ process_shortform_attr( */ if (hdr->count == 0) /* then the total size should just be the header length */ - if (be16_to_cpu(hdr->totsize) != sizeof(xfs_attr_sf_hdr_t)) { + if (be16_to_cpu(hdr->totsize) != sizeof(struct xfs_attr_sf_hdr)) { /* whoops there's a discrepancy. Clear the hdr */ if (!no_modify) { do_warn( _("there are no attributes in the fork for inode %" PRIu64 "\n"), ino); hdr->totsize = - cpu_to_be16(sizeof(xfs_attr_sf_hdr_t)); + cpu_to_be16(sizeof(struct xfs_attr_sf_hdr)); *repair = 1; return(1); } else { @@ -240,7 +240,7 @@ process_shortform_attr( } } - currentsize = sizeof(xfs_attr_sf_hdr_t); + currentsize = sizeof(struct xfs_attr_sf_hdr); remainingspace = be16_to_cpu(hdr->totsize) - currentsize; nextentry = libxfs_attr_sf_firstentry(hdr); for (i = 0; i < hdr->count; i++) { diff --git a/repair/dinode.c b/repair/dinode.c index 636e753fc744..164f51d4c4fc 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1014,11 +1014,11 @@ process_lclinode( XFS_DFORK_ASIZE(dip, mp)); return(1); } - if (be16_to_cpu(hdr->totsize) < sizeof(xfs_attr_sf_hdr_t)) { + if (be16_to_cpu(hdr->totsize) < sizeof(struct xfs_attr_sf_hdr)) { do_warn( _("local inode %" PRIu64 " attr too small (size = %d, min size = %zd)\n"), lino, be16_to_cpu(hdr->totsize), - sizeof(xfs_attr_sf_hdr_t)); + sizeof(struct xfs_attr_sf_hdr)); return(1); } } From patchwork Wed Mar 13 02:09:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590903 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C55C3BA33 for ; Wed, 13 Mar 2024 02:09:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295752; cv=none; b=SxlqjudnZJoi3/sr/YW2G3HzmvcHSzmaCiWWhCkJFq9uB6WXkoNexipfmXvqnrmRJdSYxQjrQmJtmXZ8vRWDkAf/hIxrQJHNZe+KTJojex3ta0NPVWXLSZ6oSnFJZ41BlHuOXmjlwXrM+2i04BZiZFx1uo7QcOMDfYOdUBTViEE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295752; c=relaxed/simple; bh=DWuvM+dKw/66ZaNybARal43QlZQJwWlbxX+QWpPT64Y=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cuT76Irf9/AcZY2QRvoupS4BZoeq+uGSZBztD/a/2NaKnXMfxoAjtD9oSqnHnVhtA5i4mLEzbSLpOKRzt8mq6/WAdcLEq4YGD/FOurcNY+1mTs9fxLwQid0ggU3+2SAMqTjep/1FFLQFutMnJPI+8ITrd0JOBRU8O3xqPchss6U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bG0LeYKj; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bG0LeYKj" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70E4EC433F1; Wed, 13 Mar 2024 02:09:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295752; bh=DWuvM+dKw/66ZaNybARal43QlZQJwWlbxX+QWpPT64Y=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=bG0LeYKjTS6ISJ/BW5TOSiM9Z4DHt0l2jVj0+ii6V7bnvNVhY80xdt273HMJYvy/w wYxrYDCUINkuCuNoFLV224eN7ZOPrgdp+okj0UpL1ErYcqeh3QALoY4evasNaGnxFC 5RiSpugFAAECgGoa6nuJd2CVVv/FeUVGuKtEmzqTclL/lfRBHFycbhsKchb85HGdFz 2aTwg77IaHCOeIb1NtBSNagi5Ci19+GxGVNqAoHou+7vSjgNj1XsRSVZY1mK3hnT6R RTQTk87HdP3udaBC5TMLFgU9ZFxbHveLd9YciSB4HxYvpXy/vF/NPCBYYLY01XpMgk BpWs9qrhgXDSQ== Date: Tue, 12 Mar 2024 19:09:12 -0700 Subject: [PATCH 62/67] xfs: turn the XFS_DA_OP_REPLACE checks in xfs_attr_shortform_addname into asserts From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Dave Chinner , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432089.2061787.15016455242739550153.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 378b6aef9de0f7c3d0de309ecc61c11eb29e57da Since commit deed9512872d ("xfs: Check for -ENOATTR or -EEXIST"), the high-level attr code does a lookup for any attr we're trying to set, and does the checks to handle the create vs replace cases, which thus never hit the low-level attr code. Turn the checks in xfs_attr_shortform_addname as they must never trip. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Reviewed-by: Dave Chinner Signed-off-by: Chandan Babu R --- libxfs/xfs_attr.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 055d204101a5..1419846bdf9d 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -1070,8 +1070,7 @@ xfs_attr_shortform_addname( if (xfs_attr_sf_findname(args)) { int error; - if (!(args->op_flags & XFS_DA_OP_REPLACE)) - return -EEXIST; + ASSERT(args->op_flags & XFS_DA_OP_REPLACE); error = xfs_attr_sf_removename(args); if (error) @@ -1085,8 +1084,7 @@ xfs_attr_shortform_addname( */ args->op_flags &= ~XFS_DA_OP_REPLACE; } else { - if (args->op_flags & XFS_DA_OP_REPLACE) - return -ENOATTR; + ASSERT(!(args->op_flags & XFS_DA_OP_REPLACE)); } if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || From patchwork Wed Mar 13 02:09:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590904 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 771C88BE0 for ; Wed, 13 Mar 2024 02:09:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295768; cv=none; b=irrw0i9mScXpaFbbQTauEzIf46del5Rg+3n4iGDVW8Yuu/npnGIBenyYotFqAmUuUSRTozGdk9KX/zXYmQOlB735iLiN3x7rI3OaeoJ5pfQt0Wed5Cn5FMTkRQtRFfLISx5fLAHt+f80knPrF+kf5cW6cxmV2OfoczxTIzkAQmk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295768; c=relaxed/simple; bh=/i+45+7QDE33lB0llDpWp26EZXzWxD6MuOjee0UG1Qo=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dzgdOJcWi/2akd11CLmep64jD7R52nbgopkccy1YBZoO9l/nZvBJjeDW1+atb1R0AYsnJWi4H2WEHpHzG2xAqZpO7/Sx/RU6uB0wx0KAIj0EP99CCROzTtvNAJZjgRDkfpzf2KeKmQR5o02IXH7CLjGDlSaqtqnMmIqvtxI4VjU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TZw0gd58; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TZw0gd58" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C636C433F1; Wed, 13 Mar 2024 02:09:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295768; bh=/i+45+7QDE33lB0llDpWp26EZXzWxD6MuOjee0UG1Qo=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=TZw0gd58H+cADBWX7y9rsDqBsAocJnzSquxRUnJdDwfpcII+E1Y6wFdo1lajcG3GJ 9MxKNcIV1chYFKDR8cgw9GNIfLJOwL6MacvZQ/0PHe8u/zSX3AcgRwZbn/f4h7cSh8 q5uzsVUn6W0qEyHnANKa7F1UkRDJTkeEriJbHYya3SdUAHxP6q+JE/lWsWPmi0MoYv eBHCNiV7VpiVEVS+6PinVhhong54Bv1JTjSBShtB/Y7hM78lnLZdh9JMwYdKgivqfl GtV6/cxK2dNQ/+IM3YAXJBCUDNGE2e2CizxKq+QI/0wT7y4dZzfVBdazhb6W6tiEVp lQ3YSs+XeBl0Q== Date: Tue, 12 Mar 2024 19:09:27 -0700 Subject: [PATCH 63/67] xfs: fix a use after free in xfs_defer_finish_recovery From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: kernel test robot , Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432104.2061787.18277817896007687707.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: 4f6ac47b55e3ce6e982807928d6074ec105ab66e dfp will be freed by ->recover_work and thus the tracepoint in case of an error can lead to a use after free. Store the defer ops in a local variable to avoid that. Fixes: 7f2f7531e0d4 ("xfs: store an ops pointer in struct xfs_defer_pending") Reported-by: kernel test robot Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_defer.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 077e99298074..5bdc8f5a258a 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -909,12 +909,14 @@ xfs_defer_finish_recovery( struct xfs_defer_pending *dfp, struct list_head *capture_list) { + const struct xfs_defer_op_type *ops = dfp->dfp_ops; int error; - error = dfp->dfp_ops->recover_work(dfp, capture_list); + /* dfp is freed by recover_work and must not be accessed afterwards */ + error = ops->recover_work(dfp, capture_list); if (error) trace_xlog_intent_recovery_failed(mp, error, - dfp->dfp_ops->recover_work); + ops->recover_work); return error; } From patchwork Wed Mar 13 02:09:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590905 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 126A18BE0 for ; Wed, 13 Mar 2024 02:09:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295785; cv=none; b=XhCHw49c/iJs/M3DkS4KLqanj5tJSCdSavOAQclLq5RJn4607LhIrmOKaP1hMGm8cLkFa1QxFHkz0ok86ZgoVN8K09Qt3SHq3dyOB/v15ltkCJK/lLSwwVV400sdLZqNdcHJL7sIJImctAEaVP+uLYmzOdAAJy0EQFaLbvYcRcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295785; c=relaxed/simple; bh=o1OPfqbOZ6qyIWwmKA1HqM9B9YODhaG1xzZVwTdKj2A=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=T5TJB8lj/j82aV+ALD86dpVd7yQRzXR3cUTfZAncK62xeTEATzOqBZ1O8dehSxU7UD2nTBCt8voKX9X0nuM+y9E8KhacjoZF9QdfUz/3QaTCzG6jvcZbspJBOtfrn9ABjeRHAtnCQtxdEjW5D3W3YZkkpxPy7hIJiNIQzOBA1Ko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rEb+avum; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rEb+avum" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9D55BC433C7; Wed, 13 Mar 2024 02:09:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295783; bh=o1OPfqbOZ6qyIWwmKA1HqM9B9YODhaG1xzZVwTdKj2A=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=rEb+avum9jyUel8KVXVkcROrzJZupznsoDmz2YdE9zA6wXtZM8IbnrulP6n7oJiWg eiTqoySdoVbe4UxaM7bn59t9ymI8E2jMcWZlDk3E3rSMdJhtxLZavzqxo9TYLp3lFK 5ZZTRMG+QDcncUeyXdyiK7aFJOrfyYU0M4W+SRk3iUObZmzKUBdVE62zveQnQQ3Anb 0qSTncbZliXS3L7uzppZJ6TmTp4S0xRv0gRmLQkNid2apozAJzY4hw+WnhQojmqATW NHhErWNU1PERvie/ATYGRK1fCT6KiNHEezZBPdZnBR9Gejrd0Q4niQSbvUVoJXlrCJ 2t4yC/6yxfR1A== Date: Tue, 12 Mar 2024 19:09:43 -0700 Subject: [PATCH 64/67] xfs: use the op name in trace_xlog_intent_recovery_failed From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432118.2061787.3272883518379611998.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Christoph Hellwig Source kernel commit: bcdfae6ee520b665385020fa3e47633a8af84f12 Instead of tracing the address of the recovery handler, use the name in the defer op, similar to other defer ops related tracepoints. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" Signed-off-by: Chandan Babu R --- libxfs/xfs_defer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 5bdc8f5a258a..bf1d1e06a35b 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -915,8 +915,7 @@ xfs_defer_finish_recovery( /* dfp is freed by recover_work and must not be accessed afterwards */ error = ops->recover_work(dfp, capture_list); if (error) - trace_xlog_intent_recovery_failed(mp, error, - ops->recover_work); + trace_xlog_intent_recovery_failed(mp, ops, error); return error; } From patchwork Wed Mar 13 02:09:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590906 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 803BCBA2B for ; Wed, 13 Mar 2024 02:09:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295799; cv=none; b=fnNoEcJ9i+c07z00mmdT9/O/ao+miUbB/RTPzjmch+yFGFd7khVA31lAmXpitPjbJTwWoFM86vKegJNnysYnKhaCYzlPRG+KZGKxWtuT0CMAzrOUEixfIQBzErS7ac6sVHofU2n/7UCDlRwbh/WECg5dPQGGarwKDDGUBYQE+6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295799; c=relaxed/simple; bh=KDc1SAMepebpEGm3nZnp+erxFSFxv8Ale13PfvjAhHw=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oiO+7rM48jvAtXypQoxvsnm9oxrBPMAyBRk7+yJ2IbOaKNhC+KQug97x6J8G9TjaXI8ga8R6DFZ8EvjiIngDtw0V9p3diPzDOQyDjF21nQESIsjmoSuG7lxZAGN/tBUDuLpsd7gwUWTimoEot6Zdna5qw71u0dA1aH8sWzkkuBU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LNzohWvl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LNzohWvl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4BFFEC433F1; Wed, 13 Mar 2024 02:09:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295799; bh=KDc1SAMepebpEGm3nZnp+erxFSFxv8Ale13PfvjAhHw=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=LNzohWvl+QDEv4GQnrV92SFwAbXLwxHMq3zKj38lIXKT7YLx00j+sGZ40FWKJ/XeM RbV1bqWnBhVvqK79sg8eFJf8JcwEcVT899Jn7jhUyZfVpn7cchgYyGlejQSyp3eytg C4WaYRLd9LiqU7h9nXWPX0G0OSGX57yeXaz5H4BpYOgP2mkkXkpb7LG9M14pFCwqtf PnDXa2IJy6yKyYMkf+oSiRJIi89NErXPxd3tv2yE8a4pwgqCnsyutS2oSNaA8t/1KU My4GlLgxVD/drPe1jxQB4ZmW8ef7qdcFOvNrLNocdtBP/BDiPJNVqVbAE6H7Hqwt4V 7jh3Ds8Js6/lA== Date: Tue, 12 Mar 2024 19:09:58 -0700 Subject: [PATCH 65/67] xfs: fix backwards logic in xfs_bmap_alloc_account From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432132.2061787.200173404480542852.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: d61b40bf15ce453f3aa71f6b423938e239e7f8f8 We're only allocating from the realtime device if the inode is marked for realtime and we're /not/ allocating into the attr fork. Fixes: 58643460546d ("xfs: also use xfs_bmap_btalloc_accounting for RT allocations") Signed-off-by: "Darrick J. Wong" Reviewed-by: Christoph Hellwig Signed-off-by: Chandan Babu R --- libxfs/xfs_bmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5e6a5e1f355b..494994d360e4 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3271,7 +3271,7 @@ xfs_bmap_alloc_account( struct xfs_bmalloca *ap) { bool isrt = XFS_IS_REALTIME_INODE(ap->ip) && - (ap->flags & XFS_BMAPI_ATTRFORK); + !(ap->flags & XFS_BMAPI_ATTRFORK); uint fld; if (ap->flags & XFS_BMAPI_COWFORK) { From patchwork Wed Mar 13 02:10:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590907 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B58BBA2B for ; Wed, 13 Mar 2024 02:10:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295815; cv=none; b=imMtD1GGoqmbHb9Qmggu9+kgHXlB6JnQ04YL9jZEgxOL9ZCnxl6yZiMf4w/vWG9017stOBN2goKlHSeXxPzxzVAbKE2fX9g1HSDk7P8QrnpTmJHL5jEvqPuLuJ+9PoFoA2ZElbEbxJAKPgvf5uYutT9BwxHsyYWRoAnsiMmzvgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295815; c=relaxed/simple; bh=N6o2/8nTpWLLDAwSWeybEIU1hl4FviI8I6jq1xXBy9w=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=l8HHfbJs2PgCdmIvKQXWndJLvWLqa9Re+gS2p6vIAuBiu7VoU9Jl0rh5YYwl8VS9U5VopM5NA7VLI0OPqJ6aFhBahBW2YPICo6eWnD7oOYWL850hctlBC+Do7pSkuO/zV255MXXgeYjs152xCK4OJOiDUgOJNU9h1G1rvraNQzw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QOdv54pi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QOdv54pi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7395C433F1; Wed, 13 Mar 2024 02:10:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295815; bh=N6o2/8nTpWLLDAwSWeybEIU1hl4FviI8I6jq1xXBy9w=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=QOdv54pirH6g9WXj07JWXOCTU/90ZKjZqIUBL6WMfPhn5eoJDwH7SHPFr6BlsP1HF b0eGRq+hsxuGKtovgSCQX1lfAZ1/+nhd3+/n/qExtU4s91E0L8ea7wsRG4d9zO+tVe nLbF/3p+v+NOqzUApmUUwtBGNzaBTKfrPGCQVEYzZJCfkbqn/dmxldIia5reea0nPT y4ZwBENId01rVuQAN7hA461XAEAteJEn/NOSMeO3vmPAAf5Kq9pmkicKh3q4vN09kc 1XT/ULxJoWe+pEdHNEcKB0Q4Etx6j1I8k5zdsZuEHy+OU8/sxtzN31LTLx5s+sgIXG B9Z/jZTeTcoZQ== Date: Tue, 12 Mar 2024 19:10:14 -0700 Subject: [PATCH 66/67] xfs: reset XFS_ATTR_INCOMPLETE filter on node removal From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Andrey Albershteyn , Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432147.2061787.11984387032713086021.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Andrey Albershteyn Source kernel commit: 82ef1a5356572219f41f9123ca047259a77bd67b In XFS_DAS_NODE_REMOVE_ATTR case, xfs_attr_mode_remove_attr() sets filter to XFS_ATTR_INCOMPLETE. The filter is then reset in xfs_attr_complete_op() if XFS_DA_OP_REPLACE operation is performed. The filter is not reset though if XFS just removes the attribute (args->value == NULL) with xfs_attr_defer_remove(). attr code goes to XFS_DAS_DONE state. Fix this by always resetting XFS_ATTR_INCOMPLETE filter. The replace operation already resets this filter in anyway and others are completed at this step hence don't need it. Fixes: fdaf1bb3cafc ("xfs: ATTR_REPLACE algorithm with LARP enabled needs rework") Signed-off-by: Andrey Albershteyn Reviewed-by: Christoph Hellwig Signed-off-by: Chandan Babu R --- libxfs/xfs_attr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 1419846bdf9d..630065f1a392 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -419,10 +419,10 @@ xfs_attr_complete_op( bool do_replace = args->op_flags & XFS_DA_OP_REPLACE; args->op_flags &= ~XFS_DA_OP_REPLACE; - if (do_replace) { - args->attr_filter &= ~XFS_ATTR_INCOMPLETE; + args->attr_filter &= ~XFS_ATTR_INCOMPLETE; + if (do_replace) return replace_state; - } + return XFS_DAS_DONE; } From patchwork Wed Mar 13 02:10:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13590908 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB5568BE0 for ; Wed, 13 Mar 2024 02:10:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295830; cv=none; b=NLFqm5aE3Bst4Yy9/2kd7m6xtt2BQvv3UOcLAIL+vsAHlhJcPQJnYZhUfnHj5NkeM5mFdqX2kRcMwx3GYZ5ICxkdJOK9fjwS6SouNpbjTr00SgpZHvuoUFXUV5FD8ayBjs0lgAcUjTazmD8d99P//WtpT1rnNPlcACJz/k6N8Xs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710295830; c=relaxed/simple; bh=4Uf4M8OFY0yBdIIB7AqbYOl+SnkRGBAcqhDWkmJ8khc=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EyqumYlmFQT8ZMiGBOyXkdUSzTdZqUKQOsINRZdolMfT/uD5l1Lf0B5/LOZYhkB9khTSQ8lUasx2/Klklvy34Lnaut9QWOwLNQFVdhBixrU5A8jaGvQH6SS2pGs6HqRJ9o5xqhO2NKamDs1kUyPz6opgQ4+X2yBgNsC3iB+w4h8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=upZreGeM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="upZreGeM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 99280C433F1; Wed, 13 Mar 2024 02:10:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710295830; bh=4Uf4M8OFY0yBdIIB7AqbYOl+SnkRGBAcqhDWkmJ8khc=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=upZreGeMJyDlWFF+dWFnbZ3R/H9C8Ge93x14UZ+slsmo7Wou/pxf5B5V3y/tMjDWD VIZ1a1/X0yLD/mD3N5lw1ORDpvPK982RxQjnOpkkbxiZt+BIefTnxOH00xD18cMcud Vmiux8lFB51x8snxh88DjF7refRYUb52g6rm3cVa0yo7wVGhJ1Dd2E7/81Mothziu6 N6sA1o6F5RCx599K/BL8zIx49WrYkVKIckX+72ox55CElRqbF7x2bLeaIoyQnLapEr 2cUY1rjFWgiGx6MOQOo36RiVY2s80F4HXtCfvdNmFyR08mFHBr4Pc8XZS86gOyD+lp Vcmw9/21Dc5gg== Date: Tue, 12 Mar 2024 19:10:30 -0700 Subject: [PATCH 67/67] xfs: remove conditional building of rt geometry validator functions From: "Darrick J. Wong" To: djwong@kernel.org, cem@kernel.org Cc: Christoph Hellwig , Chandan Babu R , linux-xfs@vger.kernel.org Message-ID: <171029432161.2061787.1232525242604018635.stgit@frogsfrogsfrogs> In-Reply-To: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> References: <171029431107.2061787.680090905906055791.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-xfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Darrick J. Wong Source kernel commit: 881f78f472556ed05588172d5b5676b48dc48240 I mistakenly turned off CONFIG_XFS_RT in the Kconfig file for arm64 variant of the djwong-wtf git branch. Unfortunately, it took me a good hour to figure out that RT wasn't built because this is what got printed to dmesg: XFS (sda2): realtime geometry sanity check failed XFS (sda2): Metadata corruption detected at xfs_sb_read_verify+0x170/0x190 [xfs], xfs_sb block 0x0 Whereas I would have expected: XFS (sda2): Not built with CONFIG_XFS_RT XFS (sda2): RT mount failed The root cause of these problems is the conditional compilation of the new functions xfs_validate_rtextents and xfs_compute_rextslog that I introduced in the two commits listed below. The !RT versions of these functions return false and 0, respectively, which causes primary superblock validation to fail, which explains the first message. Move the two functions to other parts of libxfs that are not conditionally defined by CONFIG_XFS_RT and remove the broken stubs so that validation works again. Fixes: e14293803f4e ("xfs: don't allow overly small or large realtime volumes") Fixes: a6a38f309afc ("xfs: make rextslog computation consistent with mkfs") Signed-off-by: "Darrick J. Wong" Reviewed-by: Christoph Hellwig Signed-off-by: Chandan Babu R --- libxfs/xfs_rtbitmap.c | 14 -------------- libxfs/xfs_rtbitmap.h | 16 ---------------- libxfs/xfs_sb.c | 14 ++++++++++++++ libxfs/xfs_sb.h | 2 ++ libxfs/xfs_types.h | 12 ++++++++++++ 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index 79af7cda3441..08a4128fc524 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -1116,20 +1116,6 @@ xfs_rtbitmap_blockcount( return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize); } -/* - * Compute the maximum level number of the realtime summary file, as defined by - * mkfs. The historic use of highbit32 on a 64-bit quantity prohibited correct - * use of rt volumes with more than 2^32 extents. - */ -uint8_t -xfs_compute_rextslog( - xfs_rtbxlen_t rtextents) -{ - if (!rtextents) - return 0; - return xfs_highbit64(rtextents); -} - /* * Compute the number of rtbitmap words needed to populate every block of a * bitmap that is large enough to track the given number of rt extents. diff --git a/libxfs/xfs_rtbitmap.h b/libxfs/xfs_rtbitmap.h index 274dc7dae1fa..152a66750af5 100644 --- a/libxfs/xfs_rtbitmap.h +++ b/libxfs/xfs_rtbitmap.h @@ -351,20 +351,6 @@ xfs_rtfree_extent( int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno, xfs_filblks_t rtlen); -uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents); - -/* Do we support an rt volume having this number of rtextents? */ -static inline bool -xfs_validate_rtextents( - xfs_rtbxlen_t rtextents) -{ - /* No runt rt volumes */ - if (rtextents == 0) - return false; - - return true; -} - xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents); unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp, @@ -383,8 +369,6 @@ unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp, # define xfs_rtsummary_read_buf(a,b) (-ENOSYS) # define xfs_rtbuf_cache_relse(a) (0) # define xfs_rtalloc_extent_is_free(m,t,s,l,i) (-ENOSYS) -# define xfs_compute_rextslog(rtx) (0) -# define xfs_validate_rtextents(rtx) (false) static inline xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents) { diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 7a72d5a17910..402f03a557e0 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -1375,3 +1375,17 @@ xfs_validate_stripe_geometry( } return true; } + +/* + * Compute the maximum level number of the realtime summary file, as defined by + * mkfs. The historic use of highbit32 on a 64-bit quantity prohibited correct + * use of rt volumes with more than 2^32 extents. + */ +uint8_t +xfs_compute_rextslog( + xfs_rtbxlen_t rtextents) +{ + if (!rtextents) + return 0; + return xfs_highbit64(rtextents); +} diff --git a/libxfs/xfs_sb.h b/libxfs/xfs_sb.h index 19134b23c10b..2e8e8d63d4eb 100644 --- a/libxfs/xfs_sb.h +++ b/libxfs/xfs_sb.h @@ -38,4 +38,6 @@ extern int xfs_sb_get_secondary(struct xfs_mount *mp, extern bool xfs_validate_stripe_geometry(struct xfs_mount *mp, __s64 sunit, __s64 swidth, int sectorsize, bool silent); +uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents); + #endif /* __XFS_SB_H__ */ diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index 20b5375f2d9c..62e02d5380ad 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -251,4 +251,16 @@ bool xfs_verify_fileoff(struct xfs_mount *mp, xfs_fileoff_t off); bool xfs_verify_fileext(struct xfs_mount *mp, xfs_fileoff_t off, xfs_fileoff_t len); +/* Do we support an rt volume having this number of rtextents? */ +static inline bool +xfs_validate_rtextents( + xfs_rtbxlen_t rtextents) +{ + /* No runt rt volumes */ + if (rtextents == 0) + return false; + + return true; +} + #endif /* __XFS_TYPES_H__ */