lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 021/201] xfs: fix maxlevels comparisons in the btree staging code
    Date
    From: "Darrick J. Wong" <djwong@kernel.org>

    [ Upstream commit 78e8ec83a404d63dcc86b251f42e4ee8aff27465 ]

    The btree geometry computation function has an off-by-one error in that
    it does not allow maximally tall btrees (nlevels == XFS_BTREE_MAXLEVELS).
    This can result in repairs failing unnecessarily on very fragmented
    filesystems. Subsequent patches to remove MAXLEVELS usage in favor of
    the per-btree type computations will make this a much more likely
    occurrence.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Leah Rumancik <leah.rumancik@gmail.com>
    Acked-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/xfs/libxfs/xfs_btree_staging.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/fs/xfs/libxfs/xfs_btree_staging.c
    +++ b/fs/xfs/libxfs/xfs_btree_staging.c
    @@ -662,7 +662,7 @@ xfs_btree_bload_compute_geometry(
    xfs_btree_bload_ensure_slack(cur, &bbl->node_slack, 1);

    bbl->nr_records = nr_this_level = nr_records;
    - for (cur->bc_nlevels = 1; cur->bc_nlevels < XFS_BTREE_MAXLEVELS;) {
    + for (cur->bc_nlevels = 1; cur->bc_nlevels <= XFS_BTREE_MAXLEVELS;) {
    uint64_t level_blocks;
    uint64_t dontcare64;
    unsigned int level = cur->bc_nlevels - 1;
    @@ -724,7 +724,7 @@ xfs_btree_bload_compute_geometry(
    nr_this_level = level_blocks;
    }

    - if (cur->bc_nlevels == XFS_BTREE_MAXLEVELS)
    + if (cur->bc_nlevels > XFS_BTREE_MAXLEVELS)
    return -EOVERFLOW;

    bbl->btree_height = cur->bc_nlevels;

    \
     
     \ /
      Last update: 2022-07-27 19:00    [W:4.234 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site