]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/log
thirdparty/xfsprogs-dev.git
25 hours agoxfsprogs: Release v6.7.0 for-next master v6.7.0
Carlos Maiolino [Wed, 17 Apr 2024 07:55:22 +0000 (09:55 +0200)] 
xfsprogs: Release v6.7.0

Update all the necessary files for a 6.7.0 release.

Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for HDIO_GETGEO
Christoph Hellwig [Thu, 15 Feb 2024 06:54:24 +0000 (07:54 +0100)] 
configure: don't check for HDIO_GETGEO

HDIO_GETGEO has been around longer than XFS.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for SG_IO
Christoph Hellwig [Thu, 15 Feb 2024 06:54:23 +0000 (07:54 +0100)] 
configure: don't check for SG_IO

SG_IO has been around longer than XFS.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fstatat
Christoph Hellwig [Thu, 15 Feb 2024 06:54:22 +0000 (07:54 +0100)] 
configure: don't check for fstatat

fstatat has been supported since Linux 2.6.16 and glibc 2.4.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for openat
Christoph Hellwig [Thu, 15 Feb 2024 06:54:21 +0000 (07:54 +0100)] 
configure: don't check for openat

openat has been supported since Linux 2.6.16 and glibc 2.4.

Note that xfs_db already uses it without the ifdef.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for the f_flags field in statfs
Christoph Hellwig [Thu, 15 Feb 2024 06:54:20 +0000 (07:54 +0100)] 
configure: don't check for the f_flags field in statfs

The f_flags field has been supported since Linux 2.6.36.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fsetxattr
Christoph Hellwig [Thu, 15 Feb 2024 06:54:19 +0000 (07:54 +0100)] 
configure: don't check for fsetxattr

fsetxattr has been supported since Linux 2.4 and glibc 2.3.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for mremap
Christoph Hellwig [Thu, 15 Feb 2024 06:54:18 +0000 (07:54 +0100)] 
configure: don't check for mremap

mremap has been around since before the dawn of it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for preadv and pwritev
Christoph Hellwig [Thu, 15 Feb 2024 06:54:17 +0000 (07:54 +0100)] 
configure: don't check for preadv and pwritev

preadv and pwritev have been supported since Linux 2.6.30.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for syncfs
Christoph Hellwig [Thu, 15 Feb 2024 06:54:16 +0000 (07:54 +0100)] 
configure: don't check for syncfs

syncfs has been supported since Linux 2.6.39.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fallocate
Christoph Hellwig [Thu, 15 Feb 2024 06:54:15 +0000 (07:54 +0100)] 
configure: don't check for fallocate

fallocate has been supported since Linux 2.6.23 and glibc 2.10.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fls
Christoph Hellwig [Thu, 15 Feb 2024 06:54:14 +0000 (07:54 +0100)] 
configure: don't check for fls

fls should never be provided by system headers.  It seems like on MacOS
it did, but as we're not supporting MacOS anymore there is no need to
check for it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for readdir
Christoph Hellwig [Thu, 15 Feb 2024 06:54:13 +0000 (07:54 +0100)] 
configure: don't check for readdir

readdir has been part of Posix since the very beginning.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for sync_file_range
Christoph Hellwig [Thu, 15 Feb 2024 06:54:12 +0000 (07:54 +0100)] 
configure: don't check for sync_file_range

sync_file_range has been supported since Linux 2.6.17.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fiemap
Christoph Hellwig [Thu, 15 Feb 2024 06:54:11 +0000 (07:54 +0100)] 
configure: don't check for fiemap

fiemap has been supported since Linux 2.6.28.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for mincor
Christoph Hellwig [Thu, 15 Feb 2024 06:54:10 +0000 (07:54 +0100)] 
configure: don't check for mincor

mincore has been supported since Linux 2.3.99pre1 and glibc 2.2.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for madvise
Christoph Hellwig [Thu, 15 Feb 2024 06:54:09 +0000 (07:54 +0100)] 
configure: don't check for madvise

madvise has been supported since before the dawn of it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for sendfile
Christoph Hellwig [Thu, 15 Feb 2024 06:54:08 +0000 (07:54 +0100)] 
configure: don't check for sendfile

sendfile has been supported since Linux 2.2 and glibc 2.1.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for fadvise
Christoph Hellwig [Thu, 15 Feb 2024 06:54:07 +0000 (07:54 +0100)] 
configure: don't check for fadvise

fadvise has been supported since Linux 2.5.60 and glibc 2.2.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: require libblkid
Christoph Hellwig [Thu, 15 Feb 2024 06:54:06 +0000 (07:54 +0100)] 
configure: require libblkid

We can't support block device access (which is the reason for xfsprogs
to exist) without blkid.  Make it a hard requirement and remove the
stubs.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoconfigure: don't check for getmntent
Christoph Hellwig [Thu, 15 Feb 2024 06:54:05 +0000 (07:54 +0100)] 
configure: don't check for getmntent

getmntent always exists on Linux (and always has), so don't bother
checking for it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoio: don't redefine SEEK_DATA and SEEK_HOLE
Christoph Hellwig [Thu, 15 Feb 2024 06:54:04 +0000 (07:54 +0100)] 
io: don't redefine SEEK_DATA and SEEK_HOLE

HAVE_SEEK_DATA is never defined, so the code in xfs_io just
unconditionally redefines SEEK_DATA and SEEK_HOLE.  Switch to the
system version instead, which has been around since Linux 3.1 and
glibc of similar vintage.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoinclude: stop generating platform_defs.h
Christoph Hellwig [Thu, 15 Feb 2024 06:54:03 +0000 (07:54 +0100)] 
include: stop generating platform_defs.h

Now that the sizeof checks are gone, we can stop generating platform_defs.h.
The only caveat is that we need to stop undefining ENABLE_GETTEXT, which the
generation process had removed before.  The actual ENABLE_GETTEXT will be
passd on the compiler command line, just like other ENABLE or HAVE values
from autoconf.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoinclude: stop using SIZEOF_LONG
Christoph Hellwig [Thu, 15 Feb 2024 06:54:02 +0000 (07:54 +0100)] 
include: stop using SIZEOF_LONG

SIZEOF_LONG together with the unused SIZEOF_CHAR_P is the last thing that
really needs a generated configuration header.  Switch to just using
sizeof(long) so that we can stop generating platform_defs.h.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agorepair: refactor the BLKMAP_NEXTS_MAX check
Christoph Hellwig [Thu, 15 Feb 2024 06:54:01 +0000 (07:54 +0100)] 
repair: refactor the BLKMAP_NEXTS_MAX check

Check the 32-bit limits using sizeof instead of cpp ifdefs so that we
can get rid of BITS_PER_LONG.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoinclude: unconditionally define umode_t
Christoph Hellwig [Thu, 15 Feb 2024 06:54:00 +0000 (07:54 +0100)] 
include: unconditionally define umode_t

No system or kernel uapi header defines umode_t, so just define it
unconditionally.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoinclude: remove the filldir_t typedef
Christoph Hellwig [Thu, 15 Feb 2024 06:53:59 +0000 (07:53 +0100)] 
include: remove the filldir_t typedef

Neither struct filldir, nor filldir_t is used anywhere in xfsprogs.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
5 weeks agoxfs_db: don't hardcode 'type data' size at 512b
Darrick J. Wong [Thu, 22 Feb 2024 22:04:31 +0000 (14:04 -0800)] 
xfs_db: don't hardcode 'type data' size at 512b

On a disk with 4096-byte LBAs, the xfs_db 'type data' subcommand doesn't
work:

# xfs_io -c 'sb' -c 'type data' /dev/sda
xfs_db: read failed: Invalid argument
no current object

The cause of this is the hardcoded initialization of bb_count when we're
setting type data -- it should be the filesystem sector size, not just 1.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agodebian: Increase build verbosity, add terse support
Bastian Germann [Mon, 12 Feb 2024 23:07:55 +0000 (00:07 +0100)] 
debian: Increase build verbosity, add terse support

Section 4.9 of the Debian Policy reads:

"The package build should be as verbose as reasonably possible,
except where the terse tag is included in DEB_BUILD_OPTIONS".

Implement such behavior for xfsprogs by passing V=1 to make by default.

Link: https://www.debian.org/doc/debian-policy/ch-source.html#main-building-script-debian-rules
Link: https://bugs.debian.org/1063774
Reported-by: Emanuele Rocca <ema@debian.org>
Signed-off-by: Bastian Germann <bage@debian.org>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agobuild: Request 64-bit time_t where possible
Sam James [Mon, 5 Feb 2024 23:23:21 +0000 (23:23 +0000)] 
build: Request 64-bit time_t where possible

Suggested by Darrick during LFS review. We take the same approach as in
5c0599b721d1d232d2e400f357abdf2736f24a97 ('Fix building xfsprogs on 32-bit platforms')
to avoid autoconf hell - just take the tried & tested approach which is working
fine for us with LFS already.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoio: Adapt to >= 64-bit time_t
Sam James [Mon, 5 Feb 2024 23:23:20 +0000 (23:23 +0000)] 
io: Adapt to >= 64-bit time_t

We now require (at least) 64-bit time_t, so we need to adjust some printf
specifiers accordingly.

Unfortunately, we've stumbled upon a ridiculous C mmoment whereby there's
no neat format specifier (not even one of the inttypes ones) for time_t, so
we cast to intmax_t and use %jd.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoRemove use of LFS64 interfaces
Violet Purcell [Mon, 5 Feb 2024 23:23:19 +0000 (23:23 +0000)] 
Remove use of LFS64 interfaces

LFS64 interfaces are non-standard and are being removed in the upcoming musl
1.2.5. Setting _FILE_OFFSET_BITS=64 (which is currently being done) makes all
interfaces on glibc 64-bit by default, so using the LFS64 interfaces is
redundant. This commit replaces all occurences of off64_t with off_t,
stat64 with stat, and fstat64 with fstat.

Link: https://bugs.gentoo.org/907039
Cc: Felix Janda <felix.janda@posteo.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Violet Purcell <vimproved@inventati.org>
Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: inode recovery does not validate the recovered inode
Dave Chinner [Thu, 15 Feb 2024 08:27:54 +0000 (09:27 +0100)] 
xfs: inode recovery does not validate the recovered inode

Source kernel commit: 038ca189c0d2c1570b4d922f25b524007c85cf94

Discovered when trying to track down a weird recovery corruption
issue that wasn't detected at recovery time.

The specific corruption was a zero extent count field when big
extent counts are in use, and it turns out the dinode verifier
doesn't detect that specific corruption case, either. So fix it too.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: fix internal error from AGFL exhaustion
Omar Sandoval [Thu, 15 Feb 2024 08:27:54 +0000 (09:27 +0100)] 
xfs: fix internal error from AGFL exhaustion

Source kernel commit: f63a5b3769ad7659da4c0420751d78958ab97675

We've been seeing XFS errors like the following:

XFS: Internal error i != 1 at line 3526 of file fs/xfs/libxfs/xfs_btree.c.  Caller xfs_btree_insert+0x1ec/0x280
...
Call Trace:
xfs_corruption_error+0x94/0xa0
xfs_btree_insert+0x221/0x280
xfs_alloc_fixup_trees+0x104/0x3e0
xfs_alloc_ag_vextent_size+0x667/0x820
xfs_alloc_fix_freelist+0x5d9/0x750
xfs_free_extent_fix_freelist+0x65/0xa0
__xfs_free_extent+0x57/0x180
...

This is the XFS_IS_CORRUPT() check in xfs_btree_insert() when
xfs_btree_insrec() fails.

After converting this into a panic and dissecting the core dump, I found
that xfs_btree_insrec() is failing because it's trying to split a leaf
node in the cntbt when the AG free list is empty. In particular, it's
failing to get a block from the AGFL _while trying to refill the AGFL_.

If a single operation splits every level of the bnobt and the cntbt (and
the rmapbt if it is enabled) at once, the free list will be empty. Then,
when the next operation tries to refill the free list, it allocates
space. If the allocation does not use a full extent, it will need to
insert records for the remaining space in the bnobt and cntbt. And if
those new records go in full leaves, the leaves (and potentially more
nodes up to the old root) need to be split.

Fix it by accounting for the additional splits that may be required to
refill the free list in the calculation for the minimum free list size.

P.S. As far as I can tell, this bug has existed for a long time -- maybe
back to xfs-history commit afdf80ae7405 ("Add XFS_AG_MAXLEVELS macros
...") in April 1994! It requires a very unlucky sequence of events, and
in fact we didn't hit it until a particular sparse mmap workload updated
from 5.12 to 5.19. But this bug existed in 5.12, so it must've been
exposed by some other change in allocation or writeback patterns. It's
also much less likely to be hit with the rmapbt enabled, since that
increases the minimum free list size and is unlikely to split at the
same time as the bnobt and cntbt.

Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: abort intent items when recovery intents fail
Long Li [Thu, 15 Feb 2024 08:27:53 +0000 (09:27 +0100)] 
xfs: abort intent items when recovery intents fail

Source kernel commit: f8f9d952e42dd49ae534f61f2fa7ca0876cb9848

When recovering intents, we capture newly created intent items as part of
point, we forget to remove those newly created intent items from the AIL
and hang:

[root@localhost ~]# cat /proc/539/stack
[<0>] xfs_ail_push_all_sync+0x174/0x230
[<0>] xfs_unmount_flush_inodes+0x8d/0xd0
[<0>] xfs_mountfs+0x15f7/0x1e70
[<0>] xfs_fs_fill_super+0x10ec/0x1b20
[<0>] get_tree_bdev+0x3c8/0x730
[<0>] vfs_get_tree+0x89/0x2c0
[<0>] path_mount+0xecf/0x1800
[<0>] do_mount+0xf3/0x110
[<0>] __x64_sys_mount+0x154/0x1f0
[<0>] do_syscall_64+0x39/0x80
[<0>] entry_SYSCALL_64_after_hwframe+0x63/0xcd

When newly created intent items fail to commit via transaction, intent
recovery hasn't created done items for these newly created intent items,
so the capture structure is the sole owner of the captured intent items.
We must release them explicitly or else they leak:

unreferenced object 0xffff888016719108 (size 432):
comm "mount", pid 529, jiffies 4294706839 (age 144.463s)
hex dump (first 32 bytes):
08 91 71 16 80 88 ff ff 08 91 71 16 80 88 ff ff  ..q.......q.....
18 91 71 16 80 88 ff ff 18 91 71 16 80 88 ff ff  ..q.......q.....
backtrace:
[<ffffffff8230c68f>] xfs_efi_init+0x18f/0x1d0
[<ffffffff8230c720>] xfs_extent_free_create_intent+0x50/0x150
[<ffffffff821b671a>] xfs_defer_create_intents+0x16a/0x340
[<ffffffff821bac3e>] xfs_defer_ops_capture_and_commit+0x8e/0xad0
[<ffffffff82322bb9>] xfs_cui_item_recover+0x819/0x980
[<ffffffff823289b6>] xlog_recover_process_intents+0x246/0xb70
[<ffffffff8233249a>] xlog_recover_finish+0x8a/0x9a0
[<ffffffff822eeafb>] xfs_log_mount_finish+0x2bb/0x4a0
[<ffffffff822c0f4f>] xfs_mountfs+0x14bf/0x1e70
[<ffffffff822d1f80>] xfs_fs_fill_super+0x10d0/0x1b20
[<ffffffff81a21fa2>] get_tree_bdev+0x3d2/0x6d0
[<ffffffff81a1ee09>] vfs_get_tree+0x89/0x2c0
[<ffffffff81a9f35f>] path_mount+0xecf/0x1800
[<ffffffff81a9fd83>] do_mount+0xf3/0x110
[<ffffffff81aa00e4>] __x64_sys_mount+0x154/0x1f0
[<ffffffff83968739>] do_syscall_64+0x39/0x80

Fix the problem above by abort intent items that don't have a done item
when recovery intents fail.

Fixes: e6fff81e4870 ("xfs: proper replay of deferred ops queued during log recovery")
Signed-off-by: Long Li <leo.lilong@huawei.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: factor out xfs_defer_pending_abort
Long Li [Thu, 15 Feb 2024 08:27:53 +0000 (09:27 +0100)] 
xfs: factor out xfs_defer_pending_abort

Source kernel commit: 2a5db859c6825b5d50377dda9c3cc729c20cad43

Factor out xfs_defer_pending_abort() from xfs_defer_trans_abort(), which
not use transaction parameter, so it can be used after the transaction
life cycle.

Signed-off-by: Long Li <leo.lilong@huawei.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: invert the realtime summary cache
Omar Sandoval [Thu, 15 Feb 2024 08:27:53 +0000 (09:27 +0100)] 
xfs: invert the realtime summary cache

Source kernel commit: e23aaf450de733044a74bc95528f728478b61c2a

In commit 355e3532132b ("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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: simplify rt bitmap/summary block accessor functions
Darrick J. Wong [Thu, 15 Feb 2024 08:27:53 +0000 (09:27 +0100)] 
xfs: simplify rt bitmap/summary block accessor functions

Source kernel commit: e2cf427c91494ea0d1173a911090c39665c5fdef

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: simplify xfs_rtbuf_get calling conventions
Darrick J. Wong [Thu, 15 Feb 2024 08:27:52 +0000 (09:27 +0100)] 
xfs: simplify xfs_rtbuf_get calling conventions

Source kernel commit: 5b1d0ae9753f0654ab56c1e06155b3abf2919d71

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: cache last bitmap block in realtime allocator
Omar Sandoval [Thu, 15 Feb 2024 08:26:52 +0000 (09:26 +0100)] 
xfs: cache last bitmap block in realtime allocator

Source kernel commit: e94b53ff699c2674a9ec083342a5254866210ade

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: consolidate realtime allocation arguments
Dave Chinner [Thu, 15 Feb 2024 08:25:48 +0000 (09:25 +0100)] 
xfs: consolidate realtime allocation arguments

Source kernel commit: 41f33d82cfd310e344fc9183f02cc9e0d2d27663

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: use accessor functions for summary info words
Darrick J. Wong [Thu, 15 Feb 2024 08:25:48 +0000 (09:25 +0100)] 
xfs: use accessor functions for summary info words

Source kernel commit: 663b8db7b0256b81152b2f786e45ecf12bdf265f

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create helpers for rtsummary block/wordcount computations
Darrick J. Wong [Thu, 15 Feb 2024 08:25:48 +0000 (09:25 +0100)] 
xfs: create helpers for rtsummary block/wordcount computations

Source kernel commit: bd85af280de66a946022775a876edf0c553e3f35

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: use accessor functions for bitmap words
Darrick J. Wong [Thu, 15 Feb 2024 08:25:47 +0000 (09:25 +0100)] 
xfs: use accessor functions for bitmap words

Source kernel commit: 97e993830a1cdd86ad7d207308b9f55a00660edd

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create a helper to handle logging parts of rt bitmap/summary blocks
Darrick J. Wong [Thu, 15 Feb 2024 08:25:47 +0000 (09:25 +0100)] 
xfs: create a helper to handle logging parts of rt bitmap/summary blocks

Source kernel commit: 312d61021b8947446aa9ec80b78b9230e8cb3691

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create helpers for rtbitmap block/wordcount computations
Darrick J. Wong [Thu, 15 Feb 2024 08:25:47 +0000 (09:25 +0100)] 
xfs: create helpers for rtbitmap block/wordcount computations

Source kernel commit: d0448fe76ac1a9ccbce574577a4c82246d17eec4

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert to new timestamp accessors
Jeff Layton [Thu, 15 Feb 2024 08:25:40 +0000 (09:25 +0100)] 
xfs: convert to new timestamp accessors

Source kernel commit: 75d1e312bbbd175fa27ffdd4c4fe9e8cc7d047ec

Convert to using the new inode timestamp accessor functions.

[Carlos: Also partially port 077c212f0344ae and 12cd4402365166]
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://lore.kernel.org/r/20231004185347.80880-75-jlayton@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert rt summary macros to helpers
Darrick J. Wong [Thu, 15 Feb 2024 08:25:37 +0000 (09:25 +0100)] 
xfs: convert rt summary macros to helpers

Source kernel commit: 097b4b7b64ef67a4703b89fd4064480b61557fd5

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert open-coded xfs_rtword_t pointer accesses to helper
Darrick J. Wong [Mon, 12 Feb 2024 14:27:20 +0000 (15:27 +0100)] 
xfs: convert open-coded xfs_rtword_t pointer accesses to helper

Source kernel commit: a9948626849c2c65dfd201b5e9d855e62937de61

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros
Darrick J. Wong [Mon, 12 Feb 2024 14:26:20 +0000 (15:26 +0100)] 
xfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros

Source kernel commit: add3cddaea509071d01bf1d34df0d05db1a93a07

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert the rtbitmap block and bit macros to static inline functions
Darrick J. Wong [Mon, 12 Feb 2024 14:25:20 +0000 (15:25 +0100)] 
xfs: convert the rtbitmap block and bit macros to static inline functions

Source kernel commit: 90d98a6ada1da0f8797ff3f5adafd175dd8c0a81

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: use shifting and masking when converting rt extents, if possible
Darrick J. Wong [Mon, 12 Feb 2024 14:24:20 +0000 (15:24 +0100)] 
xfs: use shifting and masking when converting rt extents, if possible

Source kernel commit: ef5a83b7e597038d1c734ddb4bc00638082c2bf1

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

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create rt extent rounding helpers for realtime extent blocks
Darrick J. Wong [Mon, 12 Feb 2024 14:23:20 +0000 (15:23 +0100)] 
xfs: create rt extent rounding helpers for realtime extent blocks

Source kernel commit: 5f57f7309d9ab9d24d50c5707472b1ed8af4eabc

Create a pair of functions to round rtblock numbers up or down to the
nearest rt extent.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert do_div calls to xfs_rtb_to_rtx helper calls
Darrick J. Wong [Mon, 12 Feb 2024 14:22:20 +0000 (15:22 +0100)] 
xfs: convert do_div calls to xfs_rtb_to_rtx helper calls

Source kernel commit: 055641248f649b52620a5fe8774bea253690e057

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

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create helpers to convert rt block numbers to rt extent numbers
Darrick J. Wong [Mon, 12 Feb 2024 14:21:20 +0000 (15:21 +0100)] 
xfs: create helpers to convert rt block numbers to rt extent numbers

Source kernel commit: 5dc3a80d46a450481df7f7e9fe673ba3eb4514c3

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create a helper to convert extlen to rtextlen
Darrick J. Wong [Mon, 12 Feb 2024 14:20:20 +0000 (15:20 +0100)] 
xfs: create a helper to convert extlen to rtextlen

Source kernel commit: 2c2b981b737a519907429f62148bbd9e40e01132

Create a helper to compute the realtime extent (xfs_rtxlen_t) from an
extent length (xfs_extlen_t) value.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create a helper to compute leftovers of realtime extents
Darrick J. Wong [Mon, 12 Feb 2024 14:19:20 +0000 (15:19 +0100)] 
xfs: create a helper to compute leftovers of realtime extents

Source kernel commit: 68db60bf01c131c09bbe35adf43bd957a4c124bc

Create a helper to compute the misalignment between a file extent
(xfs_extlen_t) and a realtime extent.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: create a helper to convert rtextents to rtblocks
Darrick J. Wong [Mon, 12 Feb 2024 14:18:20 +0000 (15:18 +0100)] 
xfs: create a helper to convert rtextents to rtblocks

Source kernel commit: fa5a387230861116c2434c20d29fc4b3fd077d24

Create a helper to convert a realtime extent to a realtime block.  Later
on we'll change the helper to use bit shifts when possible.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert rt extent numbers to xfs_rtxnum_t
Darrick J. Wong [Mon, 12 Feb 2024 14:17:20 +0000 (15:17 +0100)] 
xfs: convert rt extent numbers to xfs_rtxnum_t

Source kernel commit: 2d5f216b77e33f9b503bd42998271da35d4b7055

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: rename xfs_verify_rtext to xfs_verify_rtbext
Darrick J. Wong [Mon, 12 Feb 2024 14:16:20 +0000 (15:16 +0100)] 
xfs: rename xfs_verify_rtext to xfs_verify_rtbext

Source kernel commit: 3d2b6d034f0feb7741b313f978a2fe45e917e1be

This helper function validates that a range of *blocks* in the
realtime section is completely contained within the realtime section.
It does /not/ validate ranges of *rtextents*.  Rename the function to
avoid suggesting that it does, and change the type of the @len parameter
since xfs_rtblock_t is a position unit, not a length unit.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert rt bitmap extent lengths to xfs_rtbxlen_t
Darrick J. Wong [Mon, 12 Feb 2024 14:15:20 +0000 (15:15 +0100)] 
xfs: convert rt bitmap extent lengths to xfs_rtbxlen_t

Source kernel commit: f29c3e745dc253bf9d9d06ddc36af1a534ba1dd0

XFS uses xfs_rtblock_t for many different uses, which makes it much more
difficult to perform a unit analysis on the codebase.  One of these
(ab)uses is when we need to store the length of a free space extent as
stored in the realtime bitmap.  Because there can be up to 2^64 realtime
extents in a filesystem, we need a new type that is larger than
xfs_rtxlen_t for callers that are querying the bitmap directly.  This
means scrub and growfs.

Create this type as "xfs_rtbxlen_t" and use it to store 64-bit rtx
lengths.  'b' stands for 'bitmap' or 'big'; reader's choice.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert rt bitmap/summary block numbers to xfs_fileoff_t
Darrick J. Wong [Mon, 12 Feb 2024 14:14:20 +0000 (15:14 +0100)] 
xfs: convert rt bitmap/summary block numbers to xfs_fileoff_t

Source kernel commit: 03f4de332e2e79db36ed2156fb2350480f142bec

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: convert xfs_extlen_t to xfs_rtxlen_t in the rt allocator
Darrick J. Wong [Mon, 12 Feb 2024 14:13:20 +0000 (15:13 +0100)] 
xfs: convert xfs_extlen_t to xfs_rtxlen_t in the rt allocator

Source kernel commit: a684c538bc14410565e8939393089670fa1e19dd

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: move the xfs_rtbitmap.c declarations to xfs_rtbitmap.h
Darrick J. Wong [Mon, 12 Feb 2024 14:13:16 +0000 (15:13 +0100)] 
xfs: move the xfs_rtbitmap.c declarations to xfs_rtbitmap.h

Source kernel commit: 13928113fc5b5e79c91796290a99ed991ac0efe2

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: fix units conversion error in xfs_bmap_del_extent_delay
Darrick J. Wong [Mon, 12 Feb 2024 14:02:05 +0000 (15:02 +0100)] 
xfs: fix units conversion error in xfs_bmap_del_extent_delay

Source kernel commit: ddd98076d5c075c8a6c49d9e6e8ee12844137f23

The unit conversions in this function do not make sense.  First we
convert a block count to bytes, then divide that bytes value by
rextsize, which is in blocks, to get an rt extent count.  You can't
divide bytes by blocks to get a (possibly multiblock) extent value.

Fortunately nobody uses delalloc on the rt volume so this hasn't
mattered.

Fixes: fa5c836ca8eb5 ("xfs: refactor xfs_bunmapi_cow")
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: hoist freeing of rt data fork extent mappings
Darrick J. Wong [Mon, 12 Feb 2024 14:01:33 +0000 (15:01 +0100)] 
xfs: hoist freeing of rt data fork extent mappings

Source kernel commit: 6c664484337b37fa0cf6e958f4019623e30d40f7

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: Carlos Maiolino <cem@kernel.org>
2 months agoxfs: bump max fsgeom struct version
Darrick J. Wong [Fri, 9 Feb 2024 09:15:17 +0000 (10:15 +0100)] 
xfs: bump max fsgeom struct version

Source kernel commit: 9488062805943c2d63350d3ef9e4dc093799789a

The latest version of the fs geometry structure is v5.  Bump this
constant so that xfs_db and mkfs calls to libxfs_fs_geometry will fill
out all the fields.

IOWs, this commit is a no-op for the kernel, but will be useful for
userspace reporting in later changes.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoxfsprogs: Release v6.6.0 v6.6.0
Carlos Maiolino [Mon, 5 Feb 2024 12:37:51 +0000 (13:37 +0100)] 
xfsprogs: Release v6.6.0

Update all the necessary files for a 6.6.0 release.

Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'scruball-service-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm...
Carlos Maiolino [Tue, 23 Jan 2024 10:31:17 +0000 (11:31 +0100)] 
Merge tag 'scruball-service-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfs_scrub_all: fixes for systemd services [v28.3 5/6]

This patchset ties up some problems in the xfs_scrub_all program and
service, which are essential for finding mounted filesystems to scrub
and creating the background service instances that do the scrub.

First, we need to fix various errors in pathname escaping, because
systemd does /not/ like slashes in service names.  Then, teach
xfs_scrub_all to deal with systemd restarts causing it to think that a
scrub has finished before the service actually finishes.  Finally,
implement a signal handler so that SIGINT (console ^C) and SIGTERM
(systemd stopping the service) shut down the xfs_scrub@ services
correctly.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'scrub-service-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm...
Carlos Maiolino [Tue, 23 Jan 2024 10:30:03 +0000 (11:30 +0100)] 
Merge tag 'scrub-service-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfs_scrub: fixes for systemd services [v28.3 4/6]

This series fixes deficiencies in the systemd services that were created
to manage background scans.  First, improve the debian packaging so that
services get installed at package install time.  Next, fix copyright and
spdx header omissions.

Finally, fix bugs in the mailer scripts so that scrub failures are
reported effectively.  Finally, fix xfs_scrub_all to deal with systemd
restarts causing it to think that a scrub has finished before the
service actually finishes.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'scrub-repair-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux...
Carlos Maiolino [Tue, 23 Jan 2024 10:28:50 +0000 (11:28 +0100)] 
Merge tag 'scrub-repair-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfs_scrub: fixes to the repair code [v28.3 3/6]

Now that we've landed the new kernel code, it's time to reorganize the
xfs_scrub code that handles repairs.  Clean up various naming warts and
misleading error messages.  Move the repair code to scrub/repair.c as
the first step.  Then, fix various issues in the repair code before we
start reorganizing things.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'scrub-fix-legalese-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux...
Carlos Maiolino [Tue, 23 Jan 2024 10:27:23 +0000 (11:27 +0100)] 
Merge tag 'scrub-fix-legalese-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfs_scrub: fix licensing and copyright notices [v28.3 2/6]

Fix various attribution problems in the xfs_scrub source code, such as
the author's contact information, out of date SPDX tags, and a rough
estimate of when the feature was under heavy development.  The most
egregious parts are the files that are missing license information
completely.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'xfsprogs-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux...
Carlos Maiolino [Tue, 23 Jan 2024 10:26:52 +0000 (11:26 +0100)] 
Merge tag 'xfsprogs-fixes-6.6_2024-01-11' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfsprogs: various bug fixes for 6.6 [1/6]

This series fixes a couple of bugs that I found in the userspace support
libraries.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
2 months agoMerge tag 'xfsprogs-fixes-6.6_2023-12-21' of https://git.kernel.org/pub/scm/linux...
Carlos Maiolino [Tue, 23 Jan 2024 10:21:52 +0000 (11:21 +0100)] 
Merge tag 'xfsprogs-fixes-6.6_2023-12-21' of https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfsprogs-dev into for-next

xfsprogs: various bug fixes for 6.6 [1/8]

This series fixes a couple of bugs that I found in the userspace support
libraries.

This has been running on the djcloud for months with no problems.  Enjoy!

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
3 months agoxfs_scrub_all: fix termination signal handling
Darrick J. Wong [Fri, 12 Jan 2024 02:07:07 +0000 (18:07 -0800)] 
xfs_scrub_all: fix termination signal handling

Currently, xfs_scrub_all does not handle termination signals well.
SIGTERM and SIGINT are left to their default handlers, which are
immediate termination of the process group in the case of SIGTERM and
raising KeyboardInterrupt in the case of SIGINT.

Terminating the process group is fine when the xfs_scrub processes are
direct children, but this completely doesn't work if we're farming the
work out to systemd services since we don't terminate the child service.
Instead, they keep going.

Raising KeyboardInterrupt doesn't work because once the main thread
calls sys.exit at the bottom of main(), it blocks in the python runtime
waiting for child threads to terminate.  There's no longer any context
to handle an exception, so the signal is ignored and no child processes
are killed.

In other words, if you try to kill a running xfs_scrub_all, chances are
good it won't kill the child xfs_scrub processes.  This is undesirable
and egregious since we actually have the ability to track and kill all
the subprocesses that we create.

Solve the subproblem of getting stuck in the python runtime by calling
it repeatedly until we no longer have subprocesses.  This means that the
main thread loops until all threads have exited.

Solve the subproblem of the signals doing the wrong thing by setting up
our own signal handler that can wake up the main thread and initiate
subprocess shutdown, no matter whether the subprocesses are systemd
services or directly fork/exec'd.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_all.cron: move to package data directory
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_all.cron: move to package data directory

cron jobs don't belong in /usr/lib.  Since the cron job is also
secondary to the systemd timer, it's really only provided as a courtesy
for distributions that don't use systemd.  Move it to @datadir@, aka
/usr/share/xfsprogs.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_all: simplify cleanup of run_killable
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_all: simplify cleanup of run_killable

Get rid of the nested lambda functions to simplify the code.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_fail: move executable script to /usr/libexec
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_fail: move executable script to /usr/libexec

Per FHS 3.0, non-PATH executable binaries are supposed to live under
/usr/libexec, not /usr/lib.  xfs_scrub_fail is an executable script,
so move it to libexec in case some distro some day tries to mount
/usr/lib as noexec or something.

Link: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch04s07.html
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_all: survive systemd restarts when waiting for services
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_all: survive systemd restarts when waiting for services

If xfs_scrub_all detects a running systemd, it will use it to invoke
xfs_scrub subprocesses in a sandboxed and resource-controlled
environment.  Unfortunately, if you happen to restart dbus or systemd
while it's running, you get this:

systemd[1]: Reexecuting.
xfs_scrub_all[9958]: Warning! D-Bus connection terminated.
xfs_scrub_all[9956]: Warning! D-Bus connection terminated.
xfs_scrub_all[9956]: Failed to wait for response: Connection reset by peer
xfs_scrub_all[9958]: Failed to wait for response: Connection reset by peer
xfs_scrub_all[9930]: Scrubbing / done, (err=1)
xfs_scrub_all[9930]: Scrubbing /storage done, (err=1)

The xfs_scrub units themselves are still running, it's just that the
`systemctl start' command that xfs_scrub_all uses to start and wait for
the unit lost its connection to dbus and hence is no longer monitoring
sub-services.

When this happens, we don't have great options -- systemctl doesn't have
a command to wait on an activating (aka running) unit.  Emulate the
functionality we normally get by polling the failed/active statuses.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_fail: advise recipients not to reply
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_fail: advise recipients not to reply

Advise recipients of the service failure emails that they should not try
to reply to the automated service message.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_all: fix argument passing when invoking xfs_scrub manually
Darrick J. Wong [Fri, 12 Jan 2024 02:07:06 +0000 (18:07 -0800)] 
xfs_scrub_all: fix argument passing when invoking xfs_scrub manually

Currently, xfs_scrub_all will try to invoke xfs_scrub with argv[1] being
"-n -x".  This of course is recognized by C getopt as a weird looking
string, not two individual arguments, and causes the child process to
exit with complaints about CLI usage.

What we really want is to split the string into a proper array and then
add them to the xfs_scrub command line.  The code here isn't strictly
correct, but as @scrub_args@ is controlled by us in the Makefile, it'll
do for now.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_fail: add content type header to failure emails
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
xfs_scrub_fail: add content type header to failure emails

Add content type and encoding metadata so that these emails display
correctly.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_fail: return the failure status of the mailer program
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
xfs_scrub_fail: return the failure status of the mailer program

We should return the exit code of the mailer program sending the scrub
failure reports, since that's much more important to anyone watching the
system.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: don't report media errors for space with unknowable owner
Darrick J. Wong [Fri, 12 Jan 2024 02:07:04 +0000 (18:07 -0800)] 
xfs_scrub: don't report media errors for space with unknowable owner

On filesystems that don't have the reverse mapping feature enabled, the
GETFSMAP call cannot tell us much about the owner of a space extent --
we're limited to static fs metadata, free space, or "unknown".  In this
case, nothing is corrupt, so str_corrupt is not an appropriate logging
function.  Relax this to str_info so that the user sees a notice that
media errors have been found so that the user knows something bad
happened even if the directory tree walker cannot find the file owning
the space where the media error was found.

Filesystems with rmap enabled are never supposed to return OWN_UNKNOWN
from a GETFSMAP report, so continue to report that as a corruption.
This fixes a regression in xfs/556.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: update copyright years for scrub/ files
Darrick J. Wong [Fri, 12 Jan 2024 02:07:04 +0000 (18:07 -0800)] 
xfs_scrub: update copyright years for scrub/ files

Update the copyright years in the scrub/ source code files.  This isn't
required, but it's helpful to remind myself just how long it's taken to
develop this feature.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_fail: fix sendmail detection
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
xfs_scrub_fail: fix sendmail detection

This script emails the results of failed scrub runs to root.  We
shouldn't be hardcoding the path to the mailer program because distros
can change the path according to their whim.  Modify this script to use
command -v to find the program.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: flush stdout after printing to it
Darrick J. Wong [Fri, 12 Jan 2024 02:07:04 +0000 (18:07 -0800)] 
xfs_scrub: flush stdout after printing to it

Make sure we flush stdout after printf'ing to it, especially before we
start any operation that could take a while to complete.  Most of scrub
already does this, but we missed a couple of spots.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: add missing license and copyright information
Darrick J. Wong [Fri, 12 Jan 2024 02:07:04 +0000 (18:07 -0800)] 
xfs_scrub: add missing license and copyright information

These files are missing the required SPDX license and copyright
information.  Add them.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
3 months agoxfs_scrub: fix pathname escaping across all service definitions
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
xfs_scrub: fix pathname escaping across all service definitions

systemd services provide an "instance name" that can be associated with
a particular invocation of a service.  This allows service users to
invoke multiple copies of a service, each with a unique string.  For
xfs_scrub, we pass the mountpoint of the filesystem as the instance
name.  However, systemd services aren't supposed to have slashes in
them, so we're supposed to escape them.

The canonical escaping scheme for pathnames is defined by the
systemd-escape --path command.  Unfortunately, we've been adding our own
opinionated sauce for years, to work around the fact that --path didn't
exist in systemd before January 2017.  The special sauce is incorrect,
and we no longer care about systemd of 7 years past.

Clean up this mess by following the systemd escaping scheme throughout
the service units.  Now we can use the '%f' specifier in them, which
makes things a lot less complicated.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: fix author and spdx headers on scrub/ files
Darrick J. Wong [Fri, 12 Jan 2024 02:07:04 +0000 (18:07 -0800)] 
xfs_scrub: fix author and spdx headers on scrub/ files

Fix the spdx tags to match current practice, and update the author
contact information.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub_all: escape service names consistently
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
xfs_scrub_all: escape service names consistently

This program is not consistent as to whether or not it escapes the
pathname that is being used as the xfs_scrub service instance name.
Fix it to be consistent, and to fall back to direct invocation if
escaping doesn't work.  The escaping itself is also broken, but we'll
fix that in the next patch.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agodebian: install scrub services with dh_installsystemd
Darrick J. Wong [Fri, 12 Jan 2024 02:07:05 +0000 (18:07 -0800)] 
debian: install scrub services with dh_installsystemd

Use dh_installsystemd to handle the installation and activation of the
scrub systemd services.  This requires bumping the compat version to 11.
Note that the services are /not/ activated on installation.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agolibxfs: fix krealloc to allow freeing data
Darrick J. Wong [Fri, 12 Jan 2024 02:07:03 +0000 (18:07 -0800)] 
libxfs: fix krealloc to allow freeing data

A recent refactoring to xfs_idata_realloc in the kernel made it depend
on krealloc returning NULL if the new size is zero.  The xfsprogs
wrapper instead aborts, so we need to make it follow the kernel
behavior.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
3 months agoxfs_db: report the device associated with each io cursor
Darrick J. Wong [Wed, 20 Dec 2023 16:53:44 +0000 (08:53 -0800)] 
xfs_db: report the device associated with each io cursor

When db is reporting on an io cursor, have it print out the device
that the cursor is pointing to.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: try to use XFS_SCRUB_IFLAG_FORCE_REBUILD
Darrick J. Wong [Wed, 20 Dec 2023 16:53:47 +0000 (08:53 -0800)] 
xfs_scrub: try to use XFS_SCRUB_IFLAG_FORCE_REBUILD

Now that we have a FORCE_REBUILD flag to the scrub ioctl, try to use
that over the (much noisier) error injection knob, which may or may not
even be enabled in the kernel config.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_copy: actually do directio writes to block devices
Darrick J. Wong [Wed, 20 Dec 2023 16:53:43 +0000 (08:53 -0800)] 
xfs_copy: actually do directio writes to block devices

Not sure why block device targets don't get O_DIRECT in !buffered mode,
but it's misleading when the copy completes instantly only to stall
forever due to fsync-on-close.  Adjust the "write last sector" code to
allocate a properly aligned buffer.

In removing the onstack buffer for EOD writes, this also corrects the
buffer being larger than necessary -- the old code declared an array of
32768 pointers, whereas all we really need is an aligned 32768-byte
buffer.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: don't retry unsupported optimizations
Darrick J. Wong [Wed, 20 Dec 2023 16:53:46 +0000 (08:53 -0800)] 
xfs_scrub: don't retry unsupported optimizations

If the kernel says it doesn't support optimizing a data structure, we
should mark it done and move on.  This is much better than requeuing the
repair, in which case it will likely keep failing.  Eventually these
requeued repairs end up in the single-threaded last resort at the end of
phase 4, which makes things /very/ slow.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_copy: distinguish short writes to EOD from runtime errors
Darrick J. Wong [Wed, 20 Dec 2023 16:53:43 +0000 (08:53 -0800)] 
xfs_copy: distinguish short writes to EOD from runtime errors

Detect short writes to the end of the destination device and report
them.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_scrub: handle spurious wakeups in scan_fs_tree
Darrick J. Wong [Wed, 20 Dec 2023 16:53:46 +0000 (08:53 -0800)] 
xfs_scrub: handle spurious wakeups in scan_fs_tree

Coverity reminded me that the pthread_cond_wait can wake up and return
without the predicate variable (sft.nr_dirs > 0) actually changing.
Therefore, one has to retest the condition after each wakeup.

Coverity-id: 1554280
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
3 months agoxfs_io: support passing the FORCE_REBUILD flag to online repair
Darrick J. Wong [Wed, 20 Dec 2023 16:53:46 +0000 (08:53 -0800)] 
xfs_io: support passing the FORCE_REBUILD flag to online repair

Add CLI options to the scrubv and repair commands so that the user can
pass FORCE_REBUILD to force the kernel to rebuild metadata.

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