Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xfsprogs for openSUSE:Factory checked in at 2026-03-19 17:36:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xfsprogs (Old) and /work/SRC/openSUSE:Factory/.xfsprogs.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xfsprogs" Thu Mar 19 17:36:08 2026 rev:95 rq:1340909 version:6.19.0 Changes: -------- --- /work/SRC/openSUSE:Factory/xfsprogs/xfsprogs.changes 2026-03-10 17:47:13.000447942 +0100 +++ /work/SRC/openSUSE:Factory/.xfsprogs.new.8177/xfsprogs.changes 2026-03-19 17:37:23.309837435 +0100 @@ -1,0 +2,22 @@ +Wed Mar 18 13:15:22 UTC 2026 - Anthony Iliopoulos <[email protected]> + +- update to 6.19.0 + - xfs_io: print more realtime subvolume related information in statfs + - xfs_io: fix fsmap help + - mkfs: fix log sunit automatic configuration + - mkfs: fix protofile data corruption when in/out file block sizes don't match + - libxfs: fix data corruption bug in libxfs_file_write + - misc: fix a few memory leaks + - debian: Drop Uploader: Bastian Germann + - mkfs.xfs fix sunit size on 512e and 4kN disks. + - xfs_scrub_all: fix non-service-mode arguments to xfs_scrub + - mkfs: remove unnecessary return value affectation + - xfs: use blkdev_report_zones_cached() + - include blkzoned.h in platform_defs.h + - debian: don't explicitly reload systemd from postinst + - xfs_mdrestore: fix restoration on filesystems with 4k sectors + - mkfs: quiet down warning about insufficient write zones + - xfs_logprint: print log data to the screen in host-endian order + - mkfs: set rtstart from user-specified dblocks + + ------------------------------------------------------------------- Old: ---- xfsprogs-6.18.0.tar.sign xfsprogs-6.18.0.tar.xz New: ---- xfsprogs-6.19.0.tar.sign xfsprogs-6.19.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xfsprogs.spec ++++++ --- /var/tmp/diff_new_pack.aDYFWg/_old 2026-03-19 17:37:24.129871409 +0100 +++ /var/tmp/diff_new_pack.aDYFWg/_new 2026-03-19 17:37:24.137871740 +0100 @@ -25,7 +25,7 @@ %endif %define libname libhandle1 Name: xfsprogs -Version: 6.18.0 +Version: 6.19.0 Release: 0 Summary: Utilities for managing the XFS file system License: GPL-2.0-or-later ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.aDYFWg/_old 2026-03-19 17:37:24.169873067 +0100 +++ /var/tmp/diff_new_pack.aDYFWg/_new 2026-03-19 17:37:24.177873398 +0100 @@ -1,5 +1,5 @@ -mtime: 1773049585 -commit: 669dc3bddcde979d88af78f3455285828fbd250f6eef6c73964e40e32024a826 +mtime: 1773840713 +commit: 92ffc932c7d27194342138f11ae604eb664ba13f413cc0763c34209057269804 url: https://src.opensuse.org/ailiopoulos/xfsprogs revision: factory ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-03-18 14:32:33.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ xfsprogs-6.18.0.tar.xz -> xfsprogs-6.19.0.tar.xz ++++++ ++++ 4378 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/.gitcensus new/xfsprogs-6.19.0/.gitcensus --- old/xfsprogs-6.18.0/.gitcensus 2025-12-30 18:15:52.000000000 +0100 +++ new/xfsprogs-6.19.0/.gitcensus 2026-03-18 11:54:07.000000000 +0100 @@ -286,6 +286,8 @@ libfrog/util.h libfrog/workqueue.c libfrog/workqueue.h +libfrog/zones.c +libfrog/zones.h libhandle/Makefile libhandle/handle.c libhandle/jdm.c diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/VERSION new/xfsprogs-6.19.0/VERSION --- old/xfsprogs-6.18.0/VERSION 2025-12-24 16:33:56.000000000 +0100 +++ new/xfsprogs-6.19.0/VERSION 2026-03-18 09:49:20.000000000 +0100 @@ -2,6 +2,6 @@ # This file is used by configure to get version information # PKG_MAJOR=6 -PKG_MINOR=18 +PKG_MINOR=19 PKG_REVISION=0 PKG_BUILD=1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/configure.ac new/xfsprogs-6.19.0/configure.ac --- old/xfsprogs-6.18.0/configure.ac 2025-12-24 16:34:32.000000000 +0100 +++ new/xfsprogs-6.19.0/configure.ac 2026-03-18 09:49:35.000000000 +0100 @@ -1,4 +1,4 @@ -AC_INIT([xfsprogs],[6.18.0],[[email protected]]) +AC_INIT([xfsprogs],[6.19.0],[[email protected]]) AC_PREREQ([2.69]) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/debian/changelog new/xfsprogs-6.19.0/debian/changelog --- old/xfsprogs-6.18.0/debian/changelog 2025-12-24 16:34:32.000000000 +0100 +++ new/xfsprogs-6.19.0/debian/changelog 2026-03-18 09:49:35.000000000 +0100 @@ -1,3 +1,9 @@ +xfsprogs (6.19.0-1) unstable; urgency=low + + * New upstream release + + -- Nathan Scott <[email protected]> Wed, 18 Mar 2026 09:49:35 +0100 + xfsprogs (6.18.0-1) unstable; urgency=low * New upstream release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/debian/control new/xfsprogs-6.19.0/debian/control --- old/xfsprogs-6.18.0/debian/control 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/debian/control 2026-03-12 19:35:19.000000000 +0100 @@ -2,7 +2,7 @@ Section: admin Priority: optional Maintainer: XFS Development Team <[email protected]> -Uploaders: Nathan Scott <[email protected]>, Anibal Monsalve Salazar <[email protected]>, Bastian Germann <[email protected]> +Uploaders: Nathan Scott <[email protected]>, Anibal Monsalve Salazar <[email protected]> Build-Depends: libinih-dev (>= 53), uuid-dev, debhelper (>= 12), gettext, libtool, libedit-dev, libblkid-dev (>= 2.17), linux-libc-dev, libdevmapper-dev, libicu-dev, pkg-config, liburcu-dev, systemd-dev | systemd (<< 253-2~) Standards-Version: 4.0.0 Homepage: https://xfs.wiki.kernel.org/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/debian/postinst new/xfsprogs-6.19.0/debian/postinst --- old/xfsprogs-6.18.0/debian/postinst 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/debian/postinst 2026-03-12 19:35:19.000000000 +0100 @@ -8,9 +8,6 @@ then update-initramfs -u fi - if [ -x /bin/systemctl ]; then - /bin/systemctl daemon-reload 2>&1 || true - fi ;; abort-upgrade|abort-remove|abort-deconfigure) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/doc/CHANGES new/xfsprogs-6.19.0/doc/CHANGES --- old/xfsprogs-6.18.0/doc/CHANGES 2025-12-24 16:34:32.000000000 +0100 +++ new/xfsprogs-6.19.0/doc/CHANGES 2026-03-18 09:49:35.000000000 +0100 @@ -1,3 +1,22 @@ +xfsprogs-6.19.0 (18 Mar 2026) + xfs_io: print more realtime subvolume related information in statfs (Christoph Hellwig) + xfs_io: fix fsmap help (Christoph Hellwig) + mkfs: fix log sunit automatic configuration (Darrick J. Wong) + mkfs: fix protofile data corruption when in/out file block sizes don't match (Darrick J. Wong) + libxfs: fix data corruption bug in libxfs_file_write (Darrick J. Wong) + misc: fix a few memory leaks (Darrick J. Wong) + debian: Drop Uploader: Bastian Germann (Bastian Germann) + mkfs.xfs fix sunit size on 512e and 4kN disks. (Lukas Herbolt) + xfs_scrub_all: fix non-service-mode arguments to xfs_scrub (Darrick J. Wong) + mkfs: remove unnecessary return value affectation (Damien Le Moal) + xfs: use blkdev_report_zones_cached() (Damien Le Moal) + include blkzoned.h in platform_defs.h (Christoph Hellwig) + debian: don't explicitly reload systemd from postinst (Darrick J. Wong) + xfs_mdrestore: fix restoration on filesystems with 4k sectors (Darrick J. Wong) + mkfs: quiet down warning about insufficient write zones (Darrick J. Wong) + xfs_logprint: print log data to the screen in host-endian order (Darrick J. Wong) + mkfs: set rtstart from user-specified dblocks (Darrick J. Wong) + xfsprogs-6.18.0 (24 Dec 2025) mkfs: adjust_nr_zones for zoned file system on conventional devices (Christoph Hellwig) xfs_logprint: fix pointer bug (Darrick J. Wong) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/include/libxlog.h new/xfsprogs-6.19.0/include/libxlog.h --- old/xfsprogs-6.18.0/include/libxlog.h 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/include/libxlog.h 2026-03-12 19:35:19.000000000 +0100 @@ -99,9 +99,9 @@ extern int xlog_recover_do_trans(struct xlog *log, struct xlog_recover *trans, int pass); extern int xlog_header_check_recover(xfs_mount_t *mp, - xlog_rec_header_t *head); + struct xlog_rec_header *head); extern int xlog_header_check_mount(xfs_mount_t *mp, - xlog_rec_header_t *head); + struct xlog_rec_header *head); #define xlog_assign_atomic_lsn(l,a,b) ((void) 0) #define xlog_assign_grant_head(l,a,b) ((void) 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/include/platform_defs.h new/xfsprogs-6.19.0/include/platform_defs.h --- old/xfsprogs-6.18.0/include/platform_defs.h 2025-10-20 16:17:55.000000000 +0200 +++ new/xfsprogs-6.19.0/include/platform_defs.h 2026-03-12 19:35:19.000000000 +0100 @@ -24,6 +24,7 @@ #include <stdbool.h> #include <libgen.h> #include <urcu.h> +#include <linux/blkzoned.h> /* long and pointer must be either 32 bit or 64 bit */ #define BITS_PER_LONG (sizeof(long) * CHAR_BIT) @@ -307,4 +308,18 @@ size_t iov_len; }; +/* + * Local definitions for the new cached report zones added in Linux 6.19 in case + * the system <linux/blkzoned.h> doesn't provide them yet. + */ +#ifndef BLKREPORTZONEV2 +#define BLKREPORTZONEV2 _IOWR(0x12, 142, struct blk_zone_report) +#endif +#ifndef BLK_ZONE_REP_CACHED +#define BLK_ZONE_REP_CACHED (1U << 31) +#endif +#ifndef BLK_ZONE_COND_ACTIVE +#define BLK_ZONE_COND_ACTIVE 0xff +#endif + #endif /* __XFS_PLATFORM_DEFS_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/io/fsmap.c new/xfsprogs-6.19.0/io/fsmap.c --- old/xfsprogs-6.18.0/io/fsmap.c 2025-06-23 13:48:41.000000000 +0200 +++ new/xfsprogs-6.19.0/io/fsmap.c 2026-03-12 19:35:19.000000000 +0100 @@ -24,7 +24,8 @@ "\n" " Prints the block mapping for the filesystem hosting the current file" "\n" -" fsmap prints the map of disk blocks used by the whole filesystem.\n" +" fsmap prints the map of disk blocks used on a given filesystem.\n" +" By default, the blocks for all devices are printed.\n" " When possible, owner and offset information will be included in the\n" " space report.\n" "\n" @@ -32,7 +33,7 @@ " extent: major:minor [startblock..endblock]: owner startoffset..endoffset length\n" " The owner field is either an inode number or a special value.\n" " All the file offsets and disk blocks are in units of 512-byte blocks.\n" -" -d -- query only the data device (default).\n" +" -d -- query only the data device.\n" " -l -- query only the log device.\n" " -r -- query only the realtime device.\n" " -n -- query n extents at a time.\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/io/stat.c new/xfsprogs-6.19.0/io/stat.c --- old/xfsprogs-6.18.0/io/stat.c 2025-10-20 16:17:55.000000000 +0200 +++ new/xfsprogs-6.19.0/io/stat.c 2026-03-12 19:35:19.000000000 +0100 @@ -282,6 +282,12 @@ printf(_("geom.rtextsize = %u\n"), fsgeo.rtextsize); printf(_("geom.sunit = %u\n"), fsgeo.sunit); printf(_("geom.swidth = %u\n"), fsgeo.swidth); + printf(_("geom.rgextents = %u\n"), fsgeo.rgextents); + printf(_("geom.rgcount = %u\n"), fsgeo.rgcount); + printf(_("geom.rtstart = %llu\n"), + (unsigned long long)fsgeo.rtstart); + printf(_("geom.rtreserved = %llu\n"), + (unsigned long long)fsgeo.rtreserved); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libfrog/Makefile new/xfsprogs-6.19.0/libfrog/Makefile --- old/xfsprogs-6.18.0/libfrog/Makefile 2025-10-20 16:17:55.000000000 +0200 +++ new/xfsprogs-6.19.0/libfrog/Makefile 2026-03-12 19:35:19.000000000 +0100 @@ -35,7 +35,8 @@ randbytes.c \ scrub.c \ util.c \ -workqueue.c +workqueue.c \ +zones.c HFILES = \ avl64.h \ @@ -65,7 +66,8 @@ randbytes.h \ scrub.h \ statx.h \ -workqueue.h +workqueue.h \ +zones.h GETTEXT_PY = \ gettext.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libfrog/zones.c new/xfsprogs-6.19.0/libfrog/zones.c --- old/xfsprogs-6.18.0/libfrog/zones.c 1970-01-01 01:00:00.000000000 +0100 +++ new/xfsprogs-6.19.0/libfrog/zones.c 2026-03-12 19:35:19.000000000 +0100 @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Western Digital Corporation or its affiliates. + */ +#include "platform_defs.h" +#include "atomic.h" +#include "libfrog/zones.h" +#include <sys/ioctl.h> + +/* random size that allows efficient processing */ +#define ZONES_PER_REPORT 16384 + +static atomic_t cached_reporting_disabled; + +struct xfrog_zone_report * +xfrog_report_zones( + int fd, + uint64_t sector, + struct xfrog_zone_report *rep) +{ + if (!rep) { + rep = calloc(1, struct_size(rep, zones, ZONES_PER_REPORT)); + if (!rep) { + fprintf(stderr, "%s\n", +_("Failed to allocate memory for reporting zones.")); + return NULL; + } + } + + /* + * Try cached report zones first. If this fails, fallback to the regular + * (slower) report zones. + */ + rep->rep.sector = sector; + rep->rep.nr_zones = ZONES_PER_REPORT; + + if (atomic_read(&cached_reporting_disabled)) + goto uncached; + + rep->rep.flags = BLK_ZONE_REP_CACHED; + if (ioctl(fd, BLKREPORTZONEV2, &rep->rep)) { + atomic_inc(&cached_reporting_disabled); + goto uncached; + } + + return rep; + +uncached: + rep->rep.flags = 0; + if (ioctl(fd, BLKREPORTZONE, rep)) { + fprintf(stderr, "%s %s\n", +_("ioctl(BLKREPORTZONE) failed:\n"), + strerror(-errno)); + free(rep); + return NULL; + } + + return rep; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libfrog/zones.h new/xfsprogs-6.19.0/libfrog/zones.h --- old/xfsprogs-6.18.0/libfrog/zones.h 1970-01-01 01:00:00.000000000 +0100 +++ new/xfsprogs-6.19.0/libfrog/zones.h 2026-03-12 19:35:19.000000000 +0100 @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025, Western Digital Corporation or its affiliates. + */ +#ifndef __LIBFROG_ZONES_H__ +#define __LIBFROG_ZONES_H__ + +struct xfrog_zone_report { + struct blk_zone_report rep; + struct blk_zone zones[]; +}; + +struct xfrog_zone_report * +xfrog_report_zones(int fd, uint64_t sector, struct xfrog_zone_report *rep); + +#endif /* __LIBFROG_ZONES_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/rdwr.c new/xfsprogs-6.19.0/libxfs/rdwr.c --- old/xfsprogs-6.18.0/libxfs/rdwr.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/rdwr.c 2026-03-12 19:35:19.000000000 +0100 @@ -1297,7 +1297,7 @@ libxfs_get_block_t *nextfunc, void *private) { - xlog_rec_header_t *head = (xlog_rec_header_t *)caddr; + struct xlog_rec_header *head = (struct xlog_rec_header *)caddr; char *p = caddr; __be32 cycle_lsn; int i, len; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/util.c new/xfsprogs-6.19.0/libxfs/util.c --- old/xfsprogs-6.18.0/libxfs/util.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/util.c 2026-03-12 19:35:19.000000000 +0100 @@ -650,7 +650,8 @@ /* * Write a buffer to a file on the data device. There must not be sparse holes - * or unwritten extents. + * or unwritten extents, and the blocks underneath the file range will be + * completely overwritten. */ int libxfs_file_write( @@ -697,7 +698,7 @@ if (block_off > 0) memset((char *)bp->b_addr, 0, block_off); count = min(len, XFS_FSB_TO_B(mp, map.br_blockcount)); - memmove(bp->b_addr, buf + block_off, count); + memmove(bp->b_addr + block_off, buf, count); bcount = BBTOB(bp->b_length); if (count < bcount) memset((char *)bp->b_addr + block_off + count, 0, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_errortag.h new/xfsprogs-6.19.0/libxfs/xfs_errortag.h --- old/xfsprogs-6.18.0/libxfs/xfs_errortag.h 2025-11-24 15:24:27.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_errortag.h 2026-03-12 19:35:19.000000000 +0100 @@ -73,7 +73,8 @@ #define XFS_ERRTAG_WRITE_DELAY_MS 43 #define XFS_ERRTAG_EXCHMAPS_FINISH_ONE 44 #define XFS_ERRTAG_METAFILE_RESV_CRITICAL 45 -#define XFS_ERRTAG_MAX 46 +#define XFS_ERRTAG_FORCE_ZERO_RANGE 46 +#define XFS_ERRTAG_MAX 47 /* * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. @@ -133,7 +134,8 @@ XFS_ERRTAG(WB_DELAY_MS, wb_delay_ms, 3000) \ XFS_ERRTAG(WRITE_DELAY_MS, write_delay_ms, 3000) \ XFS_ERRTAG(EXCHMAPS_FINISH_ONE, exchmaps_finish_one, 1) \ -XFS_ERRTAG(METAFILE_RESV_CRITICAL, metafile_resv_crit, 4) +XFS_ERRTAG(METAFILE_RESV_CRITICAL, metafile_resv_crit, 4) \ +XFS_ERRTAG(FORCE_ZERO_RANGE, force_zero_range, 4) #endif /* XFS_ERRTAG */ #endif /* __XFS_ERRORTAG_H_ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_group.h new/xfsprogs-6.19.0/libxfs/xfs_group.h --- old/xfsprogs-6.18.0/libxfs/xfs_group.h 2025-06-23 13:48:41.000000000 +0200 +++ new/xfsprogs-6.19.0/libxfs/xfs_group.h 2026-03-12 19:35:19.000000000 +0100 @@ -98,6 +98,15 @@ return xg->xg_mount->m_groups[xg->xg_type].blocks; } +static inline xfs_rfsblock_t +xfs_groups_to_rfsbs( + struct xfs_mount *mp, + uint32_t nr_groups, + enum xfs_group_type type) +{ + return (xfs_rfsblock_t)mp->m_groups[type].blocks * nr_groups; +} + static inline xfs_fsblock_t xfs_group_start_fsb( struct xfs_group *xg) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_ialloc.c new/xfsprogs-6.19.0/libxfs/xfs_ialloc.c --- old/xfsprogs-6.18.0/libxfs/xfs_ialloc.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_ialloc.c 2026-03-12 19:35:19.000000000 +0100 @@ -843,15 +843,16 @@ * invalid inode records, such as records that start at agbno 0 * or extend beyond the AG. * - * Set min agbno to the first aligned, non-zero agbno and max to - * the last aligned agbno that is at least one full chunk from - * the end of the AG. + * Set min agbno to the first chunk aligned, non-zero agbno and + * max to one less than the last chunk aligned agbno from the + * end of the AG. We subtract 1 from max so that the cluster + * allocation alignment takes over and allows allocation within + * the last full inode chunk in the AG. */ args.min_agbno = args.mp->m_sb.sb_inoalignmt; args.max_agbno = round_down(xfs_ag_block_count(args.mp, pag_agno(pag)), - args.mp->m_sb.sb_inoalignmt) - - igeo->ialloc_blks; + args.mp->m_sb.sb_inoalignmt) - 1; error = xfs_alloc_vextent_near_bno(&args, xfs_agbno_to_fsb(pag, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_log_format.h new/xfsprogs-6.19.0/libxfs/xfs_log_format.h --- old/xfsprogs-6.18.0/libxfs/xfs_log_format.h 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_log_format.h 2026-03-12 19:35:19.000000000 +0100 @@ -31,6 +31,7 @@ #define XLOG_BIG_RECORD_BSIZE (32*1024) /* 32k buffers */ #define XLOG_MAX_RECORD_BSIZE (256*1024) #define XLOG_HEADER_CYCLE_SIZE (32*1024) /* cycle data in header */ +#define XLOG_CYCLE_DATA_SIZE (XLOG_HEADER_CYCLE_SIZE / BBSIZE) #define XLOG_MIN_RECORD_BSHIFT 14 /* 16384 == 1 << 14 */ #define XLOG_BIG_RECORD_BSHIFT 15 /* 32k == 1 << 15 */ #define XLOG_MAX_RECORD_BSHIFT 18 /* 256k == 1 << 18 */ @@ -125,7 +126,17 @@ #define XLOG_FMT XLOG_FMT_LINUX_LE #endif -typedef struct xlog_rec_header { +struct xlog_rec_ext_header { + __be32 xh_cycle; /* write cycle of log */ + __be32 xh_cycle_data[XLOG_CYCLE_DATA_SIZE]; + __u8 xh_reserved[252]; +}; + +/* actual ext header payload size for checksumming */ +#define XLOG_REC_EXT_SIZE \ + offsetofend(struct xlog_rec_ext_header, xh_cycle_data) + +struct xlog_rec_header { __be32 h_magicno; /* log record (LR) identifier : 4 */ __be32 h_cycle; /* write cycle of log : 4 */ __be32 h_version; /* LR version : 4 */ @@ -135,7 +146,7 @@ __le32 h_crc; /* crc of log record : 4 */ __be32 h_prev_block; /* block number to previous LR : 4 */ __be32 h_num_logops; /* number of log operations in this LR : 4 */ - __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; + __be32 h_cycle_data[XLOG_CYCLE_DATA_SIZE]; /* fields added by the Linux port: */ __be32 h_fmt; /* format of log record : 4 */ @@ -160,30 +171,19 @@ * (little-endian) architectures. */ __u32 h_pad0; -} xlog_rec_header_t; + + __u8 h_reserved[184]; + struct xlog_rec_ext_header h_ext[]; +}; #ifdef __i386__ #define XLOG_REC_SIZE offsetofend(struct xlog_rec_header, h_size) -#define XLOG_REC_SIZE_OTHER sizeof(struct xlog_rec_header) +#define XLOG_REC_SIZE_OTHER offsetofend(struct xlog_rec_header, h_pad0) #else -#define XLOG_REC_SIZE sizeof(struct xlog_rec_header) +#define XLOG_REC_SIZE offsetofend(struct xlog_rec_header, h_pad0) #define XLOG_REC_SIZE_OTHER offsetofend(struct xlog_rec_header, h_size) #endif /* __i386__ */ -typedef struct xlog_rec_ext_header { - __be32 xh_cycle; /* write cycle of log : 4 */ - __be32 xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /* : 256 */ -} xlog_rec_ext_header_t; - -/* - * Quite misnamed, because this union lays out the actual on-disk log buffer. - */ -typedef union xlog_in_core2 { - xlog_rec_header_t hic_header; - xlog_rec_ext_header_t hic_xheader; - char hic_sector[XLOG_HEADER_SIZE]; -} xlog_in_core_2_t; - /* not an on-disk structure, but needed by log recovery in userspace */ struct xfs_log_iovec { void *i_addr; /* beginning address of region */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_ondisk.h new/xfsprogs-6.19.0/libxfs/xfs_ondisk.h --- old/xfsprogs-6.18.0/libxfs/xfs_ondisk.h 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_ondisk.h 2026-03-12 19:35:19.000000000 +0100 @@ -174,9 +174,11 @@ XFS_CHECK_STRUCT_SIZE(struct xfs_rud_log_format, 16); XFS_CHECK_STRUCT_SIZE(struct xfs_map_extent, 32); XFS_CHECK_STRUCT_SIZE(struct xfs_phys_extent, 16); - XFS_CHECK_STRUCT_SIZE(struct xlog_rec_header, 328); - XFS_CHECK_STRUCT_SIZE(struct xlog_rec_ext_header, 260); + XFS_CHECK_STRUCT_SIZE(struct xlog_rec_header, 512); + XFS_CHECK_STRUCT_SIZE(struct xlog_rec_ext_header, 512); + XFS_CHECK_OFFSET(struct xlog_rec_header, h_reserved, 328); + XFS_CHECK_OFFSET(struct xlog_rec_ext_header, xh_reserved, 260); XFS_CHECK_OFFSET(struct xfs_bui_log_format, bui_extents, 16); XFS_CHECK_OFFSET(struct xfs_cui_log_format, cui_extents, 16); XFS_CHECK_OFFSET(struct xfs_rui_log_format, rui_extents, 16); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_quota_defs.h new/xfsprogs-6.19.0/libxfs/xfs_quota_defs.h --- old/xfsprogs-6.18.0/libxfs/xfs_quota_defs.h 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/libxfs/xfs_quota_defs.h 2026-03-12 19:35:19.000000000 +0100 @@ -29,11 +29,9 @@ * flags for q_flags field in the dquot. */ #define XFS_DQFLAG_DIRTY (1u << 0) /* dquot is dirty */ -#define XFS_DQFLAG_FREEING (1u << 1) /* dquot is being torn down */ #define XFS_DQFLAG_STRINGS \ - { XFS_DQFLAG_DIRTY, "DIRTY" }, \ - { XFS_DQFLAG_FREEING, "FREEING" } + { XFS_DQFLAG_DIRTY, "DIRTY" } /* * We have the possibility of all three quota types being active at once, and diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_rtgroup.c new/xfsprogs-6.19.0/libxfs/xfs_rtgroup.c --- old/xfsprogs-6.18.0/libxfs/xfs_rtgroup.c 2025-06-23 13:48:41.000000000 +0200 +++ new/xfsprogs-6.19.0/libxfs/xfs_rtgroup.c 2026-03-12 19:35:19.000000000 +0100 @@ -45,6 +45,31 @@ return 0; } +/* Compute the number of rt extents in this realtime group. */ +static xfs_rtxnum_t +__xfs_rtgroup_extents( + struct xfs_mount *mp, + xfs_rgnumber_t rgno, + xfs_rgnumber_t rgcount, + xfs_rtbxlen_t rextents) +{ + ASSERT(rgno < rgcount); + if (rgno == rgcount - 1) + return rextents - ((xfs_rtxnum_t)rgno * mp->m_sb.sb_rgextents); + + ASSERT(xfs_has_rtgroups(mp)); + return mp->m_sb.sb_rgextents; +} + +xfs_rtxnum_t +xfs_rtgroup_extents( + struct xfs_mount *mp, + xfs_rgnumber_t rgno) +{ + return __xfs_rtgroup_extents(mp, rgno, mp->m_sb.sb_rgcount, + mp->m_sb.sb_rextents); +} + /* Precompute this group's geometry */ void xfs_rtgroup_calc_geometry( @@ -55,7 +80,8 @@ xfs_rtbxlen_t rextents) { rtg->rtg_extents = __xfs_rtgroup_extents(mp, rgno, rgcount, rextents); - rtg_group(rtg)->xg_block_count = rtg->rtg_extents * mp->m_sb.sb_rextsize; + rtg_group(rtg)->xg_block_count = + rtg->rtg_extents * mp->m_sb.sb_rextsize; rtg_group(rtg)->xg_min_gbno = xfs_rtgroup_min_block(mp, rgno); } @@ -133,31 +159,6 @@ return error; } -/* Compute the number of rt extents in this realtime group. */ -xfs_rtxnum_t -__xfs_rtgroup_extents( - struct xfs_mount *mp, - xfs_rgnumber_t rgno, - xfs_rgnumber_t rgcount, - xfs_rtbxlen_t rextents) -{ - ASSERT(rgno < rgcount); - if (rgno == rgcount - 1) - return rextents - ((xfs_rtxnum_t)rgno * mp->m_sb.sb_rgextents); - - ASSERT(xfs_has_rtgroups(mp)); - return mp->m_sb.sb_rgextents; -} - -xfs_rtxnum_t -xfs_rtgroup_extents( - struct xfs_mount *mp, - xfs_rgnumber_t rgno) -{ - return __xfs_rtgroup_extents(mp, rgno, mp->m_sb.sb_rgcount, - mp->m_sb.sb_rextents); -} - /* * Update the rt extent count of the previous tail rtgroup if it changed during * recovery (i.e. recovery of a growfs). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_rtgroup.h new/xfsprogs-6.19.0/libxfs/xfs_rtgroup.h --- old/xfsprogs-6.18.0/libxfs/xfs_rtgroup.h 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_rtgroup.h 2026-03-12 19:35:19.000000000 +0100 @@ -64,12 +64,6 @@ */ #define XFS_RTG_FREE XA_MARK_0 -/* - * For zoned RT devices this is set on groups that are fully written and that - * have unused blocks. Used by the garbage collection to pick targets. - */ -#define XFS_RTG_RECLAIMABLE XA_MARK_1 - static inline struct xfs_rtgroup *to_rtg(struct xfs_group *xg) { return container_of(xg, struct xfs_rtgroup, rtg_group); @@ -291,8 +285,6 @@ int xfs_initialize_rtgroups(struct xfs_mount *mp, xfs_rgnumber_t first_rgno, xfs_rgnumber_t end_rgno, xfs_rtbxlen_t rextents); -xfs_rtxnum_t __xfs_rtgroup_extents(struct xfs_mount *mp, xfs_rgnumber_t rgno, - xfs_rgnumber_t rgcount, xfs_rtbxlen_t rextents); xfs_rtxnum_t xfs_rtgroup_extents(struct xfs_mount *mp, xfs_rgnumber_t rgno); void xfs_rtgroup_calc_geometry(struct xfs_mount *mp, struct xfs_rtgroup *rtg, xfs_rgnumber_t rgno, xfs_rgnumber_t rgcount, @@ -371,4 +363,12 @@ # define xfs_rtgroup_get_geometry(rtg, rgeo) (-EOPNOTSUPP) #endif /* CONFIG_XFS_RT */ +static inline xfs_rfsblock_t +xfs_rtgs_to_rfsbs( + struct xfs_mount *mp, + uint32_t nr_groups) +{ + return xfs_groups_to_rfsbs(mp, nr_groups, XG_TYPE_RTG); +} + #endif /* __LIBXFS_RTGROUP_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_sb.c new/xfsprogs-6.19.0/libxfs/xfs_sb.c --- old/xfsprogs-6.18.0/libxfs/xfs_sb.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxfs/xfs_sb.c 2026-03-12 19:35:19.000000000 +0100 @@ -299,6 +299,21 @@ sbp->sb_rbmblocks != xfs_expected_rbmblocks(sbp)) return false; + if (xfs_sb_is_v5(sbp) && + (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_ZONED)) { + uint32_t mod; + + /* + * Zoned RT devices must be aligned to the RT group size, + * because garbage collection assumes that all zones have the + * same size to avoid insane complexity if that weren't the + * case. + */ + div_u64_rem(sbp->sb_rextents, sbp->sb_rgextents, &mod); + if (mod) + return false; + } + return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxfs/xfs_zones.c new/xfsprogs-6.19.0/libxfs/xfs_zones.c --- old/xfsprogs-6.18.0/libxfs/xfs_zones.c 2025-06-23 13:48:41.000000000 +0200 +++ new/xfsprogs-6.19.0/libxfs/xfs_zones.c 2026-03-12 19:35:19.000000000 +0100 @@ -3,7 +3,6 @@ * Copyright (c) 2023-2025 Christoph Hellwig. * Copyright (c) 2024-2025, Western Digital Corporation or its affiliates. */ -#include <linux/blkzoned.h> #include "libxfs_priv.h" #include "xfs.h" #include "xfs_fs.h" @@ -97,6 +96,7 @@ case BLK_ZONE_COND_IMP_OPEN: case BLK_ZONE_COND_EXP_OPEN: case BLK_ZONE_COND_CLOSED: + case BLK_ZONE_COND_ACTIVE: return xfs_zone_validate_wp(zone, rtg, write_pointer); case BLK_ZONE_COND_FULL: return xfs_zone_validate_full(zone, rtg, write_pointer); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxlog/util.c new/xfsprogs-6.19.0/libxlog/util.c --- old/xfsprogs-6.18.0/libxlog/util.c 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/libxlog/util.c 2026-03-12 19:35:19.000000000 +0100 @@ -67,7 +67,7 @@ } static int -header_check_uuid(xfs_mount_t *mp, xlog_rec_header_t *head) +header_check_uuid(xfs_mount_t *mp, struct xlog_rec_header *head) { char uu_log[64], uu_sb[64]; @@ -89,7 +89,7 @@ } int -xlog_header_check_recover(xfs_mount_t *mp, xlog_rec_header_t *head) +xlog_header_check_recover(xfs_mount_t *mp, struct xlog_rec_header *head) { if (print_record_header) printf(_("\nLOG REC AT LSN cycle %d block %d (0x%x, 0x%x)\n"), @@ -125,7 +125,7 @@ } int -xlog_header_check_mount(xfs_mount_t *mp, xlog_rec_header_t *head) +xlog_header_check_mount(xfs_mount_t *mp, struct xlog_rec_header *head) { if (platform_uuid_is_null(&head->h_fs_uuid)) return 0; if (header_check_uuid(mp, head)) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/libxlog/xfs_log_recover.c new/xfsprogs-6.19.0/libxlog/xfs_log_recover.c --- old/xfsprogs-6.18.0/libxlog/xfs_log_recover.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/libxlog/xfs_log_recover.c 2026-03-12 19:35:19.000000000 +0100 @@ -296,7 +296,7 @@ xfs_daddr_t i; struct xfs_buf *bp; char *offset = NULL; - xlog_rec_header_t *head = NULL; + struct xlog_rec_header *head = NULL; int error = 0; int smallmem = 0; int num_blks = *last_blk - start_blk; @@ -331,7 +331,7 @@ goto out; } - head = (xlog_rec_header_t *)offset; + head = (struct xlog_rec_header *)offset; if (head->h_magicno == cpu_to_be32(XLOG_HEADER_MAGIC_NUM)) break; @@ -673,7 +673,7 @@ xfs_daddr_t *head_blk, xfs_daddr_t *tail_blk) { - xlog_rec_header_t *rhead; + struct xlog_rec_header *rhead; struct xlog_op_header *op_head; char *offset = NULL; struct xfs_buf *bp; @@ -747,7 +747,7 @@ } /* find blk_no of tail of log */ - rhead = (xlog_rec_header_t *)offset; + rhead = (struct xlog_rec_header *)offset; *tail_blk = BLOCK_LSN(be64_to_cpu(rhead->h_tail_lsn)); /* @@ -1324,35 +1324,41 @@ return 0; } +/* + * Cycles over XLOG_CYCLE_DATA_SIZE overflow into the extended header that was + * added for v2 logs. Addressing for the cycles array there is off by one, + * because the first batch of cycles is in the original header. + */ +static inline __be32 *xlog_cycle_data(struct xlog_rec_header *rhead, unsigned i) +{ + if (i >= XLOG_CYCLE_DATA_SIZE) { + unsigned j = i / XLOG_CYCLE_DATA_SIZE; + unsigned k = i % XLOG_CYCLE_DATA_SIZE; + + return &rhead->h_ext[j - 1].xh_cycle_data[k]; + } + + return &rhead->h_cycle_data[i]; +} + STATIC int xlog_unpack_data( struct xlog_rec_header *rhead, char *dp, struct xlog *log) { - int i, j, k; + int i; int error; error = xlog_unpack_data_crc(rhead, dp, log); if (error) return error; - for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)) && - i < (XLOG_HEADER_CYCLE_SIZE / BBSIZE); i++) { - *(__be32 *)dp = *(__be32 *)&rhead->h_cycle_data[i]; + for (i = 0; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { + *(__be32 *)dp = *xlog_cycle_data(rhead, i); dp += BBSIZE; } - if (xfs_has_logv2(log->l_mp)) { - xlog_in_core_2_t *xhdr = (xlog_in_core_2_t *)rhead; - for ( ; i < BTOBB(be32_to_cpu(rhead->h_len)); i++) { - j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); - k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); - *(__be32 *)dp = xhdr[j].hic_xheader.xh_cycle_data[k]; - dp += BBSIZE; - } - } - return 0; } @@ -1407,7 +1413,7 @@ xfs_daddr_t tail_blk, int pass) { - xlog_rec_header_t *rhead; + struct xlog_rec_header *rhead; xfs_daddr_t blk_no; char *offset; struct xfs_buf *hbp, *dbp; @@ -1436,7 +1442,7 @@ if (error) goto bread_err1; - rhead = (xlog_rec_header_t *)offset; + rhead = (struct xlog_rec_header *)offset; error = xlog_valid_rec_header(log, rhead, tail_blk); if (error) goto bread_err1; @@ -1473,7 +1479,7 @@ if (error) goto bread_err2; - rhead = (xlog_rec_header_t *)offset; + rhead = (struct xlog_rec_header *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) goto bread_err2; @@ -1548,7 +1554,7 @@ if (error) goto bread_err2; } - rhead = (xlog_rec_header_t *)offset; + rhead = (struct xlog_rec_header *)offset; error = xlog_valid_rec_header(log, rhead, split_hblks ? blk_no : 0); if (error) @@ -1622,7 +1628,7 @@ if (error) goto bread_err2; - rhead = (xlog_rec_header_t *)offset; + rhead = (struct xlog_rec_header *)offset; error = xlog_valid_rec_header(log, rhead, blk_no); if (error) goto bread_err2; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/logprint/log_dump.c new/xfsprogs-6.19.0/logprint/log_dump.c --- old/xfsprogs-6.18.0/logprint/log_dump.c 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/logprint/log_dump.c 2026-03-12 19:35:19.000000000 +0100 @@ -21,11 +21,11 @@ int r; uint last_cycle = -1; xfs_daddr_t blkno, dupblkno; - xlog_rec_header_t *hdr; + struct xlog_rec_header *hdr; char buf[XLOG_HEADER_SIZE]; dupblkno = 0; - hdr = (xlog_rec_header_t *)buf; + hdr = (struct xlog_rec_header *)buf; xlog_print_lseek(log, fd, 0, SEEK_SET); for (blkno = 0; blkno < log->l_logBBsize; blkno++) { r = read(fd, buf, sizeof(buf)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/logprint/log_print_all.c new/xfsprogs-6.19.0/logprint/log_print_all.c --- old/xfsprogs-6.18.0/logprint/log_print_all.c 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/logprint/log_print_all.c 2026-03-12 19:35:19.000000000 +0100 @@ -55,8 +55,9 @@ while (j < nums) { if ((j % 8) == 0) - printf("%2x ", j); - printf("%8x ", *dp); + printf("%2x: ", j); + printf("%08x ", print_host_endian ? be32_to_cpu(*dp) : + *dp); dp++; j++; if ((j % 8) == 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/logprint/logprint.c new/xfsprogs-6.19.0/logprint/logprint.c --- old/xfsprogs-6.18.0/logprint/logprint.c 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/logprint/logprint.c 2026-03-12 19:35:19.000000000 +0100 @@ -24,6 +24,7 @@ int print_overwrite; int print_no_data; int print_no_print; +int print_host_endian; static int print_operation = OP_PRINT; static struct libxfs_init x; @@ -37,6 +38,7 @@ -d dump the log in log-record format\n\ -e exit when an error is found in the log\n\ -f specified device is actually a file\n\ + -h print hex data in host-endian order\n\ -l <device> filename of external log\n\ -n don't try and interpret log data\n\ -o print buffer data in hex\n\ @@ -171,6 +173,9 @@ x.log.name = optarg; x.log.isfile = 1; break; + case 'h': + print_host_endian = 1; + break; case 'i': print_inode++; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/logprint/logprint.h new/xfsprogs-6.19.0/logprint/logprint.h --- old/xfsprogs-6.18.0/logprint/logprint.h 2025-12-08 18:03:15.000000000 +0100 +++ new/xfsprogs-6.19.0/logprint/logprint.h 2026-03-12 19:35:19.000000000 +0100 @@ -16,6 +16,7 @@ extern int print_overwrite; extern int print_no_data; extern int print_no_print; +extern int print_host_endian; /* exports */ extern time64_t xlog_extract_dinode_ts(const xfs_log_timestamp_t); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/man/man8/xfs_logprint.8 new/xfsprogs-6.19.0/man/man8/xfs_logprint.8 --- old/xfsprogs-6.18.0/man/man8/xfs_logprint.8 2025-03-31 09:55:41.000000000 +0200 +++ new/xfsprogs-6.19.0/man/man8/xfs_logprint.8 2026-03-12 19:35:19.000000000 +0100 @@ -76,6 +76,10 @@ an ordinary file with .BR xfs_copy (8). .TP +.B \-h +Print u32 hex dump data in host-endian order. +The default is to print without any endian decoding. +.TP .BI \-l " logdev" External log device. Only for those filesystems which use an external log. .TP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/mdrestore/xfs_mdrestore.c new/xfsprogs-6.19.0/mdrestore/xfs_mdrestore.c --- old/xfsprogs-6.18.0/mdrestore/xfs_mdrestore.c 2025-12-12 14:49:32.000000000 +0100 +++ new/xfsprogs-6.19.0/mdrestore/xfs_mdrestore.c 2026-03-12 19:35:19.000000000 +0100 @@ -8,7 +8,6 @@ #include "xfs_metadump.h" #include <libfrog/platform.h> #include "libfrog/div64.h" -#include <linux/blkzoned.h> union mdrestore_headers { __be32 magic; @@ -437,13 +436,21 @@ if (fread(&xme, sizeof(xme), 1, md_fp) != 1) fatal("error reading from metadump file\n"); - if (xme.xme_addr != 0 || be32_to_cpu(xme.xme_len) != 1 || - (be64_to_cpu(xme.xme_addr) & XME_ADDR_DEVICE_MASK) != - XME_ADDR_DATA_DEVICE) - fatal("Invalid superblock disk address/length\n"); + /* + * The first block must be the primary super, which is at the start of + * the data device, which is device 0. + */ + if (xme.xme_addr != 0) + fatal("Invalid superblock disk address 0x%llx\n", + be64_to_cpu(xme.xme_addr)); len = BBTOB(be32_to_cpu(xme.xme_len)); + /* The primary superblock is always a single filesystem sector. */ + if (len < BBTOB(1) || len > XFS_MAX_SECTORSIZE) + fatal("Invalid superblock disk length 0x%x\n", + be32_to_cpu(xme.xme_len)); + if (fread(block_buffer, len, 1, md_fp) != 1) fatal("error reading from metadump file\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/mkfs/proto.c new/xfsprogs-6.19.0/mkfs/proto.c --- old/xfsprogs-6.18.0/mkfs/proto.c 2025-11-05 17:45:30.000000000 +0100 +++ new/xfsprogs-6.19.0/mkfs/proto.c 2026-03-12 19:35:19.000000000 +0100 @@ -374,6 +374,17 @@ break; } + /* + * If we pass an unaligned range to libxfs_file_write, it will + * zero the unaligned head and tail parts of each block. If + * the fd filesystem has a smaller blocksize, then we can end + * up writing to the same block twice, causing unwanted zeroing + * and hence data corruption. + */ + data_pos = rounddown_64(data_pos, mp->m_sb.sb_blocksize); + hole_pos = min(roundup_64(hole_pos, mp->m_sb.sb_blocksize), + statbuf.st_size); + writefile_range(ip, fname, fd, data_pos, hole_pos - data_pos); data_pos = lseek(fd, hole_pos, SEEK_DATA); } @@ -1412,19 +1423,19 @@ struct xfs_trans *tp; struct xfs_parent_args *ppargs = NULL; - tp = getres(mp, 0); - ppargs = newpptr(mp); - dst_ino = get_hardlink_dst_inode(file_stat.st_ino); - /* * We didn't find the hardlink inode, this means it's the first time * we see it, report error so create_nondir_inode() can continue handling the * inode as a regular file type, and later save the source inode in our * buffer for future consumption. */ + dst_ino = get_hardlink_dst_inode(file_stat.st_ino); if (dst_ino == 0) return false; + tp = getres(mp, 0); + ppargs = newpptr(mp); + error = -libxfs_iget(mp, NULL, dst_ino, 0, &ip); if (error) fail(_("failed to get inode"), error); @@ -1546,12 +1557,7 @@ close(fd); return; } - /* - * If instead we have an error it means the hardlink was not registered, - * so we proceed to treat it like a regular file, and save it to our - * tracker later. - */ - tp = getres(mp, 0); + /* * In case of symlinks, we need to handle things a little differently. * We need to read out our link target and act accordingly. @@ -1563,6 +1569,8 @@ if (link_len >= PATH_MAX) fail(_("symlink target too long"), ENAMETOOLONG); tp = getres(mp, XFS_B_TO_FSB(mp, link_len)); + } else { + tp = getres(mp, 0); } ppargs = newpptr(mp); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/mkfs/xfs_mkfs.c new/xfsprogs-6.19.0/mkfs/xfs_mkfs.c --- old/xfsprogs-6.18.0/mkfs/xfs_mkfs.c 2025-12-19 15:01:29.000000000 +0100 +++ new/xfsprogs-6.19.0/mkfs/xfs_mkfs.c 2026-03-12 19:35:19.000000000 +0100 @@ -6,7 +6,6 @@ #include "libfrog/util.h" #include "libxfs.h" #include <ctype.h> -#include <linux/blkzoned.h> #include "libxfs/xfs_zones.h" #include "xfs_multidisk.h" #include "libxcmd.h" @@ -15,6 +14,7 @@ #include "libfrog/crc32cselftest.h" #include "libfrog/dahashselftest.h" #include "libfrog/fsproperties.h" +#include "libfrog/zones.h" #include "proto.h" #include <ini.h> @@ -2542,9 +2542,6 @@ struct zone_info log; }; -/* random size that allows efficient processing */ -#define ZONES_PER_IOCTL 16384 - static void zone_validate_capacity( struct zone_info *zi, @@ -2572,12 +2569,11 @@ const char *name, struct zone_info *zi) { - struct blk_zone_report *rep; + struct xfrog_zone_report *rep = NULL; bool found_seq = false; - int fd, ret = 0; + int fd; uint64_t device_size; uint64_t sector = 0; - size_t rep_size; unsigned int i, n = 0; struct stat st; @@ -2587,10 +2583,8 @@ exit(1); } - if (fstat(fd, &st) < 0) { - ret = -EIO; + if (fstat(fd, &st) < 0) goto out_close; - } if (!S_ISBLK(st.st_mode)) goto out_close; @@ -2606,32 +2600,18 @@ zi->nr_zones = device_size / zi->zone_size; zi->nr_conv_zones = 0; - rep_size = sizeof(struct blk_zone_report) + - sizeof(struct blk_zone) * ZONES_PER_IOCTL; - rep = malloc(rep_size); - if (!rep) { - fprintf(stderr, -_("Failed to allocate memory for zone reporting.\n")); - exit(1); - } - while (n < zi->nr_zones) { - struct blk_zone *zones = (struct blk_zone *)(rep + 1); - - memset(rep, 0, rep_size); - rep->sector = sector; - rep->nr_zones = ZONES_PER_IOCTL; + struct blk_zone *zones; - ret = ioctl(fd, BLKREPORTZONE, rep); - if (ret) { - fprintf(stderr, -_("ioctl(BLKREPORTZONE) failed: %d!\n"), -errno); + rep = xfrog_report_zones(fd, sector, rep); + if (!rep) exit(1); - } - if (!rep->nr_zones) + + if (!rep->rep.nr_zones) break; - for (i = 0; i < rep->nr_zones; i++) { + zones = rep->zones; + for (i = 0; i < rep->rep.nr_zones; i++) { if (n >= zi->nr_zones) break; @@ -2678,8 +2658,8 @@ n++; } - sector = zones[rep->nr_zones - 1].start + - zones[rep->nr_zones - 1].len; + sector = zones[rep->rep.nr_zones - 1].start + + zones[rep->rep.nr_zones - 1].len; } free(rep); @@ -3644,8 +3624,6 @@ lsunit = cli->lsunit; else if (cli_opt_set(&lopts, L_SU)) lsu = getnum(cli->lsu, &lopts, L_SU); - else if (cfg->lsectorsize > XLOG_HEADER_SIZE) - lsu = cfg->blocksize; /* lsunit matches filesystem block size */ if (lsu) { /* verify if lsu is a multiple block size */ @@ -3671,14 +3649,22 @@ if (lsunit) { /* convert from 512 byte blocks to fs blocks */ cfg->lsunit = DTOBT(lsunit, cfg->blocklog); - } else if (cfg->sb_feat.log_version == 2 && - cfg->loginternal && cfg->dsunit) { - /* lsunit and dsunit now in fs blocks */ - cfg->lsunit = cfg->dsunit; - } else if (cfg->sb_feat.log_version == 2 && - !cfg->loginternal) { - /* use the external log device properties */ - cfg->lsunit = DTOBT(ft->log.sunit, cfg->blocklog); + } else if (cfg->sb_feat.log_version == 2 && cfg->loginternal) { + if (cfg->dsunit) { + /* lsunit and dsunit now in fs blocks */ + cfg->lsunit = cfg->dsunit; + } else if (cfg->lsectorsize > XLOG_HEADER_SIZE) { + /* lsunit matches filesystem block size */ + cfg->lsunit = 1; + } + } else if (cfg->sb_feat.log_version == 2 && !cfg->loginternal) { + if (ft->log.sunit > 0) { + /* use the external log device properties */ + cfg->lsunit = DTOBT(ft->log.sunit, cfg->blocklog); + } else if (cfg->lsectorsize > XLOG_HEADER_SIZE) { + /* lsunit matches filesystem block size */ + cfg->lsunit = 1; + } } if (cfg->sb_feat.log_version == 2 && @@ -3696,6 +3682,36 @@ } +static uint64_t +calc_rtstart( + const struct mkfs_params *cfg, + const struct libxfs_init *xi) +{ + uint64_t rt_target_size; + uint64_t rtstart = 1; + + if (cfg->dblocks) { + /* + * If the user specified the size of the data device but not + * the start of the internal rt device, set the internal rt + * volume to start at the end of the data device. + */ + return cfg->dblocks << (cfg->blocklog - BBSHIFT); + } + + /* + * By default reserve at 1% of the total capacity (rounded up to the + * next power of two) for metadata, but match the minimum we enforce + * elsewhere. This matches what SMR HDDs provide. + */ + rt_target_size = max((xi->data.size + 99) / 100, + BTOBB(300 * 1024 * 1024)); + + while (rtstart < rt_target_size) + rtstart <<= 1; + return rtstart; +} + static void open_devices( struct mkfs_params *cfg, @@ -3720,17 +3736,7 @@ zt->rt.zone_capacity = zt->data.zone_capacity; zt->rt.nr_zones = zt->data.nr_zones - zt->data.nr_conv_zones; } else if (cfg->sb_feat.zoned && !cfg->rtstart && !xi->rt.dev) { - /* - * By default reserve at 1% of the total capacity (rounded up to - * the next power of two) for metadata, but match the minimum we - * enforce elsewhere. This matches what SMR HDDs provide. - */ - uint64_t rt_target_size = max((xi->data.size + 99) / 100, - BTOBB(300 * 1024 * 1024)); - - cfg->rtstart = 1; - while (cfg->rtstart < rt_target_size) - cfg->rtstart <<= 1; + cfg->rtstart = calc_rtstart(cfg, xi); } if (cfg->rtstart) { @@ -4559,10 +4565,11 @@ cfg->rgsize; if (cfg->rgcount > max_zones) { - fprintf(stderr, + if (cli->rtsize) + fprintf(stderr, _("Warning: not enough zones (%lu/%u) for backing requested rt size due to\n" "over-provisioning needs, writable size will be less than %s\n"), - cfg->rgcount, max_zones, cli->rtsize); + cfg->rgcount, max_zones, cli->rtsize); cfg->rgcount = max_zones; } new_rtblocks = (cfg->rgcount * cfg->rgsize); @@ -5823,6 +5830,7 @@ } libxfs_irele(args.dp); + free(p); } /* Write the realtime superblock */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/repair/zoned.c new/xfsprogs-6.19.0/repair/zoned.c --- old/xfsprogs-6.18.0/repair/zoned.c 2025-06-23 13:48:41.000000000 +0200 +++ new/xfsprogs-6.19.0/repair/zoned.c 2026-03-12 19:35:19.000000000 +0100 @@ -3,10 +3,10 @@ * Copyright (c) 2024 Christoph Hellwig. */ #include <ctype.h> -#include <linux/blkzoned.h> #include "libxfs_priv.h" #include "libxfs.h" #include "xfs_zones.h" +#include "libfrog/zones.h" #include "err_protos.h" #include "zoned.h" @@ -51,8 +51,7 @@ uint64_t sector = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rtstart); unsigned int zone_size, zone_capacity; uint64_t device_size; - size_t rep_size; - struct blk_zone_report *rep; + struct xfrog_zone_report *rep = NULL; unsigned int i, n = 0; if (ioctl(fd, BLKGETSIZE64, &device_size)) @@ -67,31 +66,18 @@ return; } - rep_size = sizeof(struct blk_zone_report) + - sizeof(struct blk_zone) * ZONES_PER_IOCTL; - rep = malloc(rep_size); - if (!rep) { - do_warn(_("malloc failed for zone report\n")); - return; - } - while (n < mp->m_sb.sb_rgcount) { - struct blk_zone *zones = (struct blk_zone *)(rep + 1); - int ret; + struct blk_zone *zones; - memset(rep, 0, rep_size); - rep->sector = sector; - rep->nr_zones = ZONES_PER_IOCTL; - - ret = ioctl(fd, BLKREPORTZONE, rep); - if (ret) { - do_error(_("ioctl(BLKREPORTZONE) failed: %d!\n"), ret); - goto out_free; - } - if (!rep->nr_zones) + rep = xfrog_report_zones(fd, sector, rep); + if (!rep) + return; + + if (!rep->rep.nr_zones) break; - for (i = 0; i < rep->nr_zones; i++) { + zones = rep->zones; + for (i = 0; i < rep->rep.nr_zones; i++) { if (n >= mp->m_sb.sb_rgcount) break; @@ -130,8 +116,8 @@ report_zones_cb(mp, &zones[i]); n++; } - sector = zones[rep->nr_zones - 1].start + - zones[rep->nr_zones - 1].len; + sector = zones[rep->rep.nr_zones - 1].start + + zones[rep->rep.nr_zones - 1].len; } out_free: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/scrub/Makefile new/xfsprogs-6.19.0/scrub/Makefile --- old/xfsprogs-6.18.0/scrub/Makefile 2025-10-20 16:17:55.000000000 +0200 +++ new/xfsprogs-6.19.0/scrub/Makefile 2026-03-12 19:35:19.000000000 +0100 @@ -16,7 +16,7 @@ INSTALL_SCRUB = install-scrub XFS_SCRUB_ALL_PROG = xfs_scrub_all.py XFS_SCRUB_FAIL_PROG = xfs_scrub_fail -XFS_SCRUB_ARGS = -p +XFS_SCRUB_ARGS = -o autofsck XFS_SCRUB_SERVICE_ARGS = -b -o autofsck ifeq ($(HAVE_SYSTEMD),yes) INSTALL_SCRUB += install-systemd diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xfsprogs-6.18.0/scrub/xfs_scrub_all.py.in new/xfsprogs-6.19.0/scrub/xfs_scrub_all.py.in --- old/xfsprogs-6.18.0/scrub/xfs_scrub_all.py.in 2025-10-20 16:17:55.000000000 +0200 +++ new/xfsprogs-6.19.0/scrub/xfs_scrub_all.py.in 2026-03-12 19:35:19.000000000 +0100 @@ -102,7 +102,8 @@ cmd = ['@sbindir@/xfs_scrub'] if 'SERVICE_MODE' in os.environ: cmd += '@scrub_service_args@'.split() - cmd += '@scrub_args@'.split() + else: + cmd += '@scrub_args@'.split() if scrub_media: cmd += '-x' cmd += [mnt]
