Commit Graph

157 Commits

Author SHA1 Message Date
Bill O'Donnell bcb09e9593 xfs: fold xfs_rtallocate_extent into xfs_bmap_rtalloc
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit e1ead237407a7f42957f6108a95cf093ce6c2c5d
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:37 2023 +0100

    xfs: fold xfs_rtallocate_extent into xfs_bmap_rtalloc

    There isn't really much left in xfs_rtallocate_extent now, fold it into
    the only caller.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:17 -06:00
Bill O'Donnell 459dc63f2a xfs: simplify and optimize the RT allocation fallback cascade
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit b6bb34588f4c95a56f23160bf3cadee74fa5480b
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:36 2023 +0100

    xfs: simplify and optimize the RT allocation fallback cascade

    There are currently multiple levels of fall back if an RT allocation
    can not be satisfied:

     1) xfs_rtallocate_extent extends the minlen and reduces the maxlen due
        to the extent size hint.  If that can't be done, it return -ENOSPC
        and let's xfs_bmap_rtalloc retry, which then not only drops the
        extent size hint based alignment, but also the minlen adjustment
     2) if xfs_rtallocate_extent gets -ENOSPC from the underlying functions,
        it only drops the extent size hint based alignment and retries
     3) if that still does not succeed, xfs_rtallocate_extent drops the
        extent size hint (which is a complex no-op at this point) and the
        minlen using the same code as (1) above
     4) if that still doesn't success and the caller wanted an allocation
        near a blkno, drop that blkno hint.

    The handling in 1 is rather inefficient as we could just drop the
    alignment and continue, and 2/3 interact in really weird ways due to
    the duplicate policy.

    Move aligning the min and maxlen out of xfs_rtallocate_extent and into
    a helper called directly by xfs_bmap_rtalloc.  This allows just
    continuing with the allocation if we have to drop the alignment instead
    of going through the retry loop and also dropping the perfectly usable
    minlen adjustment that didn't cause the problem, and then just use
    a single retry that drops both the minlen and alignment requirement
    when we really are out of space, thus consolidating cases (2) and (3)
    above.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:17 -06:00
Bill O'Donnell c4bf00be59 xfs: reorder the minlen and prod calculations in xfs_bmap_rtalloc
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 26e5eed7802299a666714ee511da58d906e8770c
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:35 2023 +0100

    xfs: reorder the minlen and prod calculations in xfs_bmap_rtalloc

    xfs_bmap_rtalloc is a bit of a mess in terms of calculating the locally
    need variables.  Reorder them a bit so that related code is located
    next to each other - the raminlen calculation moves up next to where
    the maximum len is calculated, and all the prod calculation is move
    into a single place and rearranged so that the real prod calculation
    only happens when it actually is needed.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:16 -06:00
Bill O'Donnell 2eecfe09bb xfs: remove XFS_RTMIN/XFS_RTMAX
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit a39f5ccc30d5a00b7e6d921aa387ad17d1e6d168
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:34 2023 +0100

    xfs: remove XFS_RTMIN/XFS_RTMAX

    Use the kernel min/max helpers instead.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:16 -06:00
Bill O'Donnell 9580a3cbc0 xfs: remove rt-wrappers from xfs_format.h
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 3abfe6c2759e2e3000b13f8ce8a1a325e80987a1
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:33 2023 +0100

    xfs: remove rt-wrappers from xfs_format.h

    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 <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:16 -06:00
Bill O'Donnell 53692d2e33 xfs: factor out a xfs_rtalloc_sumlevel helper
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 8ceee72fdb6f26fe924e02b3342353bac5efa42d
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:32 2023 +0100

    xfs: factor out a xfs_rtalloc_sumlevel helper

    xfs_rtallocate_extent_size has two loops with nearly identical logic
    in them.  Split that logic into a separate xfs_rtalloc_sumlevel helper.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:16 -06:00
Bill O'Donnell a22084c84e xfs: tidy up xfs_rtallocate_extent_exact
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 3c97c9f78d23c7e449fc9a0865b40f44748c3011
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:31 2023 +0100

    xfs: tidy up xfs_rtallocate_extent_exact

    Use common code for both xfs_rtallocate_range calls by moving
    the !isfree logic into the non-default branch.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:15 -06:00
Bill O'Donnell 9e5768238b xfs: merge the calls to xfs_rtallocate_range in xfs_rtallocate_block
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit d9498fa8c8580b9cedb764e475503706ba7a0fbf
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:30 2023 +0100

    xfs: merge the calls to xfs_rtallocate_range in xfs_rtallocate_block

    Use a goto to use a common tail for the case of being able to allocate
    an extent.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:15 -06:00
Bill O'Donnell 2cc298a077 xfs: reflow the tail end of xfs_rtallocate_extent_block
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 9ade45b08a685e121895228f344af1f8985adb2c
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:29 2023 +0100

    xfs: reflow the tail end of xfs_rtallocate_extent_block

    Change polarity of a check so that the successful case of being able to
    allocate an extent is in the main path of the function and error handling
    is on a branch.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:15 -06:00
Bill O'Donnell 5d6fee89b8 xfs: invert a check in xfs_rtallocate_extent_block
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit f3e509dd45c226aff268bab3695fded60e18f720
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:28 2023 +0100

    xfs: invert a check in xfs_rtallocate_extent_block

    Doing a break in the else side of a conditional is rather silly.  Invert
    the check, break ASAP and unindent the other leg.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:14 -06:00
Bill O'Donnell 4df97e9500 xfs: move xfs_rtget_summary to xfs_rtbitmap.c
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit c2adcfa31ff606264fab6e69129d6d45c9ddb7cb
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:26 2023 +0100

    xfs: move xfs_rtget_summary to xfs_rtbitmap.c

    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 <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:14 -06:00
Bill O'Donnell 908f8fb788 xfs: cleanup picking the start extent hint in xfs_bmap_rtalloc
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit a3e48f68b5f4bc83cdded35be2c4c3cc23eb9e19
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:25 2023 +0100

    xfs: cleanup picking the start extent hint in xfs_bmap_rtalloc

    Clean up the logical in xfs_bmap_rtalloc that tries to find a rtextent
    to start the search from by using a separate variable for the hint, not
    calling xfs_bmap_adjacent when we want to ignore the locality and avoid
    an extra roundtrip converting between block numbers and RT extent
    numbers.

    As a side-effect this doesn't pointlessly call xfs_rtpick_extent and
    increment the start rtextent hint if we are going to ignore the result
    anyway.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:14 -06:00
Bill O'Donnell 1ef5aa27a1 xfs: reflow the tail end of xfs_bmap_rtalloc
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit db8616e2765a184a3ac7c0d5c901c39f0d3b1570
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:23 2023 +0100

    xfs: reflow the tail end of xfs_bmap_rtalloc

    Reorder the tail end of xfs_bmap_rtalloc so that the successfully
    allocation is in the main path, and the error handling is on a branch.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:13 -06:00
Bill O'Donnell 4cdc347d10 xfs: return -ENOSPC from xfs_rtallocate_*
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit ce42b5d37527b282d38413c1b5f7283253f6562d
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:22 2023 +0100

    xfs: return -ENOSPC from xfs_rtallocate_*

    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 <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:13 -06:00
Bill O'Donnell fd1badcae4 xfs: move xfs_bmap_rtalloc to xfs_rtalloc.c
JIRA: https://issues.redhat.com/browse/RHEL-65728

Conflicts: context diffs

commit 152e21235727bbfe50ddc79a2d60f6bcf19d1640
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:21 2023 +0100

    xfs: move xfs_bmap_rtalloc to xfs_rtalloc.c

    xfs_bmap_rtalloc is currently in xfs_bmap_util.c, which is a somewhat
    odd spot for it, given that is only called from xfs_bmap.c and calls
    into xfs_rtalloc.c to do the actual work.  Move xfs_bmap_rtalloc to
    xfs_rtalloc.c and mark xfs_rtpick_extent xfs_rtallocate_extent and
    xfs_rtallocate_extent static now that they aren't called from outside
    of xfs_rtalloc.c.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:12 -06:00
Bill O'Donnell 8baa43f443 xfs: consider minlen sized extents in xfs_rtallocate_extent_block
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 944df75958807d56f2db9fdc769eb15dd9f0366a
Author: Christoph Hellwig <hch@lst.de>
Date:   Mon Dec 18 05:57:17 2023 +0100

    xfs: consider minlen sized extents in xfs_rtallocate_extent_block

    minlen is the lower bound on the extent length that the caller can
    accept, and maxlen is at this point the maximal available length.
    This means a minlen extent is perfectly fine to use, so do it.  This
    matches the equivalent logic in xfs_rtallocate_extent_exact that also
    accepts a minlen sized extent.

    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:11 -06:00
Bill O'Donnell 03a1f2fdb5 xfs: recompute growfsrtfree transaction reservation while growing rt volume
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 578bd4ce7100ae34f98c6b0147fe75cfa0dadbac
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Dec 11 10:41:51 2023 -0800

    xfs: recompute growfsrtfree transaction reservation while growing rt volume

    While playing with growfs to create a 20TB realtime section on a
    filesystem that didn't previously have an rt section, I noticed that
    growfs would occasionally shut down the log due to a transaction
    reservation overflow.

    xfs_calc_growrtfree_reservation uses the current size of the realtime
    summary file (m_rsumsize) to compute the transaction reservation for a
    growrtfree transaction.  The reservations are computed at mount time,
    which means that m_rsumsize is zero when growfs starts "freeing" the new
    realtime extents into the rt volume.  As a result, the transaction is
    undersized and fails.

    Fix this by recomputing the transaction reservations every time we
    change m_rsumsize.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:25:58 -06:00
Bill O'Donnell be34cb98e1 xfs: don't allow overly small or large realtime volumes
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit e14293803f4e84eb23a417b462b56251033b5a66
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Fri Dec 1 09:24:18 2023 -0800

    xfs: don't allow overly small or large realtime volumes

    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 <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:25:52 -06:00
Bill O'Donnell c9f7d1db2b xfs: make rextslog computation consistent with mkfs
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit a6a38f309afc4a7ede01242b603f36c433997780
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Fri Dec 1 09:17:40 2023 -0800

    xfs: make rextslog computation consistent with mkfs

    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: f8e566c0f5 ("xfs: validate the realtime geometry in xfs_validate_sb_common")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:25:52 -06:00
Bill O'Donnell 5343048fe4 xfs: don't look for end of extent further than necessary in xfs_rtallocate_extent_near()
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit e0f7422f54b092df7996f21da69824aea496490a
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:48:50 2023 -0700

    xfs: don't look for end of extent further than necessary in xfs_rtallocate_extent_near()

    As explained in the previous commit, xfs_rtallocate_extent_near() looks
    for the end of a free extent when searching backwards from the target
    bitmap block. Since the previous commit, it searches from the last
    bitmap block it checked to the bitmap block containing the start of the
    extent.

    This may still be more than necessary, since the free extent may not be
    that long. We know the maximum size of the free extent from the realtime
    summary. Use that to compute how many bitmap blocks we actually need to
    check.

    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:43 -06:00
Bill O'Donnell 577ca7173d xfs: don't try redundant allocations in xfs_rtallocate_extent_near()
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 85fa2c774397b98f5dc65a4ed6ab17c1a15db158
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:47:04 2023 -0700

    xfs: don't try redundant allocations in xfs_rtallocate_extent_near()

    xfs_rtallocate_extent_near() tries to find a free extent as close to a
    target bitmap block given by bbno as possible, which may be before or
    after bbno. Searching backwards has a complication: the realtime summary
    accounts for free space _starting_ in a bitmap block, but not straddling
    or ending in a bitmap block. So, when the negative search finds a free
    extent in the realtime summary, in order to end up closer to the target,
    it looks for the end of the free extent. For example, if bbno - 2 has a
    free extent, then it will check bbno - 1, then bbno - 2. But then if
    bbno - 3 has a free extent, it will check bbno - 1 again, then bbno - 2
    again, and then bbno - 3. This results in a quadratic loop, which is
    completely pointless since the repeated checks won't find anything new.

    Fix it by remembering where we last checked up to and continue from
    there. This also obviates the need for a check of the realtime summary.

    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:43 -06:00
Bill O'Donnell 91c50794af xfs: limit maxlen based on available space in xfs_rtallocate_extent_near()
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit ec5857bf07639a03d32b8ecb346df634925f8bc2
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:45:46 2023 -0700

    xfs: limit maxlen based on available space in xfs_rtallocate_extent_near()

    xfs_rtallocate_extent_near() calls xfs_rtallocate_extent_block() with
    the minlen and maxlen that were passed to it.
    xfs_rtallocate_extent_block() then scans the bitmap block looking for a
    free range of size maxlen. If there is none, it has to scan the whole
    bitmap block before returning the largest range of at least size minlen.
    For a fragmented realtime device and a large allocation request, it's
    almost certain that this will have to search the whole bitmap block,
    leading to high CPU usage.

    However, the realtime summary tells us the maximum size available in the
    bitmap block. We can limit the search in xfs_rtallocate_extent_block()
    to that size and often stop before scanning the whole bitmap block.

    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:42 -06:00
Bill O'Donnell 373ddb48cb xfs: return maximum free size from xfs_rtany_summary()
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 1b5d63963f9820b1c14883ee56b387586ff72aa0
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:43:42 2023 -0700

    xfs: return maximum free size from xfs_rtany_summary()

    Instead of only returning whether there is any free space, return the
    maximum size, which is fast thanks to the previous commit. This will be
    used by two upcoming optimizations.

    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:42 -06:00
Bill O'Donnell 7e5fff294b xfs: invert the realtime summary cache
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit e23aaf450de733044a74bc95528f728478b61c2a
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:41:55 2023 -0700

    xfs: invert the realtime summary cache

    In commit 355e353213 ("xfs: cache minimum realtime summary level"), I
    added a cache of the minimum level of the realtime summary that has any
    free extents. However, it turns out that the _maximum_ level is more
    useful for upcoming optimizations, and basically equivalent for the
    existing usage. So, let's change the meaning of the cache to be the
    maximum level + 1, or 0 if there are no free extents.

    For example, if the cache contains:

    {0, 4}

    then there are no free extents starting in realtime bitmap block 0, and
    there are no free extents larger than or equal to 2^4 blocks starting in
    realtime bitmap block 1. The cache is a loose upper bound, so there may
    or may not be free extents smaller than 2^4 blocks in realtime bitmap
    block 1.

    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:42 -06:00
Bill O'Donnell 874aa49368 xfs: cache last bitmap block in realtime allocator
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit e94b53ff699c2674a9ec083342a5254866210ade
Author: Omar Sandoval <osandov@fb.com>
Date:   Mon Oct 16 10:13:22 2023 -0700

    xfs: cache last bitmap block in realtime allocator

    Profiling a workload on a highly fragmented realtime device showed a ton
    of CPU cycles being spent in xfs_trans_read_buf() called by
    xfs_rtbuf_get(). Further tracing showed that much of that was repeated
    calls to xfs_rtbuf_get() for the same block of the realtime bitmap.
    These come from xfs_rtallocate_extent_block(): as it walks through
    ranges of free bits in the bitmap, each call to xfs_rtcheck_range() and
    xfs_rtfind_{forw,back}() gets the same bitmap block. If the bitmap block
    is very fragmented, then this is _a lot_ of buffer lookups.

    The realtime allocator already passes around a cache of the last used
    realtime summary block to avoid repeated reads (the parameters rbpp and
    rsb). We can do the same for the realtime bitmap.

    This replaces rbpp and rsb with a struct xfs_rtbuf_cache, which caches
    the most recently used block for both the realtime bitmap and summary.
    xfs_rtbuf_get() now handles the caching instead of the callers, which
    requires plumbing xfs_rtbuf_cache to more functions but also makes sure
    we don't miss anything.

    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:41 -06:00
Bill O'Donnell b32270d457 xfs: consolidate realtime allocation arguments
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 41f33d82cfd310e344fc9183f02cc9e0d2d27663
Author: Dave Chinner <dchinner@redhat.com>
Date:   Mon Oct 16 09:54:19 2023 -0700

    xfs: consolidate realtime allocation arguments

    Consolidate the arguments passed around the rt allocator into a
    struct xfs_rtalloc_arg similar to how the btree allocator arguments
    are consolidated in a struct xfs_alloc_arg....

    Signed-off-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:40 -06:00
Bill O'Donnell 6378f5954e xfs: create helpers for rtsummary block/wordcount computations
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit bd85af280de66a946022775a876edf0c553e3f35
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:50:34 2023 -0700

    xfs: create helpers for rtsummary block/wordcount computations

    Create helper functions that compute the number of blocks or words
    necessary to store the rt summary file.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:40 -06:00
Bill O'Donnell dbfe236491 xfs: create helpers for rtbitmap block/wordcount computations
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit d0448fe76ac1a9ccbce574577a4c82246d17eec4
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:48:20 2023 -0700

    xfs: create helpers for rtbitmap block/wordcount computations

    Create helper functions that compute the number of blocks or words
    necessary to store the rt bitmap.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:39 -06:00
Bill O'Donnell d404436167 xfs: convert the rtbitmap block and bit macros to static inline functions
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 90d98a6ada1da0f8797ff3f5adafd175dd8c0a81
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:44:13 2023 -0700

    xfs: convert the rtbitmap block and bit macros to static inline functions

    Replace these macros with typechecked helper functions.  Eventually
    we're going to add more logic to the helpers and it'll be easier if we
    don't have to macro it up.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:38 -06:00
Bill O'Donnell 2863940279 xfs: use shifting and masking when converting rt extents, if possible
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit ef5a83b7e597038d1c734ddb4bc00638082c2bf1
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:40:11 2023 -0700

    xfs: use shifting and masking when converting rt extents, if possible

    Avoid the costs of integer division (32-bit and 64-bit) if the realtime
    extent size is a power of two.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:38 -06:00
Bill O'Donnell d97dd3291d xfs: convert do_div calls to xfs_rtb_to_rtx helper calls
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 055641248f649b52620a5fe8774bea253690e057
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:37:47 2023 -0700

    xfs: convert do_div calls to xfs_rtb_to_rtx helper calls

    Convert these calls to use the helpers, and clean up all these places
    where the same variable can have different units depending on where it
    is in the function.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:37 -06:00
Bill O'Donnell bf3789f89b xfs: convert rt extent numbers to xfs_rtxnum_t
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 2d5f216b77e33f9b503bd42998271da35d4b7055
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:32:45 2023 -0700

    xfs: convert rt extent numbers to xfs_rtxnum_t

    Further disambiguate the xfs_rtblock_t uses by creating a new type,
    xfs_rtxnum_t, to store the position of an extent within the realtime
    section, in units of rtextents.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:35 -06:00
Bill O'Donnell 87521d5f25 xfs: convert rt bitmap/summary block numbers to xfs_fileoff_t
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 03f4de332e2e79db36ed2156fb2350480f142bec
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:31:11 2023 -0700

    xfs: convert rt bitmap/summary block numbers to xfs_fileoff_t

    We should use xfs_fileoff_t to store the file block offset of any
    location within the realtime bitmap or summary files.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:35 -06:00
Bill O'Donnell c65cfa90d7 xfs: convert xfs_extlen_t to xfs_rtxlen_t in the rt allocator
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit a684c538bc14410565e8939393089670fa1e19dd
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:31:11 2023 -0700

    xfs: convert xfs_extlen_t to xfs_rtxlen_t in the rt allocator

    In most of the filesystem, we use xfs_extlen_t to store the length of a
    file (or AG) space mapping in units of fs blocks.  Unfortunately, the
    realtime allocator also uses it to store the length of a rt space
    mapping in units of rt extents.  This is confusing, since one rt extent
    can consist of many fs blocks.

    Separate the two by introducing a new type (xfs_rtxlen_t) to store the
    length of a space mapping (in units of realtime extents) that would be
    found in a file.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:34 -06:00
Bill O'Donnell 1aef19b26a xfs: move the xfs_rtbitmap.c declarations to xfs_rtbitmap.h
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 13928113fc5b5e79c91796290a99ed991ac0efe2
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:21:47 2023 -0700

    xfs: move the xfs_rtbitmap.c declarations to xfs_rtbitmap.h

    Move all the declarations for functionality in xfs_rtbitmap.c into a
    separate xfs_rtbitmap.h header file.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:34 -06:00
Bill O'Donnell 015c1cd39a xfs: make sure maxlen is still congruent with prod when rounding down
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit f6a2dae2a1f52ea23f649c02615d073beba4cc35
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:21:38 2023 -0700

    xfs: make sure maxlen is still congruent with prod when rounding down

    In commit 2a6ca4baed, we tried to fix an overflow problem in the
    realtime allocator that was caused by an overly large maxlen value
    causing xfs_rtcheck_range to run off the end of the realtime bitmap.
    Unfortunately, there is a subtle bug here -- maxlen (and minlen) both
    have to be aligned with @prod, but @prod can be larger than 1 if the
    user has set an extent size hint on the file, and that extent size hint
    is larger than the realtime extent size.

    If the rt free space extents are not aligned to this file's extszhint
    because other files without extent size hints allocated space (or the
    number of rt extents is similarly not aligned), then it's possible that
    maxlen after clamping to sb_rextents will no longer be aligned to prod.
    The allocation will succeed just fine, but we still trip the assertion.

    Fix the problem by reducing maxlen by any misalignment with prod.  While
    we're at it, split the assertions into two so that we can tell which
    value had the bad alignment.

    Fixes: 2a6ca4baed ("xfs: make sure the rt allocator doesn't run off the end")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:34 -06:00
Bill O'Donnell 67844bfa47 xfs: prevent rt growfs when quota is enabled
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit b73494fa9a304ab95b59f07845e8d7d36e4d23e0
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:21:05 2023 -0700

    xfs: prevent rt growfs when quota is enabled

    Quotas aren't (yet) supported with realtime, so we shouldn't allow
    userspace to set up a realtime section when quotas are enabled, even if
    they attached one via mount options.  IOWS, you shouldn't be able to do:

    # mkfs.xfs -f /dev/sda
    # mount /dev/sda /mnt -o rtdev=/dev/sdb,usrquota
    # xfs_growfs -r /mnt

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-09 10:06:33 -06:00
Bill O'Donnell 0980c693e5 xfs: load rtbitmap and rtsummary extent mapping btrees at mount time
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 9e13975bb0620c2bfa1a4d2943e7eb8514f7708e
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Nov 6 17:03:18 2022 -0800

    xfs: load rtbitmap and rtsummary extent mapping btrees at mount time

    It turns out that GETFSMAP and online fsck have had a bug for years due
    to their use of ILOCK_SHARED to coordinate their linear scans of the
    realtime bitmap.  If the bitmap file's data fork happens to be in BTREE
    format and the scan occurs immediately after mounting, the incore bmbt
    will not be populated, leading to ASSERTs tripping over the incorrect
    inode state.  Because the bitmap scans always lock bitmap buffers in
    increasing order of file offset, it is appropriate for these two callers
    to take a shared ILOCK to improve scalability.

    To fix this problem, load both data and attr fork state into memory when
    mounting the realtime inodes.  Realtime metadata files aren't supposed
    to have an attr fork so the second step is likely a nop.

    On most filesystems this is unlikely since the rtbitmap data fork is
    usually in extents format, but it's possible to craft a filesystem that
    will by fragmenting the free space in the data section and growfsing the
    rt section.

    Fixes: 4c934c7dd6 ("xfs: report realtime space information via the rtbitmap")
    Also-Fixes: 46d9bfb5e7 ("xfs: cross-reference the realtime bitmap")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:11:53 -05:00
Bill O'Donnell 8c67a77aae xfs: make rtbitmap ILOCKing consistent when scanning the rt bitmap file
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 5f369dc5b4eb2becbdfd08924dcaf00e391f4ea1
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Nov 6 17:03:18 2022 -0800

    xfs: make rtbitmap ILOCKing consistent when scanning the rt bitmap file

    xfs_rtalloc_query_range scans the realtime bitmap file in order of
    increasing file offset, so this caller can take ILOCK_SHARED on the rt
    bitmap inode instead of ILOCK_EXCL.  This isn't going to yield any
    practical benefits at mount time, but we'd like to make the locking
    usage consistent around xfs_rtalloc_query_all calls.  Make all the
    places we do this use the same xfs_ilock lockflags for consistency.

    Fixes: 4c934c7dd6 ("xfs: report realtime space information via the rtbitmap")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:11:52 -05:00
Bill O'Donnell cf7ff3302c xfs: Conditionally upgrade existing inodes to use large extent counters
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 4f86bb4b66c999ad9ddcfd49fec93992eeba2715
Author: Chandan Babu R <chandan.babu@oracle.com>
Date:   Wed Mar 9 07:49:36 2022 +0000

    xfs: Conditionally upgrade existing inodes to use large extent counters

    This commit enables upgrading existing inodes to use large extent counters
    provided that underlying filesystem's superblock has large extent counter
    feature enabled.

    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:10:59 -05:00
Bill O'Donnell 1c2b1203c8 xfs: use a separate frextents counter for rt extent reservations
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 2229276c5283264b8c2241c1ed972bbb136cab22
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 12 06:49:42 2022 +1000

    xfs: use a separate frextents counter for rt extent reservations

    As mentioned in the previous commit, the kernel misuses sb_frextents in
    the incore mount to reflect both incore reservations made by running
    transactions as well as the actual count of free rt extents on disk.
    This results in the superblock being written to the log with an
    underestimate of the number of rt extents that are marked free in the
    rtbitmap.

    Teaching XFS to recompute frextents after log recovery avoids
    operational problems in the current mount, but it doesn't solve the
    problem of us writing undercounted frextents which are then recovered by
    an older kernel that doesn't have that fix.

    Create an incore percpu counter to mirror the ondisk frextents.  This
    new counter will track transaction reservations and the only time we
    will touch the incore super counter (i.e the one that gets logged) is
    when those transactions commit updates to the rt bitmap.  This is in
    contrast to the lazysbcount counters (e.g. fdblocks), where we know that
    log recovery will always fix any incorrect counter that we log.
    As a bonus, we only take m_sb_lock at transaction commit time.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Signed-off-by: Dave Chinner <david@fromorbit.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:10:59 -05:00
Bill O'Donnell 9a4ca0563f xfs: recalculate free rt extents after log recovery
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

commit 5a605fd6cb1da0ec9cb6e54c06bcf58f706d2f83
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Apr 12 06:49:42 2022 +1000

    xfs: recalculate free rt extents after log recovery

    I've been observing periodic corruption reports from xfs_scrub involving
    the free rt extent counter (frextents) while running xfs/141.  That test
    uses an error injection knob to induce a torn write to the log, and an
    arbitrary number of recovery mounts, frextents will count fewer free rt
    extents than can be found the rtbitmap.

    The root cause of the problem is a combination of the misuse of
    sb_frextents in the incore mount to reflect both incore reservations
    made by running transactions as well as the actual count of free rt
    extents on disk.  The following sequence can reproduce the undercount:

    Thread 1                        Thread 2
    xfs_trans_alloc(rtextents=3)
    xfs_mod_frextents(-3)
    <blocks>
                                    xfs_attr_set()
                                    xfs_bmap_attr_addfork()
                                    xfs_add_attr2()
                                    xfs_log_sb()
                                    xfs_sb_to_disk()
                                    xfs_trans_commit()
    <log flushed to disk>
    <log goes down>

    Note that thread 1 subtracts 3 from sb_frextents even though it never
    commits to using that space.  Thread 2 writes the undercounted value to
    the ondisk superblock and logs it to the xattr transaction, which is
    then flushed to disk.  At next mount, log recovery will find the logged
    superblock and write that back into the filesystem.  At the end of log
    recovery, we reread the superblock and install the recovered
    undercounted frextents value into the incore superblock.  From that
    point on, we've effectively leaked thread 1's transaction reservation.

    The correct fix for this is to separate the incore reservation from the
    ondisk usage, but that's a matter for the next patch.  Because the
    kernel has been logging superblocks with undercounted frextents for a
    very long time and we don't demand that sysadmins run xfs_repair after a
    crash, fix the undercount by recomputing frextents after log recovery.

    Gating this on log recovery is a reasonable balance (I think) between
    correcting the problem and slowing down every mount attempt.  Note that
    xfs_repair will fix undercounted frextents.

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Dave Chinner <dchinner@redhat.com>
    Signed-off-by: Dave Chinner <david@fromorbit.com>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2023-05-18 11:10:59 -05:00
Brian Foster d54a790d1d xfs: replace xfs_sb_version checks with feature flag checks
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2083143
Upstream Status: linux.git

commit 38c26bfd90e1999650d5ef40f90d721f05916643
Author: Dave Chinner <dchinner@redhat.com>
Date:   Wed Aug 18 18:46:37 2021 -0700

    xfs: replace xfs_sb_version checks with feature flag checks

    Convert the xfs_sb_version_hasfoo() to checks against
    mp->m_features. Checks of the superblock itself during disk
    operations (e.g. in the read/write verifiers and the to/from disk
    formatters) are not converted - they operate purely on the
    superblock state. Everything else should use the mount features.

    Large parts of this conversion were done with sed with commands like
    this:

    for f in `git grep -l xfs_sb_version_has fs/xfs/*.c`; do
            sed -i -e 's/xfs_sb_version_has\(.*\)(&\(.*\)->m_sb)/xfs_has_\1(\2)/' $f
    done

    With manual cleanups for things like "xfs_has_extflgbit" and other
    little inconsistencies in naming.

    The result is ia lot less typing to check features and an XFS binary
    size reduced by a bit over 3kB:

    $ size -t fs/xfs/built-in.a
            text       data     bss     dec     hex filenam
    before  1130866  311352     484 1442702  16038e (TOTALS)
    after   1127727  311352     484 1439563  15f74b (TOTALS)

    Signed-off-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>

Signed-off-by: Brian Foster <bfoster@redhat.com>
2022-08-25 08:11:34 -04:00
Brian Foster 0cb6373dde xfs: reflect sb features in xfs_mount
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2083143
Upstream Status: linux.git

commit a1d86e8dec8c1325d301c9d5594bb794bc428fc3
Author: Dave Chinner <dchinner@redhat.com>
Date:   Wed Aug 18 18:46:26 2021 -0700

    xfs: reflect sb features in xfs_mount

    Currently on-disk feature checks require decoding the superblock
    fileds and so can be non-trivial. We have almost 400 hundred
    individual feature checks in the XFS code, so this is a significant
    amount of code. To reduce runtime check overhead, pre-process all
    the version flags into a features field in the xfs_mount at mount
    time so we can convert all the feature checks to a simple flag
    check.

    There is also a need to convert the dynamic feature flags to update
    the m_features field. This is required for attr, attr2 and quota
    features. New xfs_mount based wrappers are added for this.

    Signed-off-by: Dave Chinner <dchinner@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>

Signed-off-by: Brian Foster <bfoster@redhat.com>
2022-08-25 08:11:34 -04:00
Darrick J. Wong 0925fecc55 xfs: fix an integer overflow error in xfs_growfs_rt
During a realtime grow operation, we run a single transaction for each
rt bitmap block added to the filesystem.  This means that each step has
to be careful to increase sb_rblocks appropriately.

Fix the integer overflow error in this calculation that can happen when
the extent size is very large.  Found by running growfs to add a rt
volume to a filesystem formatted with a 1g rt extent size.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2021-07-15 09:58:42 -07:00
Darrick J. Wong 0e2af9296f xfs: improve FSGROWFSRT precondition checking
Improve the checking at the start of a realtime grow operation so that
we avoid accidentally set a new extent size that is too large and avoid
adding an rt volume to a filesystem with rmap or reflink because we
don't support rt rmap or reflink yet.

While we're at it, separate the checks so that we're only testing one
aspect at a time.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2021-07-15 09:58:42 -07:00
Christoph Hellwig db07349da2 xfs: move the di_flags field to struct xfs_inode
In preparation of removing the historic icinode struct, move the flags
field into the containing xfs_inode structure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
2021-04-07 14:37:05 -07:00
Christoph Hellwig 13d2c10b05 xfs: move the di_size field to struct xfs_inode
In preparation of removing the historic icinode struct, move the on-disk
size field into the containing xfs_inode structure.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
2021-04-07 14:37:03 -07:00
Chandan Babu R 727e1acd29 xfs: Check for extent overflow when trivally adding a new extent
When adding a new data extent (without modifying an inode's existing
extents) the extent count increases only by 1. This commit checks for
extent count overflow in such cases.

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2021-01-22 16:54:47 -08:00
Dave Chinner e82226138b xfs: remove xfs_buf_t typedef
Prepare for kernel xfs_buf  alignment by getting rid of the
xfs_buf_t typedef from userspace.

[darrick: This patch is a port of a userspace patch removing the
xfs_buf_t typedef in preparation to make the userspace xfs_buf code
behave more like its kernel counterpart.]

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2020-12-16 16:07:34 -08:00