From patchwork Fri Aug 23 00:12: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: 13774404 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 D62A13C2F for ; Fri, 23 Aug 2024 00:12:19 +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=1724371939; cv=none; b=gNqFSjOFkUnm3d4L6I234GTu4T6GbZ3YvtYG+pkfFrnbZ1q1pAkvBjzUWF5XOufw5HCTSv2oQDEl+9CGtUEpPvF3iy84hdIgbwH4O/lxmoJYsTWbIX2KS6v7bcw0/cXd+dxlq1DL+HYb2NkZf2N0BozcXaCQLLMG//2QDj5wJec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724371939; c=relaxed/simple; bh=6XSc2FNe7ajf6ik47a7pe4xlQi+N/kJdjGCgOQ0ZQcY=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FQHLd663/iOVn4nw+pBTva5rVJZCah9DjHNqOA2/fp6RmLExur3jqz9e8U5pWTCeRpDqTm3rQFaJKDF7iuxLg5xeUABaYm7VU8Il/4hDHXJcJfw1SHrtaRJ8jqKZZq2zoyoXXRIvP58gtPylZnnuDnj6qgQvkI+hCbJ59dz7YLI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ts6KRnt3; 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="Ts6KRnt3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B341C32782; Fri, 23 Aug 2024 00:12:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724371939; bh=6XSc2FNe7ajf6ik47a7pe4xlQi+N/kJdjGCgOQ0ZQcY=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=Ts6KRnt38KCt/+DLv2lFTNab0FioFfqVqWTmduAzIQgVdCKbLW5KPyWJbOfkJtePP PSpfBJl2ZKfjPChbe08E51NJe07s0Qdl9gtyja7pTrH7yMM7SVjXVCqLvROCKA/JS0 +HtQ2z3p2wFQU4R4T+L+WMIDf54OWCrJM+LJldPcp4OQc7ekYZ9KNnLMmsoXUZLKcH /OISZptiSwKutu9xNDiyfGWBnWLQjiTUjLfo89M9NG3OMri+MJhWOvgqUvQALaEn0q bXzwZFLOE8lXbJ7AsNt4IIQz+yqHeEOv6pvN9KWbhPOdTqHLHq+CPGSZ3XrwUaFwas wXCo5LuUFAwoQ== Date: Thu, 22 Aug 2024 17:12:19 -0700 Subject: [PATCH 01/10] xfs: use the recalculated transaction reservation in xfs_growfs_rt_bmblock From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086634.59070.2069214237731150756.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 After going great length to calculate the transaction reservation for the new geometry, we should also use it to allocate the transaction it was calculated for. Fixes: 578bd4ce7100 ("xfs: recompute growfsrtfree transaction reservation while growing rt volume") Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_rtalloc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index e809a8649c60c..1f31b08c95a06 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -732,10 +732,12 @@ xfs_growfs_rt_bmblock( xfs_rtsummary_blockcount(mp, nmp->m_rsumlevels, nmp->m_sb.sb_rbmblocks)); - /* recompute growfsrt reservation from new rsumsize */ + /* + * Recompute the growfsrt reservation from the new rsumsize, so that the + * transaction below use the new, potentially larger value. + * */ xfs_trans_resv_calc(nmp, &nmp->m_resv); - - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtfree, 0, 0, 0, + error = xfs_trans_alloc(mp, &M_RES(nmp)->tr_growrtfree, 0, 0, 0, &args.tp); if (error) goto out_free; From patchwork Fri Aug 23 00:12:34 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: 13774405 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 3E30CEDC for ; Fri, 23 Aug 2024 00:12:35 +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=1724371955; cv=none; b=czYQMl/kM91xztzz0glTfrr/RNr++Jamn3CfZJ7zQgW61e5ATIrSm904gCoKo8+a5XYCYLEY6T7wnbx7A3e+VsRUujjvsE2bokFEj8k0mRVlhKSKtLfJ9wGjQMuwfM2G3CsSRRflDqUMhg9t2R9SaevLlGIbfMkwacpWluFBy/w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724371955; c=relaxed/simple; bh=OTu7e1RisXV9SsGI1PK+TGEc4eUH7EBDfdPYGHrF8sQ=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GBQML8Gj1TWJ+mnMe61K9+MquxyzLRscL+RUF2g4UQuVDJ8LnDtrSb1MqLTRlBLRbK/NypGojIakYHhru5fCONQ+bYwbmJBQDMov0ow9FapwpErUWKBLLfDHYhKEH57JjL+XpumloyVFjqgwNAs+QgTgv8CqnaNTru3Y078CKZA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RnjZlXU5; 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="RnjZlXU5" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 15B0EC32782; Fri, 23 Aug 2024 00:12:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724371955; bh=OTu7e1RisXV9SsGI1PK+TGEc4eUH7EBDfdPYGHrF8sQ=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=RnjZlXU54hNbo8ZR7XN2go/kA6OuDPksoxg4j8V+ktUG5Cb2tBr93WGRLZTSF8CVu E4iPdo6UAL4NIxAeTPysEl9+ZI5qbjUaZZHkdcjTO37j8JnSLjhRU+tJ0WzWnZY4Ps XM7/m+Sh8p7tx3Fq/XLq3MFYJ9vKtmFhcOtkJd5SruZ+OzTUFA2SfuRUqKJ4qiztkh EkycwUhoMlTlH47TB2358qi9VBwZozxGCGXm78tV7Q4DLKCLWU7TB1tHNCn9BFO+As DMU3ISEjMbFXd3x6jgf3aICR5EWXPKnXxTDoWbDphkrtZuubj3NXjMkO5D+LdLudGe Cu6Gl6J5VUM4A== Date: Thu, 22 Aug 2024 17:12:34 -0700 Subject: [PATCH 02/10] xfs: ensure rtx mask/shift are correct after growfs From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086651.59070.1117758034575341097.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 When growfs sets an extent size, it doesn't updated the m_rtxblklog and m_rtxblkmask values, which could lead to incorrect usage of them if they were set before and can't be used for the new extent size. Add a xfs_mount_sb_set_rextsize helper that updates the two fields, and also use it when calculating the new RT geometry instead of disabling the optimization there. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_sb.c | 12 ++++++++++-- fs/xfs/libxfs/xfs_sb.h | 2 ++ fs/xfs/xfs_rtalloc.c | 5 +++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index a4221afb012b6..b83ce29640511 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -975,6 +975,15 @@ const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { .verify_write = xfs_sb_write_verify, }; +void +xfs_mount_sb_set_rextsize( + struct xfs_mount *mp, + struct xfs_sb *sbp) +{ + mp->m_rtxblklog = log2_if_power2(sbp->sb_rextsize); + mp->m_rtxblkmask = mask64_if_power2(sbp->sb_rextsize); +} + /* * xfs_mount_common * @@ -999,8 +1008,7 @@ xfs_sb_mount_common( mp->m_blockmask = sbp->sb_blocksize - 1; mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; mp->m_blockwmask = mp->m_blockwsize - 1; - mp->m_rtxblklog = log2_if_power2(sbp->sb_rextsize); - mp->m_rtxblkmask = mask64_if_power2(sbp->sb_rextsize); + xfs_mount_sb_set_rextsize(mp, sbp); mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1); mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0); diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h index 796f02191dfd2..885c837559914 100644 --- a/fs/xfs/libxfs/xfs_sb.h +++ b/fs/xfs/libxfs/xfs_sb.h @@ -17,6 +17,8 @@ extern void xfs_log_sb(struct xfs_trans *tp); extern int xfs_sync_sb(struct xfs_mount *mp, bool wait); extern int xfs_sync_sb_buf(struct xfs_mount *mp); extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp); +void xfs_mount_sb_set_rextsize(struct xfs_mount *mp, + struct xfs_sb *sbp); extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 1f31b08c95a06..ffa417a3e8a76 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -721,8 +721,8 @@ xfs_growfs_rt_bmblock( /* * Calculate new sb and mount fields for this round. */ - nmp->m_rtxblklog = -1; /* don't use shift or masking */ nmp->m_sb.sb_rextsize = rextsize; + xfs_mount_sb_set_rextsize(nmp, &nmp->m_sb); nmp->m_sb.sb_rbmblocks = bmbno + 1; nmp->m_sb.sb_rblocks = min(nrblocks, nrblocks_step); nmp->m_sb.sb_rextents = xfs_rtb_to_rtx(nmp, nmp->m_sb.sb_rblocks); @@ -809,10 +809,11 @@ xfs_growfs_rt_bmblock( xfs_trans_mod_sb(args.tp, XFS_TRANS_SB_FREXTENTS, freed_rtx); /* - * Update mp values into the real mp structure. + * Update the calculated values in the real mount structure. */ mp->m_rsumlevels = nmp->m_rsumlevels; mp->m_rsumsize = nmp->m_rsumsize; + xfs_mount_sb_set_rextsize(mp, &mp->m_sb); /* * Recompute the growfsrt reservation from the new rsumsize. From patchwork Fri Aug 23 00:12:50 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: 13774406 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 DFC1F620 for ; Fri, 23 Aug 2024 00:12: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=1724371971; cv=none; b=f2W/GXlFN6uAme9I6+I/HIc5pbeND13TByCl1neNEIihYmyPGyObWUPFYv0jiefexVgYluaMQaPS/b+ORmkkMSRbP5CHR4ndv4ATbOMt9jkv/9fXey6g8+YASJsf571CM/PbV7bmjm+3434SE+VYG3bopd8SWA6fXRCs0xOB6fs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724371971; c=relaxed/simple; bh=Kuocn5oGUGHBGmQDTTVV1ysD9ZC79ghFLqynAUFXPuA=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=grPXFnBdRYMomodP369iZp3lnvNu/aXWFoX8ZT2/XPaRM/ySh58kZs1WW25QjCdgrVHLX65h2FB5+OcKNmEds0vSoreTTgYEOKTC4JACqYQS6CLS2/vMVhukRA8sdzMvVZ1NkLINnPUIAgQIKLuWn6koEhDbXTge2UoEfypXke4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hi+yXbP1; 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="Hi+yXbP1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B6F91C32782; Fri, 23 Aug 2024 00:12:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724371970; bh=Kuocn5oGUGHBGmQDTTVV1ysD9ZC79ghFLqynAUFXPuA=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=Hi+yXbP1HUolFfXD2su2zEPfzWfi2WCoN4nR8Gg7mhpTIqxpNpyrFhDuqoCjiRfqQ drM1+jco083Qd0ZfI/pTrabUTjuxvV5XyDYcTGoxPvMY4VoiRpdiwhojt6uN+Cxsdm sDIuyIhNbkomyFlSrLaGW4SjbhQkH9qKFJPmy/3g+Niodn6d56CUZVPbaK0UIUn7Bb uC3CaXWPPFMmmI4/9BAZh+bd3+buOire/1U4QIyAbnvDHx7moQ3IFhyFFMdKLgWimS aS2qjyeHn3KfzSQBB3vYnnHa9QWFXOSyWkrjEEwNxWy6Ep/bRgMjC4cHEqSzhpv/11 9nHoCDpGKDg4A== Date: Thu, 22 Aug 2024 17:12:50 -0700 Subject: [PATCH 03/10] xfs: don't return too-short extents from xfs_rtallocate_extent_block From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086668.59070.5713338461091119042.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 If xfs_rtallocate_extent_block is asked for a variable-sized allocation, it will try to return the best-sized free extent, which is apparently the largest one that it finds starting in this rtbitmap block. It will then trim the size of the extent as needed to align it with prod. However, it misses one thing -- rounding down the best-fit candidate to the required alignment could make the extent shorter than minlen. In the case where minlen > 1, we'd rather the caller relaxed its alignment requirements and tried again, as the allocator already supports that. Returning a too-short extent that causes xfs_bmapi_write to return ENOSR if there aren't enough nmaps to handle multiple new allocations, which can then cause filesystem shutdowns. I haven't seen this happen on any production systems, but then I don't think it's very common to set a per-file extent size hint on realtime files. I tripped it while working on the rtgroups feature and pounding on the realtime allocator enthusiastically. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index ffa417a3e8a76..3d78dc0940190 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -291,16 +291,9 @@ xfs_rtallocate_extent_block( return error; } - /* - * Searched the whole thing & didn't find a maxlen free extent. - */ - if (minlen > maxlen || besti == -1) { - /* - * Allocation failed. Set *nextp to the next block to try. - */ - *nextp = next; - return -ENOSPC; - } + /* Searched the whole thing & didn't find a maxlen free extent. */ + if (minlen > maxlen || besti == -1) + goto nospace; /* * If size should be a multiple of prod, make that so. @@ -313,12 +306,20 @@ xfs_rtallocate_extent_block( bestlen -= p; } + /* Don't return a too-short extent. */ + if (bestlen < minlen) + goto nospace; + /* * Pick besti for bestlen & return that. */ *len = bestlen; *rtx = besti; return 0; +nospace: + /* Allocation failed. Set *nextp to the next block to try. */ + *nextp = next; + return -ENOSPC; } /* From patchwork Fri Aug 23 00:13: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: 13774407 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 8318115BB for ; Fri, 23 Aug 2024 00:13:06 +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=1724371986; cv=none; b=IJJ5KqVEyI/aFR0ma1I1aOkU6zMDsHq9ei5kmBU1P0v2ZGSiE5sAdo+45ZMoAUOt3VVUT+NU0WyzOgBTAdZ7XRx6hqzHIlW1l2YUK6ErqF10V6J+DUgq//BewnWJDsi42LIb/S/USe0vxTlNLQR5xAxS+7E+yc1oWPpfidDwT2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724371986; c=relaxed/simple; bh=aAdcm9+Wu73/u5NcBqmeqIwK3dPCgLoXA1mteEvUzJw=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=eBaS82YBppXqeg1niKLy00hpwRhLW03aJ6WxUs57mtcAgg3syYDFQ1CiY25BrUhf+Y6axO0wHlGezFS0XiocZqEH/gsyE7Pck4G71LBbe7oVTkycyh3HNR/JvPZ6Gmw2ZjzFAaVRAaxdDB76mG8hWBrv2pQ6BM+RL5G+ypQ7N6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L5SwUw0L; 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="L5SwUw0L" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5CD77C32782; Fri, 23 Aug 2024 00:13:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724371986; bh=aAdcm9+Wu73/u5NcBqmeqIwK3dPCgLoXA1mteEvUzJw=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=L5SwUw0L9uqQKEQ7C0veuI/DjiMHIKRqFFgvVh70tyMnLuA5Xgg17FmcsVxzrPziR eIynUsfr+Mrw1awLzfY7HY9jw6efy9QJWBegoIuYx60Do2UMCdI6CVVnpomJIFakgx CdZW5zLLNTeMchvGiD3nCPuRRH/9XSyPzIpheH1rZz5VBN8mCEQrdbQilb88iXlxW0 3dUv6EGbnhbeQ4dHfQqlsu1HuZPJGK2gFme7I22pO3Ku6jVhiSrtlswqCUszRffzPV 0e6WP8Vceqr4zbPIkIg+KfPBsqR/gAwOBR4Z5JZb8v9GlJ6pJeRBr6FKF8OUmr52sC +Robk4jW8Hq5A== Date: Thu, 22 Aug 2024 17:13:05 -0700 Subject: [PATCH 04/10] xfs: don't scan off the end of the rt volume in xfs_rtallocate_extent_block From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086686.59070.3726598549775443534.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 The loop conditional here is not quite correct because an rtbitmap block can represent rtextents beyond the end of the rt volume. There's no way that it makes sense to scan for free space beyond EOFS, so don't do it. This overrun has been present since v2.6.0. Also fix the type of bestlen, which was incorrectly converted. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 3d78dc0940190..7e45e1c74c027 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -231,22 +231,20 @@ xfs_rtallocate_extent_block( xfs_rtxnum_t *rtx) /* out: start rtext allocated */ { struct xfs_mount *mp = args->mp; - xfs_rtxnum_t besti; /* best rtext found so far */ - xfs_rtxnum_t bestlen;/* best length found so far */ + xfs_rtxnum_t besti = -1; /* best rtext found so far */ xfs_rtxnum_t end; /* last rtext in chunk */ - int error; xfs_rtxnum_t i; /* current rtext trying */ xfs_rtxnum_t next; /* next rtext to try */ + xfs_rtxlen_t bestlen = 0; /* best length found so far */ int stat; /* status from internal calls */ + int error; /* - * Loop over all the extents starting in this bitmap block, - * looking for one that's long enough. + * Loop over all the extents starting in this bitmap block up to the + * end of the rt volume, looking for one that's long enough. */ - for (i = xfs_rbmblock_to_rtx(mp, bbno), besti = -1, bestlen = 0, - end = xfs_rbmblock_to_rtx(mp, bbno + 1) - 1; - i <= end; - i++) { + end = min(mp->m_sb.sb_rextents, xfs_rbmblock_to_rtx(mp, bbno + 1)) - 1; + for (i = xfs_rbmblock_to_rtx(mp, bbno); i <= end; i++) { /* Make sure we don't scan off the end of the rt volume. */ maxlen = xfs_rtallocate_clamp_len(mp, i, maxlen, prod); From patchwork Fri Aug 23 00:13:21 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: 13774408 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 5E8D0620 for ; Fri, 23 Aug 2024 00:13:22 +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=1724372002; cv=none; b=dSRmsTEEtRa8dK1aFkNOYxxXpGvLGmAJIgHqLtDkfUe0tmE58DLRrIggShf/uUJ9EJ0ImbWopX2oazmufly3NzCGRy/hgECd6l4A/UopYmI6fF9L98/vS1KbJNwoHMwNYW5vx6gCUmFpx/cXcNgftX+aAYPRVL5bk722RwzIkCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372002; c=relaxed/simple; bh=R/CbXvZiPxXm7EUKkHTnQ4645IJ2vIpsy39qfAEwmmk=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oLcrXiUsC3kchbAy6I4gZqepFphVLa1CzGnxSLZdcmbEHtW2miQANAV1AGmWXmlq9SoeIXEPraKg+15kAK8npRTNNIuvzYpez0IVpv57DNU7cAeQJHzY/7ohXkf7qBFrehygL6ijP10cgM5QPNJWpvSmnZxcNpdq8fjI43yp/zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SP2wrvwf; 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="SP2wrvwf" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6EC9C4AF0B; Fri, 23 Aug 2024 00:13:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372002; bh=R/CbXvZiPxXm7EUKkHTnQ4645IJ2vIpsy39qfAEwmmk=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=SP2wrvwf+4yfhA1PCx/hydLn0CfwNY8BT5ywmm5y8glMO/AavL/4iwMDm3PzMjMUO pwX5jDGlpG1SA5AkBPdfNItLxQ++dLWTAyJgXkqv0uD9SCVG5LJk+OxHm9DVgPpSIW WA3Efx3OWq7M1KKbKPeAFQueXmBqgqq8TcN12fOkfsC/UlUpcTRbUKMnTxEQsgHwq5 3TwJmr9/QEXPATfl+b/ojV3JGZZtYH8yLrd1imsnE/as3/JD7Hu/SJo6wxoTWI+mK1 rFeNyRcoK9EZXigeCwQPXAM+5hvilVt5masIJ9nYaHQKdCE+4awJk/vEAkrP63xwRm oz1j2GlA6XPqg== Date: Thu, 22 Aug 2024 17:13:21 -0700 Subject: [PATCH 05/10] xfs: refactor aligning bestlen to prod From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086703.59070.1862088410279807687.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 There are two places in xfs_rtalloc.c where we want to make sure that a count of rt extents is aligned with a particular prod(uct) factor. In one spot, we actually use rounddown(), albeit unnecessarily if prod < 2. In the other case, we open-code this rounding inefficiently by promoting the 32-bit length value to a 64-bit value and then performing a 64-bit division to figure out the subtraction. Refactor this into a single helper that uses the correct types and division method for the type, and skips the division entirely unless prod is large enough to make a difference. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 7e45e1c74c027..54f34d7d4c199 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -196,6 +196,17 @@ xfs_rtallocate_range( return xfs_rtmodify_range(args, start, len, 0); } +/* Reduce @rtxlen until it is a multiple of @prod. */ +static inline xfs_rtxlen_t +xfs_rtalloc_align_len( + xfs_rtxlen_t rtxlen, + xfs_rtxlen_t prod) +{ + if (unlikely(prod > 1)) + return rounddown(rtxlen, prod); + return rtxlen; +} + /* * Make sure we don't run off the end of the rt volume. Be careful that * adjusting maxlen downwards doesn't cause us to fail the alignment checks. @@ -210,7 +221,7 @@ xfs_rtallocate_clamp_len( xfs_rtxlen_t ret; ret = min(mp->m_sb.sb_rextents, startrtx + rtxlen) - startrtx; - return rounddown(ret, prod); + return xfs_rtalloc_align_len(ret, prod); } /* @@ -294,17 +305,10 @@ xfs_rtallocate_extent_block( goto nospace; /* - * If size should be a multiple of prod, make that so. + * Ensure bestlen is a multiple of prod, but don't return a too-short + * extent. */ - if (prod > 1) { - xfs_rtxlen_t p; /* amount to trim length by */ - - div_u64_rem(bestlen, prod, &p); - if (p) - bestlen -= p; - } - - /* Don't return a too-short extent. */ + bestlen = xfs_rtalloc_align_len(bestlen, prod); if (bestlen < minlen) goto nospace; From patchwork Fri Aug 23 00:13:37 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: 13774409 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 E8B03812 for ; Fri, 23 Aug 2024 00:13: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=1724372018; cv=none; b=q09NeozQ/TPIk17Unn/Que4vTf9UwxJnRJc5H0COJcTyRStGLuCwVYYp0Cw4SwGpIWtn3S7sdtr6VAT6GX7PjIQXqfn5JkomjJEOq3uVWdYH2IlUZbWbYHifX0cbjMIv1GI4rxXW8Xwr3ddzi1CQfJ9gIgOXCsVRl46DTWi2DHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372018; c=relaxed/simple; bh=BWeFzsCTGc6Yr05pHWZBS5axnuPXXYXuYOrkwQ5iRa8=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oTxJFYjGzVdFHrh1I/lIOTu+AKZagVvHvFSKawsn0GhixMco/WytsC6FXU87RuwSrPLauJropgDWqqr3iDlhLFwGGkxP1efeydJW5Zp2hkm3wbgxGUaR2hoJvxMhAGhcpCCn6KP4p9OrdIo7gePhZz/eYkoic1KgbI1teFvUAfE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HeKmVi1s; 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="HeKmVi1s" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 818BEC32782; Fri, 23 Aug 2024 00:13:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372017; bh=BWeFzsCTGc6Yr05pHWZBS5axnuPXXYXuYOrkwQ5iRa8=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=HeKmVi1s/P123oHOFT3eZoYkC8KTlRSUaZ8B/bj6/L+8nnh5KZkYNpgZ2zAX8F4TD v82h29f9piOlnnajtVCejy/B6qhCm4HzMZTWJI8dNM/VorqxV2w8A4gFSC/0ukqTLV 5tsseB1MG3THSHj7w4i1zaChczs/Fu6zV3k0F2a2DXLQdzKm4cLPDfJegRnV3rOvGh sdnbAnKDawNVBlowZ/H5AU2O0uXqWAV0LYYKdShn4Ti9kB7XvDxtNH3tX4NISQJMhG NOgdCMD1G+7b9jxHaBclmQzME80XuFp5TfJKMyEKPzQ/smnVfoe30EitkZ0wDXbMDO vhS7cqt03OmTA== Date: Thu, 22 Aug 2024 17:13:37 -0700 Subject: [PATCH 06/10] xfs: clean up xfs_rtallocate_extent_exact a bit From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086720.59070.4961232634716192853.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 Before we start doing more surgery on the rt allocator, let's clean up the exact allocator so that it doesn't change its arguments and uses the helper introduced in the previous patch. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 54f34d7d4c199..2fe3f6563cad3 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -340,10 +340,10 @@ xfs_rtallocate_extent_exact( xfs_rtxlen_t prod, /* extent product factor */ xfs_rtxnum_t *rtx) /* out: start rtext allocated */ { - int error; - xfs_rtxlen_t i; /* extent length trimmed due to prod */ - int isfree; /* extent is free */ xfs_rtxnum_t next; /* next rtext to try (dummy) */ + xfs_rtxlen_t alloclen; /* candidate length */ + int isfree; /* extent is free */ + int error; ASSERT(minlen % prod == 0); ASSERT(maxlen % prod == 0); @@ -354,25 +354,26 @@ xfs_rtallocate_extent_exact( if (error) return error; - if (!isfree) { - /* - * If not, allocate what there is, if it's at least minlen. - */ - maxlen = next - start; - if (maxlen < minlen) - return -ENOSPC; - - /* - * Trim off tail of extent, if prod is specified. - */ - if (prod > 1 && (i = maxlen % prod)) { - maxlen -= i; - if (maxlen < minlen) - return -ENOSPC; - } + if (isfree) { + /* start to maxlen is all free; allocate it. */ + *len = maxlen; + *rtx = start; + return 0; } - *len = maxlen; + /* + * If not, allocate what there is, if it's at least minlen. + */ + alloclen = next - start; + if (alloclen < minlen) + return -ENOSPC; + + /* Ensure alloclen is a multiple of prod. */ + alloclen = xfs_rtalloc_align_len(alloclen, prod); + if (alloclen < minlen) + return -ENOSPC; + + *len = alloclen; *rtx = start; return 0; } From patchwork Fri Aug 23 00:13: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: 13774410 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 9734663A for ; Fri, 23 Aug 2024 00:13:53 +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=1724372033; cv=none; b=mFdoQCcjy4MXL1arKHrfl9h6ERjsqJ4kp9QrTkMPDnIPuBYvFmIi0A+V3BBMRacPkZ87dInjpxSWJRFZ6o8m4/Rr1VKIrS5qQJO+dUTKsZHx4aKUve9JWUNjRvUJdIM0jBhqrfzay+7EpE1eeYJXIHyz4eJUSQOgkwtKIaFhhyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372033; c=relaxed/simple; bh=hf7YTmm1L/5WejtdKUeJDGMKQ0Q89I0WvFov5ZHf1eY=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ULqmy1MSEYdnGonags19HwDHOm1e+RXpLpRmqvz6G0cVSk7CDd9OHA0PjnpJ4C7esYm37ve7+bc6Jie/8nPzG1BukmMohZI+ZQRlBAI2VGamqhBnJX1e/Ewns97MZtzo/fbZTItD/rXgAOujPwS/USXn/9QCRiadmTjSopYF4YE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TS6Db7zX; 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="TS6Db7zX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1E70BC32782; Fri, 23 Aug 2024 00:13:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372033; bh=hf7YTmm1L/5WejtdKUeJDGMKQ0Q89I0WvFov5ZHf1eY=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=TS6Db7zXPqz+nd6Y2I4CHzEhmLK1NFsJpnaC0m5f61siQ/ZK3sGhPuGHAOA0RKGP1 cgOGVti1zsnI4dixTZIiSxv16x0ZU53wMnXX1fsh4D5lMmVuwhLduAUoek4DMh8L2a jJUC5T+l2yAcL/rUB1X94807kgX6gNj+8cW2U+kPE3PXUvrfCLSfsmARoe2Kw7BdC/ ouvGndukk3ds70FIW9JNukrChfcg9HhoGQ/tLGLIhsvrIYqg1+3S6/bpDUV0/kh35b KgUyT8il7B8DggTjHql/9KDel2SJzK92jdwjmgbPBO9oNqD9cfPSeHNRBv7+qj/h8I RoBVtnBpGXSGw== Date: Thu, 22 Aug 2024 17:13:52 -0700 Subject: [PATCH 07/10] xfs: reduce excessive clamping of maxlen in xfs_rtallocate_extent_near From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086737.59070.10832733339991521324.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 The near rt allocator employs two allocation strategies -- first it tries to allocate at exactly @start. If that fails, it will pivot back and forth around that starting point looking for an appropriately sized free space. However, I clamped maxlen ages ago to prevent the exact allocation scan from running off the end of the rt volume. This, I realize, was excessive. If the allocation request is (say) for 32 rtx but the start position is 5 rtx from the end of the volume, we clamp maxlen to 5. If the exact allocation fails, we then pivot back and forth looking for 5 rtx, even though the original intent was to try to get 32 rtx. If we then find 5 rtx when we could have gotten 32 rtx, we've not done as well as we could have. This may be moot if the caller immediately comes back for more space, but it might not be. Either way, we can do better here. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 2fe3f6563cad3..3dafe37f01f64 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -340,23 +340,29 @@ xfs_rtallocate_extent_exact( xfs_rtxlen_t prod, /* extent product factor */ xfs_rtxnum_t *rtx) /* out: start rtext allocated */ { + struct xfs_mount *mp = args->mp; xfs_rtxnum_t next; /* next rtext to try (dummy) */ xfs_rtxlen_t alloclen; /* candidate length */ + xfs_rtxlen_t scanlen; /* number of free rtx to look for */ int isfree; /* extent is free */ int error; ASSERT(minlen % prod == 0); ASSERT(maxlen % prod == 0); - /* - * Check if the range in question (for maxlen) is free. - */ - error = xfs_rtcheck_range(args, start, maxlen, 1, &next, &isfree); + + /* Make sure we don't run off the end of the rt volume. */ + scanlen = xfs_rtallocate_clamp_len(mp, start, maxlen, prod); + if (scanlen < minlen) + return -ENOSPC; + + /* Check if the range in question (for scanlen) is free. */ + error = xfs_rtcheck_range(args, start, scanlen, 1, &next, &isfree); if (error) return error; if (isfree) { - /* start to maxlen is all free; allocate it. */ - *len = maxlen; + /* start to scanlen is all free; allocate it. */ + *len = scanlen; *rtx = start; return 0; } @@ -412,11 +418,6 @@ xfs_rtallocate_extent_near( if (start >= mp->m_sb.sb_rextents) start = mp->m_sb.sb_rextents - 1; - /* Make sure we don't run off the end of the rt volume. */ - maxlen = xfs_rtallocate_clamp_len(mp, start, maxlen, prod); - if (maxlen < minlen) - return -ENOSPC; - /* * Try the exact allocation first. */ From patchwork Fri Aug 23 00:14:08 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: 13774411 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 CBC8615BB for ; Fri, 23 Aug 2024 00:14: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=1724372048; cv=none; b=kld6xHjpV6dPGTmuPMCJu6fwiVt/bBDo6F+zlTpNVqtQso37MB0HQojFBkbfGJ+b0zViJ7FHJegmk3iigB7jY6tUnugBQAbb4kMUGV8wTsMWEU6hdrY2tlLyFDs4htgmnrqgDsTsxGzFIsRO9dHUKr0YMOzlwAVNLiYhSAjCHZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372048; c=relaxed/simple; bh=+x4z1G+4tOi+7Abo/E4zpmt+4FM/QmLqipzg1qO00Z8=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tDyZAl21xNCgBj8BGPNhSJIMsEykIbfu9+Hjr9kTpKHFbgN9BLeOl9Sn0TDB7Oo6Lw1O17kG3tarfoL2MHco5eEOWe8U4P7dVIcP/e964J23Xvjh4O/cIr74DY3SAp794OFcG7AlHjIcyT3yH8Z4XJLs+XI2Q5MaZ+CG0RjuZzk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aMTf3Iy8; 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="aMTf3Iy8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7FDDC4AF09; Fri, 23 Aug 2024 00:14:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372048; bh=+x4z1G+4tOi+7Abo/E4zpmt+4FM/QmLqipzg1qO00Z8=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=aMTf3Iy8F1wBiNQTbk/igmlSDdi4HDL12U7ZjCNu+ZZx4LSDbosq3RIV9vuvtNtEZ EQBSIgLJvmsO0xviwf61NoaieKBqGs1kH7utG7n8Ts8HRLyc7VuBZ9h0lZxLf3VF+2 fenxt+FOB9EeWOljCtJDE6DN6VRnR5lBOwgGUvxGvkJHwNmLc4YmG5tYFb7wPLOHS7 jAJDUgwKpQOAuIRLQ0rf42EsQdyXRPUwjEyAR1c6OZkWPPz0qHGB47ffHvgxPpktdE STKBJIND8haN9+0tjrQetuuOuhObT4g36hoFeYmFQBi7ovLF8UUH0Aoc6jik2za8tW w00oToldqRq+w== Date: Thu, 22 Aug 2024 17:14:08 -0700 Subject: [PATCH 08/10] xfs: fix broken variable-sized allocation detection in xfs_rtallocate_extent_block From: "Darrick J. Wong" To: djwong@kernel.org Cc: hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086754.59070.15167835843175811059.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 This function tries to find a suitable free space extent starting from a particular rtbitmap block. Some time ago, I added a clamping function to prevent the free space scans from running off the end of the bitmap, but I didn't quite get the logic right. Let's say there's an allocation request with a minlen of 5 and a maxlen of 32 and we're scanning the last rtbitmap block. If we come within 4 rtx of the end of the rt volume, maxlen will get clamped to 4. If the next 3 rtx are free, we could have satisfied the allocation, but the code setting partial besti/bestlen for "minlen < maxlen" will think that we're doing a non-variable allocation and ignore it. The root of this problem is overwriting maxlen; I should have stuffed the results in a different variable, which would not have introduced this bug. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_rtalloc.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 3dafe37f01f64..4e7db8d4c0827 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -246,6 +246,7 @@ xfs_rtallocate_extent_block( xfs_rtxnum_t end; /* last rtext in chunk */ xfs_rtxnum_t i; /* current rtext trying */ xfs_rtxnum_t next; /* next rtext to try */ + xfs_rtxlen_t scanlen; /* number of free rtx to look for */ xfs_rtxlen_t bestlen = 0; /* best length found so far */ int stat; /* status from internal calls */ int error; @@ -257,20 +258,22 @@ xfs_rtallocate_extent_block( end = min(mp->m_sb.sb_rextents, xfs_rbmblock_to_rtx(mp, bbno + 1)) - 1; for (i = xfs_rbmblock_to_rtx(mp, bbno); i <= end; i++) { /* Make sure we don't scan off the end of the rt volume. */ - maxlen = xfs_rtallocate_clamp_len(mp, i, maxlen, prod); + scanlen = xfs_rtallocate_clamp_len(mp, i, maxlen, prod); + if (scanlen < minlen) + break; /* - * See if there's a free extent of maxlen starting at i. + * See if there's a free extent of scanlen starting at i. * If it's not so then next will contain the first non-free. */ - error = xfs_rtcheck_range(args, i, maxlen, 1, &next, &stat); + error = xfs_rtcheck_range(args, i, scanlen, 1, &next, &stat); if (error) return error; if (stat) { /* - * i for maxlen is all free, allocate and return that. + * i to scanlen is all free, allocate and return that. */ - *len = maxlen; + *len = scanlen; *rtx = i; return 0; } @@ -301,7 +304,7 @@ xfs_rtallocate_extent_block( } /* Searched the whole thing & didn't find a maxlen free extent. */ - if (minlen > maxlen || besti == -1) + if (besti == -1) goto nospace; /* From patchwork Fri Aug 23 00:14: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: 13774412 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 7AD131879 for ; Fri, 23 Aug 2024 00:14:24 +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=1724372064; cv=none; b=gF9I+rxRzrJOfSeQGRRREIGM6jlo6KzUB6+7TRhGcpXKWeaX6Jwgr9kgFkfOgqApUslbOXObARgf3FhnFUkxbaDLh/U6GT85Y6eismOFOEKhDFRxxzxs5ozccmm74gka/1ZZSKAgvBBBrs89xnhByhzyNKxb+z2zb8f4AvVEXrk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372064; c=relaxed/simple; bh=PXUTngCIRTtOGjIlN6V2CGb4EaMDM5IAG5rhlhov/eE=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P3o56ksrZJDpNgqzdVoN4IXugbbMWA5N9pC8qGh2LL+JBcG7NDr0Y00eoBo97L0i87a2MSgrZ1icEsuSTe7vFdEXHSvpey40G2yxP8UvWtaRekfANqCV2rTE3gfj2LViEf1Eg8+ttD3J0A1e9+UJ3lVBWjqirZNnyaKSMOsOyWA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lezjBINs; 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="lezjBINs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 51808C32782; Fri, 23 Aug 2024 00:14:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372064; bh=PXUTngCIRTtOGjIlN6V2CGb4EaMDM5IAG5rhlhov/eE=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=lezjBINsN3Tsg6zLKYwqYsT9oqteIGW7BWWGweio9CJ32uztnFXsNw3dBNtr7qlsM MBBFwp8QMhjtuEkir9lIC/z5drA0uTnyWFamM8sIdNT+QCf8yxofcUsVXB96QYcXDz 14gmOhOlhOsVQLDGmw5h6VaZ8xrglWlDqE+AM2gWDITOOSg059Pq7J6xGqPwxw3Gc7 XWhtVxq1kvDf0vOf/YD+2hO7+skA0GKdlKj+sZmiX3sta6ijcB27hr9mxl1h5kZdFI KRTWdPaV2qoEa9unWWSyhmD4Mh8jW0TlQGo1Pge/hGAh4lac2qmaNO3z+BBVWLywi9 YWlqAd8AbjkYQ== Date: Thu, 22 Aug 2024 17:14:23 -0700 Subject: [PATCH 09/10] xfs: remove xfs_rtb_to_rtxrem From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086771.59070.6691827026656065031.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 Simplify the number of block number conversion helpers by removing xfs_rtb_to_rtxrem. Any recent compiler is smart enough to eliminate the double divisions if using separate xfs_rtb_to_rtx and xfs_rtb_to_rtxoff calls. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rtbitmap.c | 9 ++++----- fs/xfs/libxfs/xfs_rtbitmap.h | 18 ------------------ 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index d7c731aeee12d..431ef62939caa 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1022,25 +1022,24 @@ xfs_rtfree_blocks( xfs_filblks_t rtlen) { struct xfs_mount *mp = tp->t_mountp; - xfs_rtxnum_t start; - xfs_filblks_t len; xfs_extlen_t mod; ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN); - len = xfs_rtb_to_rtxrem(mp, rtlen, &mod); + mod = xfs_rtb_to_rtxoff(mp, rtlen); if (mod) { ASSERT(mod == 0); return -EIO; } - start = xfs_rtb_to_rtxrem(mp, rtbno, &mod); + mod = xfs_rtb_to_rtxoff(mp, rtbno); if (mod) { ASSERT(mod == 0); return -EIO; } - return xfs_rtfree_extent(tp, start, len); + return xfs_rtfree_extent(tp, xfs_rtb_to_rtx(mp, rtbno), + xfs_rtb_to_rtx(mp, rtlen)); } /* Find all the free records within a given range. */ diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h index 523d3d3c12c60..69ddacd4b01e6 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.h +++ b/fs/xfs/libxfs/xfs_rtbitmap.h @@ -86,24 +86,6 @@ xfs_rtb_to_rtxoff( return do_div(rtbno, mp->m_sb.sb_rextsize); } -/* - * Crack an rt block number into an rt extent number and an offset within that - * rt extent. Returns the rt extent number directly and the offset in @off. - */ -static inline xfs_rtxnum_t -xfs_rtb_to_rtxrem( - struct xfs_mount *mp, - xfs_rtblock_t rtbno, - xfs_extlen_t *off) -{ - if (likely(mp->m_rtxblklog >= 0)) { - *off = rtbno & mp->m_rtxblkmask; - return rtbno >> mp->m_rtxblklog; - } - - return div_u64_rem(rtbno, mp->m_sb.sb_rextsize, off); -} - /* * Convert an rt block number into an rt extent number, rounding up to the next * rt extent if the rt block is not aligned to an rt extent boundary. From patchwork Fri Aug 23 00:14:39 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: 13774413 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 0D5374A02 for ; Fri, 23 Aug 2024 00:14:40 +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=1724372080; cv=none; b=a9xu94sy/PTtR6NY64kVzTfqv9MU1N+laxYA//oqH9nZIZvi5yCYZowllOMzYnS18Wb3XfJBnifkPmPqhRHXJr1NLD7Y28ZE1kXtdG0leZKcv+87IfH5ztxNgWene5GO/VrugwrJnuMyKOB94jC1/9bh+0X+32FhPwYX/MRBy60= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724372080; c=relaxed/simple; bh=OnwU5reumCw9sk2dnYJQK3hTGXFqXFWBTHFwttFX4Tw=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lab2szPNXNNluuTmvaoihxD3LV2drZu+E+eKS2KE0XxwFDWAY5gbO53xc4RhMlvYNdZUkFrNPM24SF8oTx4ljLik+GEyhcR6R2qQKEjZ7uM/yFDbT5OK3yMTYiE8g02nCbtrPg1sGxvc2OKyeUZjKY1mhDbE461RzS3m6758Gws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DweApmSK; 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="DweApmSK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE443C4AF0B; Fri, 23 Aug 2024 00:14:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1724372079; bh=OnwU5reumCw9sk2dnYJQK3hTGXFqXFWBTHFwttFX4Tw=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=DweApmSKz4zfevsoD8qZDPd8kMhYcr5y6/uJxZsU6bgN4PIBL+pd2TTtwnlZMlN+P 7kU5umIX/w3i8TZKrhBF870A0CuZMh5qFCDzgBtizeYZjirpa3TOpqnHeWUMSEbnVP SDfa1FJE1ikETw2IlhmWao5vjnaCOdoYqKP1rBZKj7dQ839/fDsmvVn+J/WAXl+3HH CMZKP/mPNZH1XK5XiGM56q+xSW3fB0ep9idGOoP/vYcUt5v+dusF7FXX7xhcRCi1SB YbMHtZaQ8P0OFZLh+hoamSBpH+Vq/FnP2ZXLu43uH8CwcAKYkGtGa6bsi36CN8+nD0 vINMKdiG5WA2g== Date: Thu, 22 Aug 2024 17:14:39 -0700 Subject: [PATCH 10/10] xfs: simplify xfs_rtalloc_query_range From: "Darrick J. Wong" To: djwong@kernel.org Cc: Christoph Hellwig , hch@lst.de, linux-xfs@vger.kernel.org Message-ID: <172437086789.59070.5109124547219329958.stgit@frogsfrogsfrogs> In-Reply-To: <172437086590.59070.9398644715198875909.stgit@frogsfrogsfrogs> References: <172437086590.59070.9398644715198875909.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 There isn't much of a good reason to pass the xfs_rtalloc_rec structures that describe extents to xfs_rtalloc_query_range as we really just want a lower and upper bound xfs_rtxnum_t. Pass the rtxnum directly and simply the interface. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rtbitmap.c | 42 +++++++++++++++++------------------------- fs/xfs/libxfs/xfs_rtbitmap.h | 3 +-- fs/xfs/xfs_discard.c | 15 +++++++-------- fs/xfs/xfs_fsmap.c | 11 +++++------ 4 files changed, 30 insertions(+), 41 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 431ef62939caa..c58eb75ef0fa0 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1047,8 +1047,8 @@ int xfs_rtalloc_query_range( struct xfs_mount *mp, struct xfs_trans *tp, - const struct xfs_rtalloc_rec *low_rec, - const struct xfs_rtalloc_rec *high_rec, + xfs_rtxnum_t start, + xfs_rtxnum_t end, xfs_rtalloc_query_range_fn fn, void *priv) { @@ -1056,45 +1056,42 @@ xfs_rtalloc_query_range( .mp = mp, .tp = tp, }; - struct xfs_rtalloc_rec rec; - xfs_rtxnum_t rtstart; - xfs_rtxnum_t rtend; - xfs_rtxnum_t high_key; - int is_free; int error = 0; - if (low_rec->ar_startext > high_rec->ar_startext) + if (start > end) return -EINVAL; - if (low_rec->ar_startext >= mp->m_sb.sb_rextents || - low_rec->ar_startext == high_rec->ar_startext) + if (start == end || start >= mp->m_sb.sb_rextents) return 0; - high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1); + end = min(end, mp->m_sb.sb_rextents - 1); /* Iterate the bitmap, looking for discrepancies. */ - rtstart = low_rec->ar_startext; - while (rtstart <= high_key) { + while (start <= end) { + struct xfs_rtalloc_rec rec; + int is_free; + xfs_rtxnum_t rtend; + /* Is the first block free? */ - error = xfs_rtcheck_range(&args, rtstart, 1, 1, &rtend, + error = xfs_rtcheck_range(&args, start, 1, 1, &rtend, &is_free); if (error) break; /* How long does the extent go for? */ - error = xfs_rtfind_forw(&args, rtstart, high_key, &rtend); + error = xfs_rtfind_forw(&args, start, end, &rtend); if (error) break; if (is_free) { - rec.ar_startext = rtstart; - rec.ar_extcount = rtend - rtstart + 1; + rec.ar_startext = start; + rec.ar_extcount = rtend - start + 1; error = fn(mp, tp, &rec, priv); if (error) break; } - rtstart = rtend + 1; + start = rtend + 1; } xfs_rtbuf_cache_relse(&args); @@ -1109,13 +1106,8 @@ xfs_rtalloc_query_all( xfs_rtalloc_query_range_fn fn, void *priv) { - struct xfs_rtalloc_rec keys[2]; - - keys[0].ar_startext = 0; - keys[1].ar_startext = mp->m_sb.sb_rextents - 1; - keys[0].ar_extcount = keys[1].ar_extcount = 0; - - return xfs_rtalloc_query_range(mp, tp, &keys[0], &keys[1], fn, priv); + return xfs_rtalloc_query_range(mp, tp, 0, mp->m_sb.sb_rextents - 1, fn, + priv); } /* Is the given extent all free? */ diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h index 69ddacd4b01e6..0dbc9bb40668a 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.h +++ b/fs/xfs/libxfs/xfs_rtbitmap.h @@ -292,8 +292,7 @@ int xfs_rtmodify_summary(struct xfs_rtalloc_args *args, int log, int xfs_rtfree_range(struct xfs_rtalloc_args *args, xfs_rtxnum_t start, xfs_rtxlen_t len); int xfs_rtalloc_query_range(struct xfs_mount *mp, struct xfs_trans *tp, - const struct xfs_rtalloc_rec *low_rec, - const struct xfs_rtalloc_rec *high_rec, + xfs_rtxnum_t start, xfs_rtxnum_t end, xfs_rtalloc_query_range_fn fn, void *priv); int xfs_rtalloc_query_all(struct xfs_mount *mp, struct xfs_trans *tp, xfs_rtalloc_query_range_fn fn, diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 25f5dffeab2ae..bf1e3f330018d 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -554,11 +554,10 @@ xfs_trim_rtdev_extents( xfs_daddr_t end, xfs_daddr_t minlen) { - struct xfs_rtalloc_rec low = { }; - struct xfs_rtalloc_rec high = { }; struct xfs_trim_rtdev tr = { .minlen_fsb = XFS_BB_TO_FSB(mp, minlen), }; + xfs_rtxnum_t low, high; struct xfs_trans *tp; xfs_daddr_t rtdev_daddr; int error; @@ -584,17 +583,17 @@ xfs_trim_rtdev_extents( XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks) - 1); /* Convert the rt blocks to rt extents */ - low.ar_startext = xfs_rtb_to_rtxup(mp, XFS_BB_TO_FSB(mp, start)); - high.ar_startext = xfs_rtb_to_rtx(mp, XFS_BB_TO_FSBT(mp, end)); + low = xfs_rtb_to_rtxup(mp, XFS_BB_TO_FSB(mp, start)); + high = xfs_rtb_to_rtx(mp, XFS_BB_TO_FSBT(mp, end)); /* * Walk the free ranges between low and high. The query_range function * trims the extents returned. */ do { - tr.stop_rtx = low.ar_startext + (mp->m_sb.sb_blocksize * NBBY); + tr.stop_rtx = low + (mp->m_sb.sb_blocksize * NBBY); xfs_rtbitmap_lock_shared(mp, XFS_RBMLOCK_BITMAP); - error = xfs_rtalloc_query_range(mp, tp, &low, &high, + error = xfs_rtalloc_query_range(mp, tp, low, high, xfs_trim_gather_rtextent, &tr); if (error == -ECANCELED) @@ -615,8 +614,8 @@ xfs_trim_rtdev_extents( if (error) break; - low.ar_startext = tr.restart_rtx; - } while (!xfs_trim_should_stop() && low.ar_startext <= high.ar_startext); + low = tr.restart_rtx; + } while (!xfs_trim_should_stop() && low <= high); xfs_trans_cancel(tp); return error; diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index 71f32354944e4..e154466268757 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -520,11 +520,11 @@ xfs_getfsmap_rtdev_rtbitmap( struct xfs_getfsmap_info *info) { - struct xfs_rtalloc_rec alow = { 0 }; struct xfs_rtalloc_rec ahigh = { 0 }; struct xfs_mount *mp = tp->t_mountp; xfs_rtblock_t start_rtb; xfs_rtblock_t end_rtb; + xfs_rtxnum_t high; uint64_t eofs; int error; @@ -553,10 +553,9 @@ xfs_getfsmap_rtdev_rtbitmap( * Set up query parameters to return free rtextents covering the range * we want. */ - alow.ar_startext = xfs_rtb_to_rtx(mp, start_rtb); - ahigh.ar_startext = xfs_rtb_to_rtxup(mp, end_rtb); - error = xfs_rtalloc_query_range(mp, tp, &alow, &ahigh, - xfs_getfsmap_rtdev_rtbitmap_helper, info); + high = xfs_rtb_to_rtxup(mp, end_rtb); + error = xfs_rtalloc_query_range(mp, tp, xfs_rtb_to_rtx(mp, start_rtb), + high, xfs_getfsmap_rtdev_rtbitmap_helper, info); if (error) goto err; @@ -565,7 +564,7 @@ xfs_getfsmap_rtdev_rtbitmap( * rmap starting at the block after the end of the query range. */ info->last = true; - ahigh.ar_startext = min(mp->m_sb.sb_rextents, ahigh.ar_startext); + ahigh.ar_startext = min(mp->m_sb.sb_rextents, high); error = xfs_getfsmap_rtdev_rtbitmap_helper(mp, tp, &ahigh, info); if (error)