]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/log
thirdparty/xfsprogs-dev.git
4 years agoxfs: always init bma in xfs_bmapi_write libxfs-5.1-sync
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: always init bma in xfs_bmapi_write

Source kernel commit: 4b0bce30f39b7733420bb8b28e340aa91c219bc1

Always init the tp/ip fields of bma in xfs_bmapi_write so that the
bmapi_finish at the bottom never trips over null transaction or inode
pointers.

Coverity-id: 1443964
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: don't trip over uninitialized buffer on extent read of corrupted inode
Brian Foster [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: don't trip over uninitialized buffer on extent read of corrupted inode

Source kernel commit: 6958d11f77d45db80f7e22a21a74d4d5f44dc667

We've had rather rare reports of bmap btree block corruption where
the bmap root block has a level count of zero. The root cause of the
corruption is so far unknown. We do have verifier checks to detect
this form of on-disk corruption, but this doesn't cover a memory
corruption variant of the problem. The latter is a reasonable
possibility because the root block is part of the inode fork and can
reside in-core for some time before inode extents are read.

If this occurs, it leads to a system crash such as the following:

BUG: unable to handle kernel paging request at ffffffff00000221
PF error: [normal kernel read fault]
...
RIP: 0010:xfs_trans_brelse+0xf/0x200 [xfs]
...
Call Trace:
xfs_iread_extents+0x379/0x540 [xfs]
xfs_file_iomap_begin_delay+0x11a/0xb40 [xfs]
? xfs_attr_get+0xd1/0x120 [xfs]
? iomap_write_begin.constprop.40+0x2d0/0x2d0
xfs_file_iomap_begin+0x4c4/0x6d0 [xfs]
? __vfs_getxattr+0x53/0x70
? iomap_write_begin.constprop.40+0x2d0/0x2d0
iomap_apply+0x63/0x130
? iomap_write_begin.constprop.40+0x2d0/0x2d0
iomap_file_buffered_write+0x62/0x90
? iomap_write_begin.constprop.40+0x2d0/0x2d0
xfs_file_buffered_aio_write+0xe4/0x3b0 [xfs]
__vfs_write+0x150/0x1b0
vfs_write+0xba/0x1c0
ksys_pwrite64+0x64/0xa0
do_syscall_64+0x5a/0x1d0
entry_SYSCALL_64_after_hwframe+0x49/0xbe

The crash occurs because xfs_iread_extents() attempts to release an
uninitialized buffer pointer as the level == 0 value prevented the
buffer from ever being allocated or read. Change the level > 0
assert to an explicit error check in xfs_iread_extents() to avoid
crashing the kernel in the event of localized, in-core inode
corruption.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: clean up xfs_dir2_leaf_addname
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: clean up xfs_dir2_leaf_addname

Source kernel commit: 6ef50fe9afae63d11220f3f66b5f4c75d09c8bf0

Remove typedefs and consolidate local variable initialization.

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: zero initialize highstale and lowstale in xfs_dir2_leaf_addname
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: zero initialize highstale and lowstale in xfs_dir2_leaf_addname

Source kernel commit: f51fac68926235ef5bc482eb759d2c60b86fa358

Smatch complains about the following:

fs/xfs/libxfs/xfs_dir2_leaf.c:848 xfs_dir2_leaf_addname() error:
uninitialized symbol 'lowstale'.

fs/xfs/libxfs/xfs_dir2_leaf.c:849 xfs_dir2_leaf_addname() error:
uninitialized symbol 'highstale'.

I don't think there's any incorrect behavior associated with the
uninitialized variable, but as the author of the previous zero-init
patch points out, it's best not to be passing around pointers to
uninitialized stack areas.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: clean up xfs_dir2_leafn_add
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: clean up xfs_dir2_leafn_add

Source kernel commit: 79622c7ce6879c25ce121ee0db91c0ac4c7b137c

Remove typedefs and consolidate local variable initialization.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: Zero initialize highstale and lowstale in xfs_dir2_leafn_add
Nathan Chancellor [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: Zero initialize highstale and lowstale in xfs_dir2_leafn_add

Source kernel commit: 7be73fa1c1b0b6aaf15d590320f2c5c1108cb87a

When building with -Wsometimes-uninitialized, Clang warns:

fs/xfs/libxfs/xfs_dir2_node.c:481:6: warning: variable 'lowstale' is
used uninitialized whenever 'if' condition is false
[-Wsometimes-uninitialized]
fs/xfs/libxfs/xfs_dir2_node.c:481:6: warning: variable 'highstale' is
used uninitialized whenever 'if' condition is false
[-Wsometimes-uninitialized]

While it isn't technically wrong, it isn't a problem in practice because
highstale and lowstale are only initialized in xfs_dir2_leafn_add when
compact is not zero then they are passed to xfs_dir3_leaf_find_entry,
where they are initialized before use when compact is zero. Regardless,
it's better not to be passing around uninitialized stack memory so zero
initialize these variables, which silences this warning.

Link: https://github.com/ClangBuiltLinux/linux/issues/393
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: fix uninitialized error variables
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: fix uninitialized error variables

Source kernel commit: c1a4447f5e6ae8fb1f34a474f3083fb91cc4da90

smatch complained about some uninitialized error returns, so fix those.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: make COW fork unwritten extent conversions more robust
Christoph Hellwig [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: make COW fork unwritten extent conversions more robust

Source kernel commit: 26b91c728b2d15952432371dc2b6ba1dda1fb61f

If we have racing buffered and direct I/O COW fork extents under
writeback can have been moved to the data fork by the time we call
xfs_reflink_convert_cow from xfs_submit_ioend.  This would be mostly
harmless as the block numbers don't change by this move, except for
the fact that xfs_bmapi_write will crash or trigger asserts when
not finding existing extents, even despite trying to paper over this
with the XFS_BMAPI_CONVERT_ONLY flag.

Instead of special casing non-transaction conversions in the already
way too complicated xfs_bmapi_write just add a new helper for the much
simpler non-transactional COW fork case, which simplify ignores not
found extents.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: fix xfs_buf magic number endian checks
Darrick J. Wong [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: fix xfs_buf magic number endian checks

Source kernel commit: 15baadf72cedc2a09ea792c1fc59451502b55da2

Create a separate magic16 check function so that we don't run afoul of
static checkers.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: move stat accounting to xfs_bmapi_convert_delalloc
Christoph Hellwig [Mon, 6 May 2019 22:00:29 +0000 (18:00 -0400)] 
xfs: move stat accounting to xfs_bmapi_convert_delalloc

Source kernel commit: 125851ac92d62b966df851c6f34147121020af2f

This way we can actually count how many bytes got converted and how many
calls we need, unlike in the caller which doesn't have the detailed
view.

Note that this includes a slight change in behavior as the
xs_xstrat_quick is now bumped for every allocation instead of just the
one covering the requested writeback offset, which makes a lot more
sense.

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: move transaction handling to xfs_bmapi_convert_delalloc
Christoph Hellwig [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: move transaction handling to xfs_bmapi_convert_delalloc

Source kernel commit: 491ce61e939f76399e344b0414dc5a4c08c1f0cf

No need to deal with the transaction and the inode locking in the
caller. Note that we also switch to passing whichfork as the second
paramter, matching what most related functions do.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: split XFS_BMAPI_DELALLOC handling from xfs_bmapi_write
Christoph Hellwig [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: split XFS_BMAPI_DELALLOC handling from xfs_bmapi_write

Source kernel commit: d8ae82e394bd5d836a32864b1ca22757ef8bb8ee

Delalloc conversion has traditionally been part of our function to
allocate blocks on disk (first xfs_bmapi, then xfs_bmapi_write), but
delalloc conversion is a little special as we really do not want
to allocate blocks over holes, for which we don't have reservations.

Split the delalloc conversions into a separate helper to keep the
code simple and structured.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: factor out two helpers from xfs_bmapi_write
Christoph Hellwig [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: factor out two helpers from xfs_bmapi_write

Source kernel commit: c8b54673b30a9668d626a9e48d1659c21300f2a4

We want to be able to reuse them for the upcoming dedidcated delalloc
convert routine.

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: simplify the xfs_bmap_btree_to_extents calling conventions
Christoph Hellwig [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: simplify the xfs_bmap_btree_to_extents calling conventions

Source kernel commit: b101e3342a34404f2cc2daaad569afcae68452b0

Move boilerplate code from the callers into xfs_bmap_btree_to_extents:

- exit early without failure if we don't need to convert to the
extent format
- assert that we have a btree cursor
- don't reinitialize the passed in logflags argument

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: rename m_inotbt_nores to m_finobt_nores
Darrick J. Wong [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: rename m_inotbt_nores to m_finobt_nores

Source kernel commit: e1f6ca11381588e3ef138c10de60eeb34cb8466a

Rename this flag variable to imply more strongly that it's related to
the free inode btree (finobt) operation.  No functional changes.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: add magic numbers to dquot buffer ops
Darrick J. Wong [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: add magic numbers to dquot buffer ops

Source kernel commit: 4260baac629e15723574f42c5c9ba13cb037db8e

Add dquot magic numbers to the buffer ops type, in case we ever want to
use them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: add inode magic to inode verifier
Darrick J. Wong [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: add inode magic to inode verifier

Source kernel commit: 2bfe7069f71e56a301976d08eae3027b1eebc30d

Use xfs_verify_magic to check the magic numbers of inodes.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: factor xfs_da3_blkinfo verification into common helper
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: factor xfs_da3_blkinfo verification into common helper

Source kernel commit: 8764f98351fa561296f70c3435a5cb1eb6272c39

With the verifier magic value helper in place, we've left a bit more
duplicate code across the verifiers that involve struct
xfs_da3_blkinfo. This includes the da node, xattr leaf and dir leaf
verifiers, all of which perform similar checks for v4 and v5
filesystems.

Create a common helper to verify an xfs_da3_blkinfo structure,
taking care to only access v5 fields where appropriate, and refactor
the aforementioned verifiers to use the helper. No functional
changes.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: miscellaneous verifier magic value fixups
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: miscellaneous verifier magic value fixups

Source kernel commit: 39708c20ab51337c3eb282a824eb0aaff7ebe2e1

Most buffer verifiers have hardcoded magic value checks
conditionalized on the version of the filesystem. The magic value
field of the verifier structure facilitates abstraction of some of
this code. Populate the ->magic field of various verifiers to take
advantage of this abstraction. No functional changes.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: use verifier magic field in dir2 leaf verifiers
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: use verifier magic field in dir2 leaf verifiers

Source kernel commit: 09f420197d7ced360b4809606efd7a65f842c2c0

The dir2 leaf verifiers share the same underlying structure
verification code, but implement six accessor functions to multiplex
the code across the two verifiers. Further, the magic value isn't
sufficiently abstracted such that the common helper has to manually
fix up the magic from the caller on v5 filesystems.

Use the magic field in the verifier structure to eliminate the
duplicate code and clean this all up. No functional change.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: distinguish between bnobt and cntbt magic values
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: distinguish between bnobt and cntbt magic values

Source kernel commit: b8f89801664f8413a88cf2c7539d1aeae07dd3c5

The allocation btree verifiers share code that is unable to detect
cross-tree magic value corruptions such as a bnobt block with a
cntbt magic value. Populate the b_ops->magic field of the associated
verifier structures such that the structure verifier can check the
magic value against the expected value based on tree type.

The btree level check requires knowledge of the tree type to
determine the appropriate maximum value. This was previously part of
the hardcoded magic value checks. With that code removed, peek at
the first magic value in the verifier to determine the expected tree
type of the current block.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: split up allocation btree verifier
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: split up allocation btree verifier

Source kernel commit: 27df4f5045fc68766980c4dfba5ffc9ad1f71ebb

Similar to the inode btree verifier, the same allocation btree
verifier structure is shared between the by-bno (bnobt) and by-size
(cntbt) btrees. This prevents the ability to distinguish magic
values between them. Separate the verifier into two, one for each
tree, and assign them appropriately. No functional changes.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: distinguish between inobt and finobt magic values
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: distinguish between inobt and finobt magic values

Source kernel commit: 8473fee340e37711b9ac6a5cc591305ccaaa4778

The inode btree verifier code is shared between the inode btree and
free inode btree because the underlying metadata formats are
essentially equivalent. A side effect of this is that the verifier
cannot determine whether a particular btree block should have an
inobt or finobt magic value.

This logic allows an unfortunate xfs_repair bug to escape detection
where certain level > 0 nodes of the finobt are stamped with inobt
magic by xfs_repair finobt reconstruction. This is fortunately not a
severe problem since the inode btree magic values do not contribute
to any changes in kernel behavior, but we do need a means to detect
and prevent this problem in the future.

Add a field to xfs_buf_ops to store the v4 and v5 superblock magic
values expected by a particular verifier. Add a helper to check an
on-disk magic value against the value expected by the verifier. Call
the helper from the shared [f]inobt verifier code for magic value
verification. This ensures that the inode btree blocks each have the
appropriate magic value based on specific tree type and superblock
version.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: create a separate finobt verifier
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: create a separate finobt verifier

Source kernel commit: 01e68f40bf7846b58d2734aa11b0cbcaadbeaa3e

The inobt verifier is reused for the inobt and finobt, which
prevents the ability to distinguish between magic values on a
per-tree basis. Create a separate finobt structure in preparation
for changes to enforce the appropriate magic value for the
associated tree. This patch has no functional change.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: always check magic values in on-disk byte order
Brian Foster [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: always check magic values in on-disk byte order

Source kernel commit: e34d3e74eb8f6eb020312cec747ff55ee1d1ca18

Most verifiers that check on-disk magic values convert the CPU
endian magic value constant to disk endian to facilitate compile
time optimization of the byte swap and reduce the need for runtime
byte swaps in buffer verifiers. Several buffer verifiers do not
follow this pattern. Update those verifiers for consistency.

Also fix up a random typo in the inode readahead verifier name.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: cache unlinked pointers in an rhashtable
Darrick J. Wong [Mon, 6 May 2019 22:00:28 +0000 (18:00 -0400)] 
xfs: cache unlinked pointers in an rhashtable

Source kernel commit: 9b2471797942a5947664818cfe2c6de93b43f37a

Use a rhashtable to cache the unlinked list incore.  This should speed
up unlinked processing considerably when there are a lot of inodes on
the unlinked list because iunlink_remove no longer has to traverse an
entire bucket list to find which inode points to the one being removed.

The incore list structure records "X.next_unlinked = Y" relations, with
the rhashtable using Y to index the records.  This makes finding the
inode X that points to a inode Y very quick.  If our cache fails to find
anything we can always fall back on the old method.

FWIW this drastically reduces the amount of time it takes to remove
inodes from the unlinked list.  I wrote a program to open a lot of
O_TMPFILE files and then close them in the same order, which takes
a very long time if we have to traverse the unlinked lists.  With the
ptach, I see:

+ /d/t/tmpfile/tmpfile
Opened 193531 files in 6.33s.
Closed 193531 files in 5.86s

real    0m12.192s
user    0m0.064s
sys     0m11.619s
+ cd /
+ umount /mnt

real    0m0.050s
user    0m0.004s
sys     0m0.030s

And without the patch:

+ /d/t/tmpfile/tmpfile
Opened 193588 files in 6.35s.
Closed 193588 files in 751.61s

real    12m38.853s
user    0m0.084s
sys     12m34.470s
+ cd /
+ umount /mnt

real    0m0.086s
user    0m0.000s
sys     0m0.060s

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: add xfs_verify_agino_or_null helper
Darrick J. Wong [Mon, 6 May 2019 22:00:27 +0000 (18:00 -0400)] 
xfs: add xfs_verify_agino_or_null helper

Source kernel commit: 7d36c19538d38f9ff6b93d2a3d23ee879b076dc6

Add a new helper to check that a per-AG inode pointer is either null or
points somewhere valid within that AG.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: use the latest extent at writeback delalloc conversion time
Brian Foster [Mon, 6 May 2019 22:00:27 +0000 (18:00 -0400)] 
xfs: use the latest extent at writeback delalloc conversion time

Source kernel commit: c2b3164320b51a535d7c7a6acdcee255edbb22cf

The writeback delalloc conversion code is racy with respect to
changes in the currently cached file mapping outside of the current
page. This is because the ilock is cycled between the time the
caller originally looked up the mapping and across each real
allocation of the provided file range. This code has collected
various hacks over the years to help combat the symptoms of these
races (i.e., truncate race detection, allocation into hole
detection, etc.), but none address the fundamental problem that the
imap may not be valid at allocation time.

Rather than continue to use race detection hacks, update writeback
delalloc conversion to a model that explicitly converts the delalloc
extent backing the current file offset being processed. The current
file offset is the only block we can trust to remain once the ilock
is dropped because any operation that can remove the block
(truncate, hole punch, etc.) must flush and discard pagecache pages
first.

Modify xfs_iomap_write_allocate() to use the xfs_bmapi_delalloc()
mechanism to request allocation of the entire delalloc extent
backing the current offset instead of assuming the extent passed by
the caller is unchanged. Record the range specified by the caller
and apply it to the resulting allocated extent so previous checks by
the caller for COW fork overlap are not lost. Finally, overload the
bmapi delalloc flag with the range reval flag behavior since this is
the only use case for both.

This ensures that writeback always picks up the correct
and current extent associated with the page, regardless of races
with other extent modifying operations. If operating on a data fork
and the COW overlap state has changed since the ilock was cycled,
the caller revalidates against the COW fork sequence number before
using the imap for the next block.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: create delalloc bmapi wrapper for full extent allocation
Brian Foster [Mon, 6 May 2019 22:00:27 +0000 (18:00 -0400)] 
xfs: create delalloc bmapi wrapper for full extent allocation

Source kernel commit: 627209fbcc2f0d658a5417645859a1d3053ddb59

The writeback delalloc conversion code is racy with respect to
changes in the currently cached file mapping. This stems from the
fact that the bmapi allocation code requires a file range to
allocate and the writeback conversion code assumes the range of the
currently cached mapping is still valid with respect to the fork. It
may not be valid, however, because the ilock is cycled (potentially
multiple times) between the time the cached mapping was populated
and the delalloc conversion occurs.

To facilitate a solution to this problem, create a new
xfs_bmapi_delalloc() wrapper to xfs_bmapi_write() that takes a file
(FSB) offset and attempts to allocate whatever delalloc extent backs
the offset. Use a new bmapi flag to cause xfs_bmapi_write() to set
the range based on the extent backing the bno parameter unless bno
lands in a hole. If bno does land in a hole, fall back to the
current behavior (which may result in an error or quietly skipping
holes in the specified range depending on other parameters). This
patch does not change behavior.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: remove superfluous writeback mapping eof trimming
Brian Foster [Mon, 6 May 2019 22:00:20 +0000 (18:00 -0400)] 
xfs: remove superfluous writeback mapping eof trimming

Source kernel commit: 3b35089807304f208419b5ad9cc3c5f731225cd9

Now that the cached writeback mapping is explicitly invalidated on
data fork changes, the EOF trimming band-aid is no longer necessary.
Remove xfs_trim_extent_eof() as well since it has no other users.

Signed-off-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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: update fork seq counter on data fork changes
Brian Foster [Mon, 6 May 2019 22:00:20 +0000 (18:00 -0400)] 
xfs: update fork seq counter on data fork changes

Source kernel commit: 9f9bc034b84958523689347ee2bdd9c660008e5e

The sequence counter in the xfs_ifork structure is only updated on
COW forks. This is because the counter is currently only used to
optimize out repetitive COW fork checks at writeback time.

Tweak the extent code to update the seq counter regardless of the
fork type in preparation for using this counter on data forks as
well.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: check attribute name validity
Darrick J. Wong [Mon, 6 May 2019 22:00:20 +0000 (18:00 -0400)] 
xfs: check attribute name validity

Source kernel commit: 654805367d982cffdb9979453673aab9c3c96d07

Check extended attribute entry names for invalid characters.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: check directory name validity
Darrick J. Wong [Mon, 6 May 2019 22:00:20 +0000 (18:00 -0400)] 
xfs: check directory name validity

Source kernel commit: e5d7d51b340aac0f4cc56677eb8d29d4e164c58c

Check directory entry names for invalid characters.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs: scrub should flag dir/attr offsets that aren't mappable with xfs_dablk_t
Darrick J. Wong [Mon, 6 May 2019 22:00:20 +0000 (18:00 -0400)] 
xfs: scrub should flag dir/attr offsets that aren't mappable with xfs_dablk_t

Source kernel commit: f8c1d7023e252df853efbb3566c6d47b148609fe

Teach scrub to flag extent maps that exceed the range that can be mapped
with a xfs_dablk_t.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfsprogs: Release v5.0.0 v5.0.0
Eric Sandeen [Fri, 3 May 2019 17:14:36 +0000 (12:14 -0500)] 
xfsprogs: Release v5.0.0

Update all the necessary files for a 5.0.0 release.

Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs_db: scan entire file system when using 'frag'
Jorge Guerra [Fri, 3 May 2019 16:52:32 +0000 (11:52 -0500)] 
xfs_db: scan entire file system when using 'frag'

While running the 'frag' command of 'xfs_db' we noticed that the
tool is not scanning all the files in the file system.  We noticed
this when we modified the tool to print the inodes of all the files
scanned.  For example:

 $ find /mnt/xfsdisk -type f | wc -l
 1782674
 $ xfs_db -r -c frag /dev/sdXX  | grep MB | awk '{print $5}' | paste -s -d+ | bc
 656818

Upon inspecting the code we noticed that the scanfunc_ino function
stops processing a given inode block once it encounters a free leaf.
However, in practice we see that inodes are necessarily always layed
out contiguously on the leaf node.  This resulted in the 'frag'
command skipping some valid inodes.

In this change we modify the scanfunc_ino function to skip freed
inodes.  With the change in place we ran the same experiment again
and noticed a more accurate file count:

 $ find /mnt/d0 -type f | wc -l
 1810442
 $ xfs_db -r -c frag /dev/sdXX  | grep MB | awk '{print $5}' | paste -s -d+ | bc
 1810442

Fixes: 2a5eb70c ("xfs_db: teach the frag command about sparse inode chunks")
Signed-off-by: Jorge Guerra <jorgeguerra@fb.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
4 years agoxfs_io: rework includes for statx structures
Eric Sandeen [Fri, 3 May 2019 16:51:37 +0000 (11:51 -0500)] 
xfs_io: rework includes for statx structures

Only include the kernel's linux/stat.h headers if we haven't
already picked up statx bits from glibc, to avoid redefinition.

Suggested-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Tested-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfsprogs: Release v5.0.0-rc1 v5.0.0-rc1
Eric Sandeen [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
xfsprogs: Release v5.0.0-rc1

Update all the necessary files for a 5.0.0-rc1 release.

Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: refactor manage_zones()
Eric Sandeen [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
libxfs: refactor manage_zones()

It's bizarre to have manage_zones() both set up and tear down zones.
It's even more bizarre to have xfs_dir_startup() buried in there.

Refactor init/destory into 2 functions, and call xfs_dir_startup()
separately from zone init similar to what kernelspace does.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibfrog: fix memory leak in bitmap_free
Darrick J. Wong [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
libfrog: fix memory leak in bitmap_free

Free the bitmap struct before we null out the caller's pointer.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: shorten inode item lifetime
Darrick J. Wong [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
libxfs: shorten inode item lifetime

Shorten the inode item lifetime so that we only keep them around while
the inode is joined with a transaction.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: fix buffer log item lifetime weirdness
Darrick J. Wong [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
libxfs: fix buffer log item lifetime weirdness

In xfsprogs, the lifetime of xfs_buf log items doesn't match the kernel
because we keep them around after comitting or cancelling transactions.
This is confusing, so change the lifetime to be consistent.  Worse yet,
if an inode cluster buffer gets bjoined to a transaction (e.g. someone
called xfs_trans_read_buf) we'll leak it when flushing an inode core
back to that buffer.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: don't touch buffer log item pointer when flushing inode log item
Darrick J. Wong [Fri, 26 Apr 2019 21:50:48 +0000 (16:50 -0500)] 
libxfs: don't touch buffer log item pointer when flushing inode log item

When we're flushing an inode log item, it is not necessary to mess with
the inode cluster buffer's log item because the iflush code paths pass
the inode log item directly.  The unconditional reset causes us to leak
buffer log items.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: refactor buffer item release code
Darrick J. Wong [Fri, 26 Apr 2019 21:50:10 +0000 (16:50 -0500)] 
libxfs: refactor buffer item release code

Refactor the buffer item release code into a helper, which we will use
in subsequent patches to make the buffer log item lifetime match the
kernel equivalents.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agomisc: fix strncpy length complaints
Darrick J. Wong [Fri, 26 Apr 2019 20:44:21 +0000 (15:44 -0500)] 
misc: fix strncpy length complaints

Fix a number of complaints about feeding sizeof(dest) directly to
strncpy.  We do this by feeding strncpy the length of the buffer minus
one, having checked that the allocated space are long enough.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: drop the ifork_ops parameter from libxfs_inode_verify_forks
Darrick J. Wong [Fri, 26 Apr 2019 20:42:00 +0000 (15:42 -0500)] 
libxfs: drop the ifork_ops parameter from libxfs_inode_verify_forks

Now that the inode remembers its own ifork_ops, we can drop the second
parameter from libxfs_inode_verify_forks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: retain ifork_ops when flushing inode
Darrick J. Wong [Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)] 
libxfs: retain ifork_ops when flushing inode

Retain the ifork ops used to validate the inode so that we can use the
same one to iflush it.  xfs_repair phase 6 can use multiple transactions
to fix various inode problems, which means that the inode might not be
fully fixed when each transaction commits.

This can be a particular problem if there's a shortform directory with
both invalid directory entries and incorrect i8count.  Phase 3 will set
the parent inode to "0" to signal to phase 6 that it needs to reset the
parent and i8count, but phase 6 starts a transaction to junk the bad
entries which fail to commit because the parent is invalid:

fixing i8count in inode 69022994673
Invalid inode number 0x0
xfs_dir_ino_validate: XFS_ERROR_REPORT
Metadata corruption detected at 0x464eb0, inode 0x10121750f1 data fork
xfs_repair: warning - iflush_int failed (-117)

And thus the inode fixes never get written out.

Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: correctly account for free space btree shrinks when fixing freelist
Darrick J. Wong [Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)] 
xfs_repair: correctly account for free space btree shrinks when fixing freelist

When we fix the freelist at the end of build_agf_agfl in phase 5 of
repair, we need to create incore rmap records for the blocks that get
added to the AGFL.  We can't let the regular freelist fixing code use
the regular on-disk rmapbt update code because the rmapbt isn't fully
set up yet.

Unfortunately, the original code fails to account for the fact that the
free space btrees can shrink when we allocate blocks to fix the
freelist; those blocks are also put on the freelist, but there are
already incore rmaps for all the free space btree blocks.  We must not
create (redundant) incore rmaps for those blocks.  If we do, repair
fails with a complaint that rebuilding the rmapbt failed during phase 5.
xfs/137 on a 1k block size occasionally triggers this bug.

To fix the problem, construct a bitmap of all OWN_AG blocks that we know
about before traversing the AGFL, and only create new incore rmaps for
those AGFL blocks that are not already tracked in the bitmap.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_info: use findmnt to handle mounted block devices
Darrick J. Wong [Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)] 
xfs_info: use findmnt to handle mounted block devices

Use findmnt to determine if the passed-in argument is associated with a
mount point, and if so, use spaceman to query the mounted filesystem.
If the user passed in a file, try to find out if it's a loop mounted
live filesystem and if so query the live filesystem.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoscrub: fix Makefile targets which depend on builddefs
Darrick J. Wong [Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)] 
scrub: fix Makefile targets which depend on builddefs

Add Makefile dependencies for targets that require variables set in
builddefs.  Although most of the required variables are file paths
defined during the ./configure process, we cannot simply use
AC_CONFIG_FILES to generate the scripts because that macro only expands
one level deep and its documentation says that it's only to be used for
generating makefiles, not build targets themselves.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfsprogs: remove unused function prototypes
Eric Sandeen [Fri, 26 Apr 2019 20:41:12 +0000 (15:41 -0500)] 
xfsprogs: remove unused function prototypes

These are prototypes for functions that aren't defined anywhere in
the code, so remove them.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: remove redundant function declarations
Darrick J. Wong [Fri, 26 Apr 2019 20:40:51 +0000 (15:40 -0500)] 
xfs_scrub: remove redundant function declarations

Remove a redundant function declaration.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agomkfs: don't use DIFLAG values for fsx_xflags
Darrick J. Wong [Fri, 26 Apr 2019 20:40:46 +0000 (15:40 -0500)] 
mkfs: don't use DIFLAG values for fsx_xflags

mkfs shouldn't be using DIFLAG values where FS_XFLAG values are
required.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
[sandeen: minor adjustments for previous patch mods]
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: remove pointless xfs_verify_error_info struct
Darrick J. Wong [Fri, 26 Apr 2019 20:40:42 +0000 (15:40 -0500)] 
xfs_scrub: remove pointless xfs_verify_error_info struct

The xfs_verify_error_info structure is a strict subset of
media_verify_info so just pass that around.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
[sandeen: rename another variable to match structure]
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: rename confusing structure
Darrick J. Wong [Fri, 26 Apr 2019 20:40:37 +0000 (15:40 -0500)] 
xfs_scrub: rename confusing structure

Rename xfs_verify_extent to media_verify_state so that the name more
accurately reflects what we're storing in the structure.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: remove xfs_ prefixes from structure names
Darrick J. Wong [Fri, 26 Apr 2019 20:40:33 +0000 (15:40 -0500)] 
xfs_scrub: remove xfs_ prefixes from structure names

Drop the xfs_ prefix from scrub's struct definitions since they're
private to the program.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_db: metadump should handle symlinks properly
Darrick J. Wong [Fri, 26 Apr 2019 20:40:28 +0000 (15:40 -0500)] 
xfs_db: metadump should handle symlinks properly

Remote symlink target blocks are multi-fsb objects on XFS v5 filesystems
because we only write one rmt header per data fork extent.  For fs
blocksize >= 2048 we never have more than one block and therefore nobody
noticed, but for blocksize == 1024 this is definitely not true and leads
to metadump spraying error messages about symlink block crc errors.
Therefore, reformulate the symlink metadump into a multi-fsb dump
function.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
[sandeen: shrink the map declaration]
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_db: refactor multi-fsb object detection decision making
Darrick J. Wong [Fri, 26 Apr 2019 20:40:24 +0000 (15:40 -0500)] 
xfs_db: refactor multi-fsb object detection decision making

Pull the "is this a multi-fsb object" decision into a separate function
that we can keep close to the actual multi-fsb object dispatcher.  We
will soon make the machinery more complex so we do this to avoid having
a big hairy if statement.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_db: refactor metadump handling of multi-fsb objects
Darrick J. Wong [Fri, 26 Apr 2019 20:40:19 +0000 (15:40 -0500)] 
xfs_db: refactor metadump handling of multi-fsb objects

Separate the multi-fsb object dispatch from actual dir block processing
so that we can implement symlink handling correctly as a multi-fsb file.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: better cli option parameter checking
Darrick J. Wong [Fri, 26 Apr 2019 20:40:14 +0000 (15:40 -0500)] 
xfs_repair: better cli option parameter checking

For the xfs_repair options that require a parameter, check that the user
actually provided one instead of segfaulting.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: fix label parsing and validation
Darrick J. Wong [Fri, 26 Apr 2019 20:40:10 +0000 (15:40 -0500)] 
xfs_io: fix label parsing and validation

When we're trying to set a new label, check the length to make sure we
won't overflow the label size, and size label[] so that we can use
strncpy without static checker complaints.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: don't read garbage stack contents if INUMBERS goes nuts
Darrick J. Wong [Fri, 26 Apr 2019 20:40:05 +0000 (15:40 -0500)] 
xfs_io: don't read garbage stack contents if INUMBERS goes nuts

In theory INUMBERS will never return an ocount of zero, but on the off
chance it ever does we'll negative index the igroup array and return
stack contents for an inode number.  Don't do that.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: include unicrash.h in unicrash.c
Darrick J. Wong [Fri, 26 Apr 2019 20:40:00 +0000 (15:40 -0500)] 
xfs_scrub: include unicrash.h in unicrash.c

Fix broken function prototype checking in unicrash.c by actually
including its header.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: remove libxfs_trans_iget
Darrick J. Wong [Fri, 26 Apr 2019 20:39:56 +0000 (15:39 -0500)] 
libxfs: remove libxfs_trans_iget

libxfs_trans_iget no longer has a counterpart in the kernel.  Remove it
and make the xfs_iget/xfs_trans_ijoin usage consistent throughout
xfsprogs.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: refactor the open-coded libxfs_trans_bjoin calls
Darrick J. Wong [Fri, 26 Apr 2019 20:39:51 +0000 (15:39 -0500)] 
libxfs: refactor the open-coded libxfs_trans_bjoin calls

Refactor open-coded bjoin code to use libxfs_trans_bjoin.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibfrog: hoist bitmap out of scrub
Darrick J. Wong [Fri, 26 Apr 2019 20:39:46 +0000 (15:39 -0500)] 
libfrog: hoist bitmap out of scrub

Move the bitmap code to libfrog so that we can use bitmaps in
xfs_repair.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: pass ops through during scan
Darrick J. Wong [Fri, 26 Apr 2019 20:39:41 +0000 (15:39 -0500)] 
xfs_repair: pass ops through during scan

Pass the buffer ops through scan_sbtree so that we detect finobt blocks
properly and we don't have to keep switching on magic numbers for the
free space btrees.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: refactor buffer ops assignments during phase 5
Darrick J. Wong [Fri, 26 Apr 2019 20:39:35 +0000 (15:39 -0500)] 
xfs_repair: refactor buffer ops assignments during phase 5

Refactor the buffer ops assignments in phase 5 to use a helper function
to determine the correct buf_ops instead of open-coding them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: fix uninitialized variable warnings
Darrick J. Wong [Fri, 26 Apr 2019 20:39:29 +0000 (15:39 -0500)] 
xfs_repair: fix uninitialized variable warnings

Fix some uninitialized variable warnings because ASSERT disappears if
DEBUG is not defined.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: bump the irec on-disk nlink when adding lost+found
Darrick J. Wong [Fri, 26 Apr 2019 20:39:23 +0000 (15:39 -0500)] 
xfs_repair: bump the irec on-disk nlink when adding lost+found

We increment the nlink of the root directory inode when creating a
"lost+found" directory during phase 6, but we don't update the irec copy
of the root dir nlink.  This normally gets papered over by phase 7, but
this can fail badly if:

1) The root directory had an entry to a busted subdirectory, so
   that root directory will have nlink == 3, but in the ino_tree,
   counted_nlinks == 2 and disk_nlinks == 3.

2) Phase 6 creates lost+found to root the files that were in the busted
   directory, we'll set nlink = 4 and counted_nlinks = 3.  The correct
   nlink is 3 ('.', '..', 'lost+found'), not 4.

3) During phase 7, we see that counted_nlinks == disk_nlinks and so we
   totally fail to correct the on-disk inode.

4) A subsequent run of xfs_repair complains about the nlink being 4
   instead of 3.

To fix this, we have to adjust the irec's disk_nlinks in step 2 so that
phase 7 seeds that counted_nlinks < disk_nlinks and resets nlink to
counted_nlinks.  This can be reproduced somewhat frequently by xfs/117.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_repair: reinitialize the root directory nlink correctly
Darrick J. Wong [Fri, 26 Apr 2019 20:39:17 +0000 (15:39 -0500)] 
xfs_repair: reinitialize the root directory nlink correctly

In mk_root_dir, we reinitialize the root directory inode with a link
count of 1.  This differs from mkfs parseproto, which initializes the
root to have a link count of 2.  The nlink discrepancy in repair is
caught and corrected during phase 7, but this is unnecessary since we
should set it properly in the first place.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agomkfs: validate extent size hint parameters
Darrick J. Wong [Thu, 18 Apr 2019 18:19:39 +0000 (13:19 -0500)] 
mkfs: validate extent size hint parameters

Validate extent and cow extent size hints that are passed to mkfs so
that we avoid formatting a filesystem that will never mount.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
[sandeen: use DIFLAG macros for now to be consistent, fixed later]
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: fix typo in unicrash header file
Eric Sandeen [Thu, 18 Apr 2019 18:19:39 +0000 (13:19 -0500)] 
xfs_scrub: fix typo in unicrash header file

The no-op #definintion was missing 'fs_' so remained undefined
in the #else case.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_db: use TYP_FINOBT for finobt metadump
Darrick J. Wong [Thu, 28 Mar 2019 23:07:23 +0000 (18:07 -0500)] 
xfs_db: use TYP_FINOBT for finobt metadump

Use the correct xfs_db type for dumping free inode btree blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: check label for misleading characters
Darrick J. Wong [Thu, 28 Mar 2019 23:05:02 +0000 (18:05 -0500)] 
xfs_scrub: check label for misleading characters

Make sure that we can retrieve the label and that it doesn't contain
anything potentially misleading.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: don't close mnt_fd when mnt_fd open fails
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub: don't close mnt_fd when mnt_fd open fails

If we fail to open the mountpoint during phase 1 of scrub, don't bother
trying to close the file descriptor since it's silly to spray error
messages about that.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: one read/verify pool per disk
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub: one read/verify pool per disk

Simplify the read/verify pool code further by creating one pool per
disk.  This enables us to tailor the concurrency levels of each disk to
that specific disk so that if we have a mixed hdd/ssd environment we
don't flood the hdd with a lot of requests.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: don't expose internal pool state
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub: don't expose internal pool state

In xfs_scrub, the read/verify pool tries to coalesce the media
verification requests into a smaller number of large IOs.  There's no
need to force callers to keep track of this internal state, so just move
all that into read_verify.c.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: use datadev parallelization estimates for thread count
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub: use datadev parallelization estimates for thread count

During phases 2-5, xfs_scrub should estimate the level of
parallelization possible on the data device to determine the number of
threads spawned to scrub filesystem metadata, not just blindly using the
number of CPUs.  This avoids flooding non-rotational storage with random
reads, which totally destroys performance and makes scrub runtimes
higher.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub: rename the global nr_threads
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub: rename the global nr_threads

Various functions have nr_threads local variables that shadow the global
one.  Since the global one forces the number of threads we use, change
its name to remove this ambiguity and reflect what it really does.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub_all.timer: activate after most of the system is up
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub_all.timer: activate after most of the system is up

We really don't want the xfs_scrub_all timer triggering while the system
is booting up because not all the mounts will have finished, networking
might not be up for reporting, and slowing down bootup annoys people.
Therefore, delay the xfs_scrub_all service's activation until after the
system has started all the big pieces it's going to start.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_scrub_all: walk the lsblk device/fs hierarchy correctly
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_scrub_all: walk the lsblk device/fs hierarchy correctly

Back when I was designing xfs_scrub_all, I naïvely assumed that the
emitted output would always list physical storage before the virtual
devices stacked atop it.  However, this is not actually true when one
omits the "NAME" column, which is crucial to forcing the output (json or
otherwise) to capture the block device hierarchy.  If the assumption is
violated, the program crashes with a python exception.

To fix this, force the hierarchal json output and restructure the
discovery routines to walk the json object that we receive, from the top
(physical devices) downwards to wherever there are live xfs filesystems.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: document fzero_f -k option in manpage
Eric Sandeen [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_io: document fzero_f -k option in manpage

Perhaps the reason -k was broken is that nobody knew it existed?

Fixes: 938904c4 ("xfs_io: add fzero command for zeroing range via fallocate")
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: don't walk off the end of argv in fzero_f
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_io: don't walk off the end of argv in fzero_f

The fzero_f function doesn't check that there are enough non-switch
parameters to supply offset and length arguments to fallocate.  As a
result, we can walk off the end of the argv array and crash.  A
secondary problem is that we don't use getopt to detect the -k, which is
not how most xfs_io commands work.

Therefore, use getopt to detect the -k argument and rewire the offset
and length interpretation code to check optind and use argv correctly.
This bug is trivially reproduced by "xfs_io -c 'fzero -k 0' /some/file".

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: statx -r should print attributes_mask
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_io: statx -r should print attributes_mask

We're dumping the raw structure, so we ought to dump everything,
including the attributes_mask field.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs_io: actually check copy file range helper return values
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
xfs_io: actually check copy file range helper return values

We need to check the return value of copy_src_filesize and
copy_dst_truncate because either could return -1 due to fstat/ftruncate
failure.

Fixes: 628e112afdd98c5 ("xfs_io: implement 'copy_range' command")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agodebian: enable parallel make
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
debian: enable parallel make

Use parallel make to speed up dpkg builds.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Nathan Scott <nathans@debian.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agodebian: don't bypass top level Makefile when building subdirs
Darrick J. Wong [Thu, 28 Mar 2019 23:05:01 +0000 (18:05 -0500)] 
debian: don't bypass top level Makefile when building subdirs

The top level Makefile does some processing to set build environment
variables (Q and CHECK_CMD).  debian/rules uses -C to build subdirs
directly, which bypases this feature of the top-level makefile, which
causes more build spew than necessary (because Q never gets set to quiet
the build).

Since the top level makefile can be used to build the subdirs
debian/rules cares about, drop the -C and build subdirs via the top
level Makefile to quiet the build.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Nathan Scott <nathans@debian.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agodebian: drop dangling libhandle.a symlinks in xfslibs-dev
Darrick J. Wong [Thu, 28 Mar 2019 23:04:51 +0000 (18:04 -0500)] 
debian: drop dangling libhandle.a symlinks in xfslibs-dev

We don't ship static libhandle libraries anymore, so make sure we drop
the symlink.

Fixes: ec1cf08dbeb2d ("Several updates to use more modern Debian packaging")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Nathan Scott <nathans@debian.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoconfigure.ac: fix alignment of features
Darrick J. Wong [Thu, 28 Mar 2019 23:04:51 +0000 (18:04 -0500)] 
configure.ac: fix alignment of features

Fix the alignment of the feature options in the --help screen.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoconfigure: use sys/xattr.h for fsetxattr detection
Darrick J. Wong [Thu, 28 Mar 2019 23:04:51 +0000 (18:04 -0500)] 
configure: use sys/xattr.h for fsetxattr detection

The only user of fsetxattr and HAVE_FSETXATTR is fsr, which includes
sys/xattr.h (from libc).  However, the m4 macro to detect fsetxattr
support requires attr/xattr.h (from libattr).  libattr dropped xattr.h
last year, so update the check.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agolibxfs: fix repair deadlock due to failed inode flushes.
Dave Chinner [Thu, 28 Mar 2019 23:04:51 +0000 (18:04 -0500)] 
libxfs: fix repair deadlock due to failed inode flushes.

If inode_item_done() fails to flush an inode after we've grabbed a
reference to the underlying buffer during a transaction commit, we
fail to put the buffer and hence leak it. We then deadlock on the
next lookup ofthe inode buffer as it is still locked and no-one owns
it.

To fix it, put the buffer on error so that it gets unlocked and
can be recovered appropriately in a later phase of repair.

Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl>
Fixes: d15188a1ec14 ("xfs: rework the inline directory verifiers")
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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: stringify scrub types in ftrace output libxfs-5.0-sync
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: stringify scrub types in ftrace output

Source kernel commit: 86d163dbfe2ac0b30fbb6e256301abbfa9e4549e

Use __print_symbolic to print the scrub type in ftrace output.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: stringify btree cursor types in ftrace output
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: stringify btree cursor types in ftrace output

Source kernel commit: c494213f30080423b70b24b6af7f6da554d9390f

Use __print_symbolic to print the btree type in ftrace output.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: move XFS_INODE_FORMAT_STR mappings to libxfs
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: move XFS_INODE_FORMAT_STR mappings to libxfs

Source kernel commit: 0357d21a6c9be2870904598b4767c7d424524849

Move XFS_INODE_FORMAT_STR to libxfs so that we don't forget to keep it
updated, and add necessary TRACE_DEFINE_ENUM.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: move XFS_AG_BTREE_CMP_FORMAT_STR mappings to libxfs
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: move XFS_AG_BTREE_CMP_FORMAT_STR mappings to libxfs

Source kernel commit: 05c753c4cf53f51a7e35fcfe684500113cf1fd13

Move XFS_AG_BTREE_CMP_FORMAT_STR to libxfs so that we don't forget to
keep it updated, and TRACE_DEFINE_ENUM the values while we're at it.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: fix symbolic enum printing in ftrace output
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: fix symbolic enum printing in ftrace output

Source kernel commit: 85f8dff00a3193fe5659aa4c91adde31723c0d3d

ftrace's __print_symbolic() has a (very poorly documented) requirement
that any enum values used in the symbol to string translation table be
wrapped in a TRACE_DEFINE_ENUM so that the enum value can be encoded in
the ftrace ring buffer.  Fix this unsatisfied requirement.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: cache minimum realtime summary level
Omar Sandoval [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: cache minimum realtime summary level

Source kernel commit: 355e3532132b487ebf6a4900fad8f3525fa3e137

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: precalculate cluster alignment in inodes and blocks
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: precalculate cluster alignment in inodes and blocks

Source kernel commit: c1b4a321ede083521b91c314e1c4fa233ac33740

Store the inode cluster alignment information in units of inodes and
blocks in the mount data so that we don't have to keep recalculating
them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5 years agoxfs: precalculate inodes and blocks per inode cluster
Darrick J. Wong [Wed, 27 Feb 2019 23:13:45 +0000 (17:13 -0600)] 
xfs: precalculate inodes and blocks per inode cluster

Source kernel commit: 83dcdb4469e759f984db92616d7885fc14329841

Store the number of inodes and blocks per inode cluster in the mount
data so that we don't have to keep recalculating them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>