Commit Graph

62 Commits

Author SHA1 Message Date
Bill O'Donnell b440373349 xfs: remove conditional building of rt geometry validator functions
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit 881f78f472556ed05588172d5b5676b48dc48240
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Jan 29 20:27:23 2024 -0800

    xfs: remove conditional building of rt geometry validator functions

    I mistakenly turned off CONFIG_XFS_RT in the Kconfig file for arm64
    variant of the djwong-wtf git branch.  Unfortunately, it took me a good
    hour to figure out that RT wasn't built because this is what got printed
    to dmesg:

    XFS (sda2): realtime geometry sanity check failed
    XFS (sda2): Metadata corruption detected at xfs_sb_read_verify+0x170/0x190 [xfs], xfs_sb block 0x0

    Whereas I would have expected:

    XFS (sda2): Not built with CONFIG_XFS_RT
    XFS (sda2): RT mount failed

    The root cause of these problems is the conditional compilation of the
    new functions xfs_validate_rtextents and xfs_compute_rextslog that I
    introduced in the two commits listed below.  The !RT versions of these
    functions return false and 0, respectively, which causes primary
    superblock validation to fail, which explains the first message.

    Move the two functions to other parts of libxfs that are not
    conditionally defined by CONFIG_XFS_RT and remove the broken stubs so
    that validation works again.

    Fixes: e14293803f4e ("xfs: don't allow overly small or large realtime volumes")
    Fixes: a6a38f309afc ("xfs: make rextslog computation consistent with mkfs")
    Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>

Signed-off-by: Bill O'Donnell <bodonnel@redhat.com>
2024-11-20 11:26:21 -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 fc466738e1 xfs: split xfs_rtmodify_summary_int
JIRA: https://issues.redhat.com/browse/RHEL-65728

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

    xfs: split xfs_rtmodify_summary_int

    Inline the logic of xfs_rtmodify_summary_int into xfs_rtmodify_summary
    and xfs_rtget_summary instead of having a somewhat awkward helper to
    share a little bit of code.

    Signed-off-by: Christoph Hellwig <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 420c7605f9 xfs: fix 32-bit truncation in xfs_compute_rextslog
JIRA: https://issues.redhat.com/browse/RHEL-65728

commit cf8f0e6c1429be7652869059ea44696b72d5b726
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Dec 3 09:19:44 2023 -0800

    xfs: fix 32-bit truncation in xfs_compute_rextslog

    It's quite reasonable that some customer somewhere will want to
    configure a realtime volume with more than 2^32 extents.  If they try to
    do this, the highbit32() call will truncate the upper bits of the
    xfs_rtbxlen_t and produce the wrong value for rextslog.  This in turn
    causes the rsumlevels to be wrong, which results in a realtime summary
    file that is the wrong length.  Fix that.

    Signed-off-by: Darrick J. Wong <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 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 15da8bcb01 xfs: simplify rt bitmap/summary block accessor functions
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit e2cf427c91494ea0d1173a911090c39665c5fdef
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Wed Oct 18 10:28:10 2023 -0700

    xfs: simplify rt bitmap/summary block accessor functions

    Simplify the calling convention of these functions since the
    xfs_rtalloc_args structure contains the parameters we need.

    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 0c37661796 xfs: simplify xfs_rtbuf_get calling conventions
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 5b1d0ae9753f0654ab56c1e06155b3abf2919d71
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Wed Oct 18 10:19:41 2023 -0700

    xfs: simplify xfs_rtbuf_get calling conventions

    Now that xfs_rtalloc_args holds references to the last-read bitmap and
    summary blocks, we don't need to pass the buffer pointer out of
    xfs_rtbuf_get.

    Callers no longer have to xfs_trans_brelse on their own, though they are
    required to call xfs_rtbuf_cache_relse before the xfs_rtalloc_args goes
    out of scope.

    While we're at it, create some trivial helpers so that we don't have to
    remember if "0" means "bitmap" and "1" means "summary".

    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 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 b53b7def90 xfs: use accessor functions for summary info words
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 663b8db7b0256b81152b2f786e45ecf12bdf265f
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:51:16 2023 -0700

    xfs: use accessor functions for summary info words

    Create get and set functions for rtsummary words so that we can redefine
    the ondisk format with a specific endianness.  Note that this requires
    the definition of a distinct type for ondisk summary info words so that
    the compiler can perform proper typechecking.

    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 fb6a0a72ef xfs: use accessor functions for bitmap words
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 97e993830a1cdd86ad7d207308b9f55a00660edd
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:49:01 2023 -0700

    xfs: use accessor functions for bitmap words

    Create get and set functions for rtbitmap words so that we can redefine
    the ondisk format with a specific endianness.  Note that this requires
    the definition of a distinct type for ondisk rtbitmap words so that the
    compiler can perform proper typechecking as we go back and forth.

    In the upcoming rtgroups feature, we're going to fix the problem that
    rtwords are written in host endian order, which means we'll need the
    distinct rtword/rtword_raw types.

    Suggested-by: Christoph Hellwig <hch@lst.de>
    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 2f1d05d80b xfs: create a helper to handle logging parts of rt bitmap/summary blocks
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 312d61021b8947446aa9ec80b78b9230e8cb3691
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Oct 17 16:43:10 2023 -0700

    xfs: create a helper to handle logging parts of rt bitmap/summary blocks

    Create an explicit helper function to log parts of rt bitmap and summary
    blocks.  While we're at it, fix an off-by-one error in two of the
    rtbitmap logging calls that led to unnecessarily large log items but was
    otherwise benign.

    Note that the upcoming rtgroups patchset will add block headers to the
    rtbitmap and rtsummary files.  The helpers in this and the next few
    patches take a less than direct route through xfs_rbmblock_wordptr and
    xfs_rsumblock_infoptr to avoid helper churn in that patchset.

    Suggested-by: Christoph Hellwig <hch@lst.de>
    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 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 adaab1dbc9 xfs: convert rt summary macros to helpers
JIRA: https://issues.redhat.com/browse/RHEL-62760

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

    xfs: convert rt summary macros to helpers

    Convert the realtime summary file macros to helper functions so that we
    can improve type checking.

    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 ca1b050d2b xfs: convert open-coded xfs_rtword_t pointer accesses to helper
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit a9948626849c2c65dfd201b5e9d855e62937de61
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:46:53 2023 -0700

    xfs: convert open-coded xfs_rtword_t pointer accesses to helper

    There are a bunch of places where we use open-coded logic to find a
    pointer to an xfs_rtword_t within a rt bitmap buffer.  Convert all that
    to helper functions for better type safety.

    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 86e3c7e849 xfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit add3cddaea509071d01bf1d34df0d05db1a93a07
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:46:08 2023 -0700

    xfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros

    Remove these trivial macros since they're not even part of the ondisk
    format.

    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 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 747c7f6fdf xfs: create helpers to convert rt block numbers to rt extent numbers
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 5dc3a80d46a450481df7f7e9fe673ba3eb4514c3
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:37:07 2023 -0700

    xfs: create helpers to convert rt block numbers to rt extent numbers

    Create helpers to do unit conversions of rt block numbers to rt extent
    numbers.  There are three variations -- one to compute the rt extent
    number from an rt block number; one to compute the offset of an rt block
    within an rt extent; and one to extract both.

    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 22edee70ec xfs: hoist freeing of rt data fork extent mappings
JIRA: https://issues.redhat.com/browse/RHEL-62760

commit 6c664484337b37fa0cf6e958f4019623e30d40f7
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Oct 16 09:16:22 2023 -0700

    xfs: hoist freeing of rt data fork extent mappings

    Currently, xfs_bmap_del_extent_real contains a bunch of code to convert
    the physical extent of a data fork mapping for a realtime file into rt
    extents and pass that to the rt extent freeing function.  Since the
    details of this aren't needed when CONFIG_XFS_REALTIME=n, move it to
    xfs_rtbitmap.c to reduce code size when realtime isn't enabled.

    This will (one day) enable realtime EFIs to reuse the same
    unit-converting call with less code duplication.

    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 d0e6c1d717 xfs: pass explicit mount pointer to rtalloc query functions
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2167832

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

    xfs: pass explicit mount pointer to rtalloc query functions

    Pass an explicit xfs_mount pointer to the rtalloc query functions so
    that they can support transactionless queries.

    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:58 -05:00
Brian Foster 9a58eeb49d xfs: make xfs_rtalloc_query_range input parameters const
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2083143
Upstream Status: linux.git

commit c02f6529864a4f5f91d216d324bac4ba75415d19
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Tue Aug 10 17:00:30 2021 -0700

    xfs: make xfs_rtalloc_query_range input parameters const

    In commit 8ad560d256, we changed xfs_rtalloc_query_range to constrain
    the range of bits in the realtime bitmap file that would actually be
    searched.  In commit a3a374bf18, we changed the range again
    (incorrectly), leading to the fix in commit d88850bd55, which finally
    corrected the range check code.  Unfortunately, the author never noticed
    that the function modifies its input parameters, which is a totaly no-no
    since none of the other range query functions change their input
    parameters.

    So, fix this function yet again to stash the upper end of the query
    range (i.e. the high key) in a local variable and hope this is the last
    time I have to fix my own function.  While we're at it, mark the key
    inputs const so nobody makes this mistake again. :(

    Fixes: 8ad560d256 ("xfs: strengthen rtalloc query range checks")
    Not-fixed-by: a3a374bf18 ("xfs: fix off-by-one error in xfs_rtalloc_query_range")
    Not-fixed-by: d88850bd55 ("xfs: fix high key handling in the rt allocator's query_range function")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>

Signed-off-by: Brian Foster <bfoster@redhat.com>
2022-08-25 08:11:28 -04: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
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
Darrick J. Wong d88850bd55 xfs: fix high key handling in the rt allocator's query_range function
Fix some off-by-one errors in xfs_rtalloc_query_range.  The highest key
in the realtime bitmap is always one less than the number of rt extents,
which means that the key clamp at the start of the function is wrong.
The 4th argument to xfs_rtfind_forw is the highest rt extent that we
want to probe, which means that passing 1 less than the high key is
wrong.  Finally, drop the rem variable that controls the loop because we
can compare the iteration point (rtstart) against the high key directly.

The sordid history of this function is that the original commit (fb3c3)
incorrectly passed (high_rec->ar_startblock - 1) as the 'limit' parameter
to xfs_rtfind_forw.  This was wrong because the "high key" is supposed
to be the largest key for which the caller wants result rows, not the
key for the first row that could possibly be outside the range that the
caller wants to see.

A subsequent attempt (8ad56) to strengthen the parameter checking added
incorrect clamping of the parameters to the number of rt blocks in the
system (despite the bitmap functions all taking units of rt extents) to
avoid querying ranges past the end of rt bitmap file but failed to fix
the incorrect _rtfind_forw parameter.  The original _rtfind_forw
parameter error then survived the conversion of the startblock and
blockcount fields to rt extents (a0e5c), and the most recent off-by-one
fix (a3a37) thought it was patching a problem when the end of the rt
volume is not in use, but none of these fixes actually solved the
original problem that the author was confused about the "limit" argument
to xfs_rtfind_forw.

Sadly, all four of these patches were written by this author and even
his own usage of this function and rt testing were inadequate to get
this fixed quickly.

Original-problem: fb3c3de2f6 ("xfs: add a couple of queries to iterate free extents in the rtbitmap")
Not-fixed-by: 8ad560d256 ("xfs: strengthen rtalloc query range checks")
Not-fixed-by: a0e5c435ba ("xfs: fix xfs_rtalloc_rec units")
Fixes: a3a374bf18 ("xfs: fix off-by-one error in xfs_rtalloc_query_range")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
2020-10-16 15:34:28 -07:00
Darrick J. Wong 877f58f536 xfs: rename xfs_bmap_is_real_extent to is_written_extent
The name of this predicate is a little misleading -- it decides if the
extent mapping is allocated and written.  Change the name to be more
direct, as we're going to add a new predicate in the next patch.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
2020-07-06 10:46:57 -07:00
Christoph Hellwig b90c2a9c8b xfs: xfs_bmapi_read doesn't take a fork id as the last argument
The last argument to xfs_bmapi_raad contains XFS_BMAPI_* flags, not the
fork.  Given that XFS_DATA_FORK evaluates to 0 no real harm is done,
but let's fix this anyway.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2020-05-19 09:40:57 -07:00
Darrick J. Wong a71895c5da xfs: convert open coded corruption check to use XFS_IS_CORRUPT
Convert the last of the open coded corruption check and report idioms to
use the XFS_IS_CORRUPT macro.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2019-11-13 11:08:01 -08:00
Darrick J. Wong a5155b870d xfs: always log corruption errors
Make sure we log something to dmesg whenever we return -EFSCORRUPTED up
the call stack.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2019-11-04 13:55:54 -08:00
Eric Sandeen 250d4b4c40 xfs: remove unused header files
There are many, many xfs header files which are included but
unneeded (or included twice) in the xfs code, so remove them.

nb: xfs_linux.h includes about 9 headers for everyone, so those
explicit includes get removed by this.  I'm not sure what the
preference is, but if we wanted explicit includes everywhere,
a followup patch could remove those xfs_*.h includes from
xfs_linux.h and move them into the files that need them.
Or it could be left as-is.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2019-06-28 19:30:43 -07:00
Omar Sandoval 355e353213 xfs: cache minimum realtime summary level
The realtime summary is a two-dimensional array on disk, effectively:

u32 rsum[log2(number of realtime extents) + 1][number of blocks in the bitmap]

rsum[log][bbno] is the number of extents of size 2**log which start in
bitmap block bbno.

xfs_rtallocate_extent_near() uses xfs_rtany_summary() to check whether
rsum[log][bbno] != 0 for any log level. However, the summary array is
stored in row-major order (i.e., like an array in C), so all of these
entries are not adjacent, but rather spread across the entire summary
file. In the worst case (a full bitmap block), xfs_rtany_summary() has
to check every level.

This means that on a moderately-used realtime device, an allocation will
waste a lot of time finding, reading, and releasing buffers for the
realtime summary. In particular, one of our storage services (which runs
on servers with 8 very slow CPUs and 15 8 TB XFS realtime filesystems)
spends almost 5% of its CPU cycles in xfs_rtbuf_get() and
xfs_trans_brelse() called from xfs_rtany_summary().

One solution would be to also store the summary with the dimensions
swapped. However, this would require a disk format change to a very old
component of XFS.

Instead, we can cache the minimum size which contains any extents. We do
so lazily; rather than guaranteeing that the cache contains the precise
minimum, it always contains a loose lower bound which we tighten when we
read or update a summary block. This only uses a few kilobytes of memory
and is already serialized via the realtime bitmap and summary inode
locks, so the cost is minimal. With this change, the same workload only
spends 0.2% of its CPU cycles in the realtime allocator.

Signed-off-by: Omar Sandoval <osandov@fb.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-12-12 08:47:17 -08:00
Darrick J. Wong a3a374bf18 xfs: fix off-by-one error in xfs_rtalloc_query_range
In commit 8ad560d256 ("xfs: strengthen rtalloc query range checks")
we strengthened the input parameter checks in the rtbitmap range query
function, but introduced an off-by-one error in the process.  The call
to xfs_rtfind_forw deals with the high key being rextents, but we clamp
the high key to rextents - 1.  This causes the returned results to stop
one block short of the end of the rtdev, which is incorrect.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2018-06-24 11:56:36 -07:00
Dave Chinner 86210fbeba xfs: move various type verifiers to common file
New verification functions like xfs_verify_fsbno() and
xfs_verify_agino() are spread across multiple files and different
header files. They really don't fit cleanly into the places they've
been put, and have wider scope than the current header includes.

Move the type verifiers to a new file in libxfs (xfs-types.c) and
the prototypes to xfs_types.h where they will be visible to all the
code that uses the types.

Signed-Off-By: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2018-06-08 10:07:51 -07:00
Dave Chinner 0b61f8a407 xfs: convert to SPDX license tags
Remove the verbose license text from XFS files and replace them
with SPDX tags. This does not change the license of any of the code,
merely refers to the common, up-to-date license files in LICENSES/

This change was mostly scripted. fs/xfs/Makefile and
fs/xfs/libxfs/xfs_fs.h were modified by hand, the rest were detected
and modified by the following command:

for f in `git grep -l "GNU General" fs/xfs/` ; do
	echo $f
	cat $f | awk -f hdr.awk > $f.new
	mv -f $f.new $f
done

And the hdr.awk script that did the modification (including
detecting the difference between GPL-2.0 and GPL-2.0+ licenses)
is as follows:

$ cat hdr.awk
BEGIN {
	hdr = 1.0
	tag = "GPL-2.0"
	str = ""
}

/^ \* This program is free software/ {
	hdr = 2.0;
	next
}

/any later version./ {
	tag = "GPL-2.0+"
	next
}

/^ \*\// {
	if (hdr > 0.0) {
		print "// SPDX-License-Identifier: " tag
		print str
		print $0
		str=""
		hdr = 0.0
		next
	}
	print $0
	next
}

/^ \* / {
	if (hdr > 1.0)
		next
	if (hdr > 0.0) {
		if (str != "")
			str = str "\n"
		str = str $0
		next
	}
	print $0
	next
}

/^ \*/ {
	if (hdr > 0.0)
		next
	print $0
	next
}

// {
	if (hdr > 0.0) {
		if (str != "")
			str = str "\n"
		str = str $0
		next
	}
	print $0
}

END { }
$

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>
2018-06-06 14:17:53 -07:00
Darrick J. Wong a0e5c435ba xfs: fix xfs_rtalloc_rec units
All the realtime allocation functions deal with space on the rtdev in
units of realtime extents.  However, struct xfs_rtalloc_rec confusingly
uses the word 'block' in the name, even though they're really extents.

Fix the naming problem and fix all the unit handling problems in the two
existing users.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
2018-06-01 09:00:16 -07:00
Darrick J. Wong 8ad560d256 xfs: strengthen rtalloc query range checks
Strengthen the rtalloc range query checks to make sure that the keys do
not run off the end of the realtime device inappropriately.  Note that
the query range functions require units of rt extents, not blocks,
despite the type name.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
2018-06-01 09:00:16 -07:00
Darrick J. Wong a03f1641c7 xfs: xfs_rtbuf_get should check the bmapi_read results
The xfs_rtbuf_get function should check the block mapping it gets back
from bmapi_read.  If there are no mappings or the mapping isn't a real
extent, we should return -EFSCORRUPTED rather than trying to read a
garbage value.  We also require realtime bitmap blocks to be real,
written allocations.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
2018-06-01 09:00:16 -07:00
Darrick J. Wong 46d9bfb5e7 xfs: cross-reference the realtime bitmap
While we're scrubbing various btrees, cross-reference the records
with the other metadata.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2018-01-17 21:00:46 -08:00
Colin Ian King c06641169e xfs: remove redundant assignment to variable bit
Variable bit is being assigned a value that is never read, hence
the assignment is redundant and can be removed. Cleans up clang
warning:

fs/xfs/libxfs/xfs_rtbitmap.c:675:3: warning: Value stored to
'bit' is never read

Signed-off-by: Colin Ian King <colin.king@canonical.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
2017-10-31 12:03:35 -07:00
Darrick J. Wong 21ec54168b xfs: create block pointer check functions
Create some helper functions to check that a block pointer points
within the filesystem (or AG) and doesn't point at static metadata.
We will use this for scrub.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
2017-10-26 15:38:23 -07:00
Darrick J. Wong 2678809799 xfs: export various function for the online scrubber
Export various internal functions so that the online scrubber can use
them to check the state of metadata.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
2017-06-19 14:11:34 -07:00
Darrick J. Wong c8ce540db5 xfs: remove double-underscore integer types
This is a purely mechanical patch that removes the private
__{u,}int{8,16,32,64}_t typedefs in favor of using the system
{u,}int{8,16,32,64}_t typedefs.  This is the sed script used to perform
the transformation and fix the resulting whitespace and indentation
errors:

s/typedef\t__uint8_t/typedef __uint8_t\t/g
s/typedef\t__uint/typedef __uint/g
s/typedef\t__int\([0-9]*\)_t/typedef int\1_t\t/g
s/__uint8_t\t/__uint8_t\t\t/g
s/__uint/uint/g
s/__int\([0-9]*\)_t\t/__int\1_t\t\t/g
s/__int/int/g
/^typedef.*int[0-9]*_t;$/d

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2017-06-19 14:11:33 -07:00
Darrick J. Wong fb3c3de2f6 xfs: add a couple of queries to iterate free extents in the rtbitmap
Add _query_range and _query_all functions to the realtime bitmap
allocator.  These two functions are similar in usage to the btree
functions with the same name and will be used for getfsmap and scrub.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
2017-04-03 15:18:17 -07:00