diff --git a/.gitignore b/.gitignore index d74f333..eb99e9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/xfsprogs-5.19.0.tar.xz +SOURCES/xfsprogs-6.3.0.tar.xz diff --git a/.xfsprogs.metadata b/.xfsprogs.metadata index 480e3dd..2b0ef79 100644 --- a/.xfsprogs.metadata +++ b/.xfsprogs.metadata @@ -1 +1 @@ -12afbdd497603b98945ea18f9aa5a78c671a6e4c SOURCES/xfsprogs-5.19.0.tar.xz +e976c2c41a957ee16094690596ee210dd45951fa SOURCES/xfsprogs-6.3.0.tar.xz diff --git a/SOURCES/13F703E6C11CF6F0.asc b/SOURCES/13F703E6C11CF6F0.asc new file mode 100644 index 0000000..c911e1f --- /dev/null +++ b/SOURCES/13F703E6C11CF6F0.asc @@ -0,0 +1,174 @@ +pub ed25519 2022-05-27 [C] + 4020459E58C1A52511F5399113F703E6C11CF6F0 +uid Carlos Eduardo Maiolino +uid Carlos Eduardo Maiolino +uid Carlos Eduardo Maiolino +sub ed25519 2022-05-27 [A] + 36C5DFE1ECA79D1D444FDD904E5621A566959599 +sub ed25519 2022-05-27 [S] + FA406E206AFF7873897C6864B45618C36A24FD23 +sub cv25519 2022-05-27 [E] + 5AE98D09B21AFBDE62EE571EE01E05EA81B10D5C + +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=n3Wp +-----END PGP PUBLIC KEY BLOCK----- diff --git a/SOURCES/20AE1692E13DDEE0.asc b/SOURCES/20AE1692E13DDEE0.asc deleted file mode 100644 index 27900de..0000000 --- a/SOURCES/20AE1692E13DDEE0.asc +++ /dev/null @@ -1,185 +0,0 @@ -pub rsa4096 2011-11-03 [SC] - 2B8185919E8D248981869DED20AE1692E13DDEE0 -uid Eric R. Sandeen -uid Eric R. Sandeen -sub rsa4096 2011-11-03 [E] - 048CA40C8F5B5507E3A6CD6BE2C297037B26BEB4 - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -4NMMCC8gkONe4tek -=EFoy ------END PGP PUBLIC KEY BLOCK----- diff --git a/SOURCES/xfsprogs-5.19.0-xfs-estimate-post-merge-refcounts-correctly.patch b/SOURCES/xfsprogs-5.19.0-xfs-estimate-post-merge-refcounts-correctly.patch deleted file mode 100644 index 9b53f1a..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-estimate-post-merge-refcounts-correctly.patch +++ /dev/null @@ -1,113 +0,0 @@ -From b445624f0882badf00da739c52e58a85c18ae002 Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -Date: Wed, 15 Mar 2023 15:56:35 +0100 -Subject: [PATCH] xfs: estimate post-merge refcounts correctly - -Source kernel commit: b25d1984aa884fc91a73a5a407b9ac976d441e9b - -Upon enabling fsdax + reflink for XFS, xfs/179 began to report refcount -metadata corruptions after being run. Specifically, xfs_repair noticed -single-block refcount records that could be combined but had not been. - -The root cause of this is improper MAXREFCOUNT edge case handling in -xfs_refcount_merge_extents. When we're trying to find candidates for a -refcount btree record merge, we compute the refcount attribute of the -merged record, but we fail to account for the fact that once a record -hits rc_refcount == MAXREFCOUNT, it is pinned that way forever. Hence -the computed refcount is wrong, and we fail to merge the extents. - -Fix this by adjusting the merge predicates to compute the adjusted -refcount correctly. - -Fixes: 3172725814f9 ("xfs: adjust refcount of an extent of blocks in refcount btree") -Signed-off-by: Darrick J. Wong -Reviewed-by: Dave Chinner -Reviewed-by: Xiao Yang -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_refcount.c | 25 +++++++++++++++++++++---- - 1 file changed, 21 insertions(+), 4 deletions(-) - -diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c -index f6167c5f..29258bdd 100644 ---- a/libxfs/xfs_refcount.c -+++ b/libxfs/xfs_refcount.c -@@ -819,6 +819,17 @@ xfs_refc_valid( - return rc->rc_startblock != NULLAGBLOCK; - } - -+static inline xfs_nlink_t -+xfs_refc_merge_refcount( -+ const struct xfs_refcount_irec *irec, -+ enum xfs_refc_adjust_op adjust) -+{ -+ /* Once a record hits MAXREFCOUNT, it is pinned there forever */ -+ if (irec->rc_refcount == MAXREFCOUNT) -+ return MAXREFCOUNT; -+ return irec->rc_refcount + adjust; -+} -+ - static inline bool - xfs_refc_want_merge_center( - const struct xfs_refcount_irec *left, -@@ -830,6 +841,7 @@ xfs_refc_want_merge_center( - unsigned long long *ulenp) - { - unsigned long long ulen = left->rc_blockcount; -+ xfs_nlink_t new_refcount; - - /* - * To merge with a center record, both shoulder records must be -@@ -845,9 +857,10 @@ xfs_refc_want_merge_center( - return false; - - /* The shoulder record refcounts must match the new refcount. */ -- if (left->rc_refcount != cleft->rc_refcount + adjust) -+ new_refcount = xfs_refc_merge_refcount(cleft, adjust); -+ if (left->rc_refcount != new_refcount) - return false; -- if (right->rc_refcount != cleft->rc_refcount + adjust) -+ if (right->rc_refcount != new_refcount) - return false; - - /* -@@ -870,6 +883,7 @@ xfs_refc_want_merge_left( - enum xfs_refc_adjust_op adjust) - { - unsigned long long ulen = left->rc_blockcount; -+ xfs_nlink_t new_refcount; - - /* - * For a left merge, the left shoulder record must be adjacent to the -@@ -880,7 +894,8 @@ xfs_refc_want_merge_left( - return false; - - /* Left shoulder record refcount must match the new refcount. */ -- if (left->rc_refcount != cleft->rc_refcount + adjust) -+ new_refcount = xfs_refc_merge_refcount(cleft, adjust); -+ if (left->rc_refcount != new_refcount) - return false; - - /* -@@ -902,6 +917,7 @@ xfs_refc_want_merge_right( - enum xfs_refc_adjust_op adjust) - { - unsigned long long ulen = right->rc_blockcount; -+ xfs_nlink_t new_refcount; - - /* - * For a right merge, the right shoulder record must be adjacent to the -@@ -912,7 +928,8 @@ xfs_refc_want_merge_right( - return false; - - /* Right shoulder record refcount must match the new refcount. */ -- if (right->rc_refcount != cright->rc_refcount + adjust) -+ new_refcount = xfs_refc_merge_refcount(cright, adjust); -+ if (right->rc_refcount != new_refcount) - return false; - - /* --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs-fix-off-by-one-error-in-xfs_btree_space_to_heigh.patch b/SOURCES/xfsprogs-5.19.0-xfs-fix-off-by-one-error-in-xfs_btree_space_to_heigh.patch deleted file mode 100644 index 4d25a3f..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-fix-off-by-one-error-in-xfs_btree_space_to_heigh.patch +++ /dev/null @@ -1,88 +0,0 @@ -From a68dabd45f3591456ecf7e35f6a6077db79f6bc6 Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -Date: Wed, 15 Mar 2023 15:59:35 +0100 -Subject: [PATCH] xfs: fix off-by-one error in xfs_btree_space_to_height - -Source kernel commit: c0f399ff51495ac8d30367418f4f6292ecd61fbe - -Lately I've been stress-testing extreme-sized rmap btrees by using the -(new) xfs_db bmap_inflate command to clone bmbt mappings billions of -times and then using xfs_repair to build new rmap and refcount btrees. -This of course is /much/ faster than actually FICLONEing a file billions -of times. - -Unfortunately, xfs_repair fails in xfs_btree_bload_compute_geometry with -EOVERFLOW, which indicates that xfs_mount.m_rmap_maxlevels is not -sufficiently large for the test scenario. For a 1TB filesystem (~67 -million AG blocks, 4 AGs) the btheight command reports: - -$ xfs_db -c 'btheight -n 4400801200 -w min rmapbt' /dev/sda -rmapbt: worst case per 4096-byte block: 84 records (leaf) / 45 keyptrs (node) -level 0: 4400801200 records, 52390491 blocks -level 1: 52390491 records, 1164234 blocks -level 2: 1164234 records, 25872 blocks -level 3: 25872 records, 575 blocks -level 4: 575 records, 13 blocks -level 5: 13 records, 1 block -6 levels, 53581186 blocks total - -The AG is sufficiently large to build this rmap btree. Unfortunately, -m_rmap_maxlevels is 5. Augmenting the loop in the space->height -function to report height, node blocks, and blocks remaining produces -this: - -ht 1 node_blocks 45 blockleft 67108863 -ht 2 node_blocks 2025 blockleft 67108818 -ht 3 node_blocks 91125 blockleft 67106793 -ht 4 node_blocks 4100625 blockleft 67015668 -final height: 5 - -The goal of this function is to compute the maximum height btree that -can be stored in the given number of ondisk fsblocks. Starting with the -top level of the tree, each iteration through the loop adds the fanout -factor of the next level down until we run out of blocks. IOWs, maximum -height is achieved by using the smallest fanout factor that can apply -to that level. - -However, the loop setup is not correct. Top level btree blocks are -allowed to contain fewer than minrecs items, so the computation is -incorrect because the first time through the loop it should be using a -fanout factor of 2. With this corrected, the above becomes: - -ht 1 node_blocks 2 blockleft 67108863 -ht 2 node_blocks 90 blockleft 67108861 -ht 3 node_blocks 4050 blockleft 67108771 -ht 4 node_blocks 182250 blockleft 67104721 -ht 5 node_blocks 8201250 blockleft 66922471 -final height: 6 - -Fixes: 9ec691205e7d ("xfs: compute the maximum height of the rmap btree when reflink enabled") -Signed-off-by: Darrick J. Wong -Reviewed-by: Dave Chinner -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_btree.c | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c -index 65d38637..38a3092d 100644 ---- a/libxfs/xfs_btree.c -+++ b/libxfs/xfs_btree.c -@@ -4663,7 +4663,12 @@ xfs_btree_space_to_height( - const unsigned int *limits, - unsigned long long leaf_blocks) - { -- unsigned long long node_blocks = limits[1]; -+ /* -+ * The root btree block can have fewer than minrecs pointers in it -+ * because the tree might not be big enough to require that amount of -+ * fanout. Hence it has a minimum size of 2 pointers, not limits[1]. -+ */ -+ unsigned long long node_blocks = 2; - unsigned long long blocks_left = leaf_blocks - 1; - unsigned int height = 1; - --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs-fix-sb-write-verify-for-lazysbcount.patch b/SOURCES/xfsprogs-5.19.0-xfs-fix-sb-write-verify-for-lazysbcount.patch deleted file mode 100644 index 4873b9f..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-fix-sb-write-verify-for-lazysbcount.patch +++ /dev/null @@ -1,119 +0,0 @@ -From b827e2318ea2bb3eabca13a965c2535a1d7289e5 Mon Sep 17 00:00:00 2001 -From: Long Li -Date: Fri, 18 Nov 2022 12:23:57 +0100 -Subject: [PATCH] xfs: fix sb write verify for lazysbcount - -Source kernel commit: 7cecd500d90164419add650e26cc1de03a7a66cb - -When lazysbcount is enabled, fsstress and loop mount/unmount test report -the following problems: - -XFS (loop0): SB summary counter sanity check failed -XFS (loop0): Metadata corruption detected at xfs_sb_write_verify+0x13b/0x460, -xfs_sb block 0x0 -XFS (loop0): Unmount and run xfs_repair -XFS (loop0): First 128 bytes of corrupted metadata buffer: -00000000: 58 46 53 42 00 00 10 00 00 00 00 00 00 28 00 00 XFSB.........(.. -00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -00000020: 69 fb 7c cd 5f dc 44 af 85 74 e0 cc d4 e3 34 5a i.|._.D..t....4Z -00000030: 00 00 00 00 00 20 00 06 00 00 00 00 00 00 00 80 ..... .......... -00000040: 00 00 00 00 00 00 00 81 00 00 00 00 00 00 00 82 ................ -00000050: 00 00 00 01 00 0a 00 00 00 00 00 04 00 00 00 00 ................ -00000060: 00 00 0a 00 b4 b5 02 00 02 00 00 08 00 00 00 00 ................ -00000070: 00 00 00 00 00 00 00 00 0c 09 09 03 14 00 00 19 ................ -XFS (loop0): Corruption of in-memory data (0x8) detected at _xfs_buf_ioapply -+0xe1e/0x10e0 (fs/xfs/xfs_buf.c:1580). Shutting down filesystem. -XFS (loop0): Please unmount the filesystem and rectify the problem(s) -XFS (loop0): log mount/recovery failed: error -117 -XFS (loop0): log mount failed - -This corruption will shutdown the file system and the file system will -no longer be mountable. The following script can reproduce the problem, -but it may take a long time. - -#!/bin/bash - -device=/dev/sda -testdir=/mnt/test -round=0 - -function fail() -{ -echo "$*" -exit 1 -} - -mkdir -p $testdir -while [ $round -lt 10000 ] -do -echo "******* round $round ********" -mkfs.xfs -f $device -mount $device $testdir || fail "mount failed!" -fsstress -d $testdir -l 0 -n 10000 -p 4 >/dev/null & -sleep 4 -killall -w fsstress -umount $testdir -xfs_repair -e $device > /dev/null -if [ $? -eq 2 ];then -echo "ERR CODE 2: Dirty log exception during repair." -exit 1 -fi -round=$(($round+1)) -done - -With lazysbcount is enabled, There is no additional lock protection for -reading m_ifree and m_icount in xfs_log_sb(), if other cpu modifies the -m_ifree, this will make the m_ifree greater than m_icount. For example, -consider the following sequence and ifreedelta is postive: - -CPU0 CPU1 -xfs_log_sb xfs_trans_unreserve_and_mod_sb ----------- ------------------------------ -percpu_counter_sum(&mp->m_icount) -percpu_counter_add_batch(&mp->m_icount, -idelta, XFS_ICOUNT_BATCH) -percpu_counter_add(&mp->m_ifree, ifreedelta); -percpu_counter_sum(&mp->m_ifree) - -After this, incorrect inode count (sb_ifree > sb_icount) will be writen to -the log. In the subsequent writing of sb, incorrect inode count (sb_ifree > -sb_icount) will fail to pass the boundary check in xfs_validate_sb_write() -that cause the file system shutdown. - -When lazysbcount is enabled, we don't need to guarantee that Lazy sb -counters are completely correct, but we do need to guarantee that sb_ifree -<= sb_icount. On the other hand, the constraint that m_ifree <= m_icount -must be satisfied any time that there /cannot/ be other threads allocating -or freeing inode chunks. If the constraint is violated under these -circumstances, sb_i{count,free} (the ondisk superblock inode counters) -maybe incorrect and need to be marked sick at unmount, the count will -be rebuilt on the next mount. - -Fixes: 8756a5af1819 ("libxfs: add more bounds checking to sb sanity checks") -Signed-off-by: Long Li -Reviewed-by: Darrick J. Wong -Signed-off-by: Darrick J. Wong -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_sb.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c -index fc33dc4a..d05f0e6e 100644 ---- a/libxfs/xfs_sb.c -+++ b/libxfs/xfs_sb.c -@@ -970,7 +970,9 @@ xfs_log_sb( - */ - if (xfs_has_lazysbcount(mp)) { - mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); -- mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); -+ mp->m_sb.sb_ifree = min_t(uint64_t, -+ percpu_counter_sum(&mp->m_ifree), -+ mp->m_sb.sb_icount); - mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks); - } - --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs-get-rid-of-assert-from-xfs_btree_islastblock.patch b/SOURCES/xfsprogs-5.19.0-xfs-get-rid-of-assert-from-xfs_btree_islastblock.patch deleted file mode 100644 index 1c3e4c4..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-get-rid-of-assert-from-xfs_btree_islastblock.patch +++ /dev/null @@ -1,73 +0,0 @@ -From f5ef812888a81be534466fa34df747c16bb65b7f Mon Sep 17 00:00:00 2001 -From: Guo Xuenan -Date: Wed, 15 Mar 2023 15:57:35 +0100 -Subject: [PATCH] xfs: get rid of assert from xfs_btree_islastblock - -Source kernel commit: 8c25febf23963431686f04874b96321288504127 - -xfs_btree_check_block contains debugging knobs. With XFS_DEBUG setting up, -turn on the debugging knob can trigger the assert of xfs_btree_islastblock, -test script as follows: - -while true -do -mount $disk $mountpoint -fsstress -d $testdir -l 0 -n 10000 -p 4 >/dev/null -echo 1 > /sys/fs/xfs/sda/errortag/btree_chk_sblk -sleep 10 -umount $mountpoint -done - -Kick off fsstress and only *then* turn on the debugging knob. If it -happens that the knob gets turned on after the cntbt lookup succeeds -but before the call to xfs_btree_islastblock, then we *can* end up in -the situation where a previously checked btree block suddenly starts -returning EFSCORRUPTED from xfs_btree_check_block. Kaboom. - -Darrick give a very detailed explanation as follows: -Looking back at commit 27d9ee577dcce, I think the point of all this was -to make sure that the cursor has actually performed a lookup, and that -the btree block at whatever level we're asking about is ok. - -If the caller hasn't ever done a lookup, the bc_levels array will be -empty, so cur->bc_levels[level].bp pointer will be NULL. The call to -xfs_btree_get_block will crash anyway, so the "ASSERT(block);" part is -pointless. - -If the caller did a lookup but the lookup failed due to block -corruption, the corresponding cur->bc_levels[level].bp pointer will also -be NULL, and we'll still crash. The "ASSERT(xfs_btree_check_block);" -logic is also unnecessary. - -If the cursor level points to an inode root, the block buffer will be -incore, so it had better always be consistent. - -If the caller ignores a failed lookup after a successful one and calls -this function, the cursor state is garbage and the assert wouldn't have -tripped anyway. So get rid of the assert. - -Fixes: 27d9ee577dcc ("xfs: actually check xfs_btree_check_block return in xfs_btree_islastblock") -Signed-off-by: Guo Xuenan -Reviewed-by: Darrick J. Wong -Signed-off-by: Darrick J. Wong -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_btree.h | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h -index eef27858..29c4b4cc 100644 ---- a/libxfs/xfs_btree.h -+++ b/libxfs/xfs_btree.h -@@ -556,7 +556,6 @@ xfs_btree_islastblock( - struct xfs_buf *bp; - - block = xfs_btree_get_block(cur, level, &bp); -- ASSERT(block && xfs_btree_check_block(cur, block, level, bp) == 0); - - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) - return block->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK); --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs-hoist-refcount-record-merge-predicates.patch b/SOURCES/xfsprogs-5.19.0-xfs-hoist-refcount-record-merge-predicates.patch deleted file mode 100644 index 4fefb24..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-hoist-refcount-record-merge-predicates.patch +++ /dev/null @@ -1,187 +0,0 @@ -From d1dca9f6b365e439878e550ed0c801bbfb6d347b Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -Date: Wed, 15 Mar 2023 15:55:35 +0100 -Subject: [PATCH] xfs: hoist refcount record merge predicates - -Source kernel commit: 9d720a5a658f5135861773f26e927449bef93d61 - -Hoist these multiline conditionals into separate static inline helpers -to improve readability and set the stage for corruption fixes that will -be introduced in the next patch. - -Signed-off-by: Darrick J. Wong -Reviewed-by: Dave Chinner -Reviewed-by: Xiao Yang -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_refcount.c | 129 ++++++++++++++++++++++++++++++++++++------ - 1 file changed, 113 insertions(+), 16 deletions(-) - -diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c -index 64e66861..f6167c5f 100644 ---- a/libxfs/xfs_refcount.c -+++ b/libxfs/xfs_refcount.c -@@ -814,11 +814,119 @@ out_error: - /* Is this extent valid? */ - static inline bool - xfs_refc_valid( -- struct xfs_refcount_irec *rc) -+ const struct xfs_refcount_irec *rc) - { - return rc->rc_startblock != NULLAGBLOCK; - } - -+static inline bool -+xfs_refc_want_merge_center( -+ const struct xfs_refcount_irec *left, -+ const struct xfs_refcount_irec *cleft, -+ const struct xfs_refcount_irec *cright, -+ const struct xfs_refcount_irec *right, -+ bool cleft_is_cright, -+ enum xfs_refc_adjust_op adjust, -+ unsigned long long *ulenp) -+{ -+ unsigned long long ulen = left->rc_blockcount; -+ -+ /* -+ * To merge with a center record, both shoulder records must be -+ * adjacent to the record we want to adjust. This is only true if -+ * find_left and find_right made all four records valid. -+ */ -+ if (!xfs_refc_valid(left) || !xfs_refc_valid(right) || -+ !xfs_refc_valid(cleft) || !xfs_refc_valid(cright)) -+ return false; -+ -+ /* There must only be one record for the entire range. */ -+ if (!cleft_is_cright) -+ return false; -+ -+ /* The shoulder record refcounts must match the new refcount. */ -+ if (left->rc_refcount != cleft->rc_refcount + adjust) -+ return false; -+ if (right->rc_refcount != cleft->rc_refcount + adjust) -+ return false; -+ -+ /* -+ * The new record cannot exceed the max length. ulen is a ULL as the -+ * individual record block counts can be up to (u32 - 1) in length -+ * hence we need to catch u32 addition overflows here. -+ */ -+ ulen += cleft->rc_blockcount + right->rc_blockcount; -+ if (ulen >= MAXREFCEXTLEN) -+ return false; -+ -+ *ulenp = ulen; -+ return true; -+} -+ -+static inline bool -+xfs_refc_want_merge_left( -+ const struct xfs_refcount_irec *left, -+ const struct xfs_refcount_irec *cleft, -+ enum xfs_refc_adjust_op adjust) -+{ -+ unsigned long long ulen = left->rc_blockcount; -+ -+ /* -+ * For a left merge, the left shoulder record must be adjacent to the -+ * start of the range. If this is true, find_left made left and cleft -+ * contain valid contents. -+ */ -+ if (!xfs_refc_valid(left) || !xfs_refc_valid(cleft)) -+ return false; -+ -+ /* Left shoulder record refcount must match the new refcount. */ -+ if (left->rc_refcount != cleft->rc_refcount + adjust) -+ return false; -+ -+ /* -+ * The new record cannot exceed the max length. ulen is a ULL as the -+ * individual record block counts can be up to (u32 - 1) in length -+ * hence we need to catch u32 addition overflows here. -+ */ -+ ulen += cleft->rc_blockcount; -+ if (ulen >= MAXREFCEXTLEN) -+ return false; -+ -+ return true; -+} -+ -+static inline bool -+xfs_refc_want_merge_right( -+ const struct xfs_refcount_irec *cright, -+ const struct xfs_refcount_irec *right, -+ enum xfs_refc_adjust_op adjust) -+{ -+ unsigned long long ulen = right->rc_blockcount; -+ -+ /* -+ * For a right merge, the right shoulder record must be adjacent to the -+ * end of the range. If this is true, find_right made cright and right -+ * contain valid contents. -+ */ -+ if (!xfs_refc_valid(right) || !xfs_refc_valid(cright)) -+ return false; -+ -+ /* Right shoulder record refcount must match the new refcount. */ -+ if (right->rc_refcount != cright->rc_refcount + adjust) -+ return false; -+ -+ /* -+ * The new record cannot exceed the max length. ulen is a ULL as the -+ * individual record block counts can be up to (u32 - 1) in length -+ * hence we need to catch u32 addition overflows here. -+ */ -+ ulen += cright->rc_blockcount; -+ if (ulen >= MAXREFCEXTLEN) -+ return false; -+ -+ return true; -+} -+ - /* - * Try to merge with any extents on the boundaries of the adjustment range. - */ -@@ -860,23 +968,15 @@ xfs_refcount_merge_extents( - (cleft.rc_blockcount == cright.rc_blockcount); - - /* Try to merge left, cleft, and right. cleft must == cright. */ -- ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount + -- right.rc_blockcount; -- if (xfs_refc_valid(&left) && xfs_refc_valid(&right) && -- xfs_refc_valid(&cleft) && xfs_refc_valid(&cright) && cequal && -- left.rc_refcount == cleft.rc_refcount + adjust && -- right.rc_refcount == cleft.rc_refcount + adjust && -- ulen < MAXREFCEXTLEN) { -+ if (xfs_refc_want_merge_center(&left, &cleft, &cright, &right, cequal, -+ adjust, &ulen)) { - *shape_changed = true; - return xfs_refcount_merge_center_extents(cur, &left, &cleft, - &right, ulen, aglen); - } - - /* Try to merge left and cleft. */ -- ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount; -- if (xfs_refc_valid(&left) && xfs_refc_valid(&cleft) && -- left.rc_refcount == cleft.rc_refcount + adjust && -- ulen < MAXREFCEXTLEN) { -+ if (xfs_refc_want_merge_left(&left, &cleft, adjust)) { - *shape_changed = true; - error = xfs_refcount_merge_left_extent(cur, &left, &cleft, - agbno, aglen); -@@ -892,10 +992,7 @@ xfs_refcount_merge_extents( - } - - /* Try to merge cright and right. */ -- ulen = (unsigned long long)right.rc_blockcount + cright.rc_blockcount; -- if (xfs_refc_valid(&right) && xfs_refc_valid(&cright) && -- right.rc_refcount == cright.rc_refcount + adjust && -- ulen < MAXREFCEXTLEN) { -+ if (xfs_refc_want_merge_right(&cright, &right, adjust)) { - *shape_changed = true; - return xfs_refcount_merge_right_extent(cur, &right, &cright, - aglen); --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs-removed-useless-condition-in-function-xfs_attr_n.patch b/SOURCES/xfsprogs-5.19.0-xfs-removed-useless-condition-in-function-xfs_attr_n.patch deleted file mode 100644 index edd074e..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs-removed-useless-condition-in-function-xfs_attr_n.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 798d43495df2c8a09a73b8e868a71d8f2fd81d5e Mon Sep 17 00:00:00 2001 -From: Andrey Strachuk -Date: Wed, 24 Aug 2022 10:24:01 +0200 -Subject: [PATCH] xfs: removed useless condition in function xfs_attr_node_get - -Source kernel commit: 0f38063d7a38015a47ca1488406bf21e0effe80e - -At line 1561, variable "state" is being compared -with NULL every loop iteration. - -------------------------------------------------------------------- -1561 for (i = 0; state != NULL && i < state->path.active; i++) { -1562 xfs_trans_brelse(args->trans, state->path.blk[i].bp); -1563 state->path.blk[i].bp = NULL; -1564 } -------------------------------------------------------------------- - -However, it cannot be NULL. - ----------------------------------------- -1546 state = xfs_da_state_alloc(args); ----------------------------------------- - -xfs_da_state_alloc calls kmem_cache_zalloc. kmem_cache_zalloc is -called with __GFP_NOFAIL flag and, therefore, it cannot return NULL. - --------------------------------------------------------------------------- -struct xfs_da_state * -xfs_da_state_alloc( -struct xfs_da_args *args) -{ -struct xfs_da_state *state; - -state = kmem_cache_zalloc(xfs_da_state_cache, GFP_NOFS | __GFP_NOFAIL); -state->args = args; -state->mp = args->dp->i_mount; -return state; -} --------------------------------------------------------------------------- - -Found by Linux Verification Center (linuxtesting.org) with SVACE. - -Signed-off-by: Andrey Strachuk - -Fixes: 4d0cdd2bb8f0 ("xfs: clean up xfs_attr_node_hasname") -Reviewed-by: Darrick J. Wong -Signed-off-by: Darrick J. Wong -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/xfs_attr.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c -index 08973934..b451fcdb 100644 ---- a/libxfs/xfs_attr.c -+++ b/libxfs/xfs_attr.c -@@ -1556,7 +1556,7 @@ xfs_attr_node_get( - * If not in a transaction, we have to release all the buffers. - */ - out_release: -- for (i = 0; state != NULL && i < state->path.active; i++) { -+ for (i = 0; i < state->path.active; i++) { - xfs_trans_brelse(args->trans, state->path.blk[i].bp); - state->path.blk[i].bp = NULL; - } --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs_db-fix-dir3-block-magic-check.patch b/SOURCES/xfsprogs-5.19.0-xfs_db-fix-dir3-block-magic-check.patch deleted file mode 100644 index 427adec..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs_db-fix-dir3-block-magic-check.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 7374f58bfeb38467bab6552a47a5cd6bbe3c2e2e Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -Date: Tue, 20 Dec 2022 16:53:34 -0800 -Subject: [PATCH] xfs_db: fix dir3 block magic check - -Fix this broken check, which (amazingly) went unnoticed until I cranked -up the warning level /and/ built the system for s390x. - -Fixes: e96864ff4d4 ("xfs_db: enable blockget for v5 filesystems") -Signed-off-by: Darrick J. Wong -Reviewed-by: Dave Chinner -Reviewed-by: Carlos Maiolino -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - db/check.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/db/check.c b/db/check.c -index bb27ce58..964756d0 100644 ---- a/db/check.c -+++ b/db/check.c -@@ -2578,7 +2578,7 @@ process_data_dir_v2( - error++; - } - if ((be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || -- be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC) && -+ be32_to_cpu(data->magic) == XFS_DIR3_BLOCK_MAGIC) && - stale != be32_to_cpu(btp->stale)) { - if (!sflag || v) - dbprintf(_("dir %lld block %d bad stale tail count %d\n"), --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0-xfs_repair-retain-superblock-buffer-to-avoid-write-h.patch b/SOURCES/xfsprogs-5.19.0-xfs_repair-retain-superblock-buffer-to-avoid-write-h.patch deleted file mode 100644 index f1bee81..0000000 --- a/SOURCES/xfsprogs-5.19.0-xfs_repair-retain-superblock-buffer-to-avoid-write-h.patch +++ /dev/null @@ -1,266 +0,0 @@ -From 945c7341dedab44ae5daed83377e6366c3fb8fee Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -Date: Wed, 23 Nov 2022 09:09:33 -0800 -Subject: [PATCH] xfs_repair: retain superblock buffer to avoid write hook - deadlock - -Every now and then I experience the following deadlock in xfs_repair -when I'm running the offline repair fuzz tests: - -#0 futex_wait (private=0, expected=2, futex_word=0x55555566df70) at ../sysdeps/nptl/futex-internal.h:146 -#1 __GI___lll_lock_wait (futex=futex@entry=0x55555566df70, private=0) at ./nptl/lowlevellock.c:49 -#2 lll_mutex_lock_optimized (mutex=0x55555566df70) at ./nptl/pthread_mutex_lock.c:48 -#3 ___pthread_mutex_lock (mutex=mutex@entry=0x55555566df70) at ./nptl/pthread_mutex_lock.c:93 -#4 cache_shake (cache=cache@entry=0x55555566de60, priority=priority@entry=2, purge=purge@entry=false) at cache.c:231 -#5 cache_node_get (cache=cache@entry=0x55555566de60, key=key@entry=0x7fffe55e01b0, nodep=nodep@entry=0x7fffe55e0168) at cache.c:452 -#6 __cache_lookup (key=key@entry=0x7fffe55e01b0, flags=0, bpp=bpp@entry=0x7fffe55e0228) at rdwr.c:405 -#7 libxfs_getbuf_flags (btp=0x55555566de00, blkno=0, len=, flags=, bpp=0x7fffe55e0228) at rdwr.c:457 -#8 libxfs_buf_read_map (btp=0x55555566de00, map=map@entry=0x7fffe55e0280, nmaps=nmaps@entry=1, flags=flags@entry=0, bpp=bpp@entry=0x7fffe55e0278, ops=0x5555556233e0 ) - at rdwr.c:704 -#9 libxfs_buf_read (ops=, bpp=0x7fffe55e0278, flags=0, numblks=, blkno=0, target=) - at /storage/home/djwong/cdev/work/xfsprogs/build-x86_64/libxfs/libxfs_io.h:195 -#10 libxfs_getsb (mp=mp@entry=0x7fffffffd690) at rdwr.c:162 -#11 force_needsrepair (mp=0x7fffffffd690) at xfs_repair.c:924 -#12 repair_capture_writeback (bp=) at xfs_repair.c:1000 -#13 libxfs_bwrite (bp=0x7fffe011e530) at rdwr.c:869 -#14 cache_shake (cache=cache@entry=0x55555566de60, priority=priority@entry=2, purge=purge@entry=false) at cache.c:240 -#15 cache_node_get (cache=cache@entry=0x55555566de60, key=key@entry=0x7fffe55e0470, nodep=nodep@entry=0x7fffe55e0428) at cache.c:452 -#16 __cache_lookup (key=key@entry=0x7fffe55e0470, flags=1, bpp=bpp@entry=0x7fffe55e0538) at rdwr.c:405 -#17 libxfs_getbuf_flags (btp=0x55555566de00, blkno=12736, len=, flags=, bpp=0x7fffe55e0538) at rdwr.c:457 -#18 __libxfs_buf_get_map (btp=, map=map@entry=0x7fffe55e05b0, nmaps=, flags=flags@entry=1, bpp=bpp@entry=0x7fffe55e0538) at rdwr.c:501 -#19 libxfs_buf_get_map (btp=, map=map@entry=0x7fffe55e05b0, nmaps=, flags=flags@entry=1, bpp=bpp@entry=0x7fffe55e0538) at rdwr.c:525 -#20 pf_queue_io (args=args@entry=0x5555556722c0, map=map@entry=0x7fffe55e05b0, nmaps=, flag=flag@entry=11) at prefetch.c:124 -#21 pf_read_bmbt_reclist (args=0x5555556722c0, rp=, numrecs=78) at prefetch.c:220 -#22 pf_scan_lbtree (dbno=dbno@entry=1211, level=level@entry=1, isadir=isadir@entry=1, args=args@entry=0x5555556722c0, func=0x55555557f240 ) at prefetch.c:298 -#23 pf_read_btinode (isadir=1, dino=, args=0x5555556722c0) at prefetch.c:385 -#24 pf_read_inode_dirs (args=args@entry=0x5555556722c0, bp=bp@entry=0x7fffdc023790) at prefetch.c:459 -#25 pf_read_inode_dirs (bp=, args=0x5555556722c0) at prefetch.c:411 -#26 pf_batch_read (args=args@entry=0x5555556722c0, which=which@entry=PF_PRIMARY, buf=buf@entry=0x7fffd001d000) at prefetch.c:609 -#27 pf_io_worker (param=0x5555556722c0) at prefetch.c:673 -#28 start_thread (arg=) at ./nptl/pthread_create.c:442 -#29 clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81 - ->From this stack trace, we see that xfs_repair's prefetch module is -getting some xfs_buf objects ahead of initiating a read (#19). The -buffer cache has hit its limit, so it calls cache_shake (#14) to free -some unused xfs_bufs. The buffer it finds is a dirty buffer, so it -calls libxfs_bwrite to flush it out to disk, which in turn invokes the -buffer write hook that xfs_repair set up in 3b7667cb to mark the ondisk -filesystem's superblock as NEEDSREPAIR until repair actually completes. - -Unfortunately, the NEEDSREPAIR handler itself needs to grab the -superblock buffer, so it makes another call into the buffer cache (#9), -which sees that the cache is full and tries to shake it(#4). Hence we -deadlock on cm_mutex because shaking is not reentrant. - -Fix this by retaining a reference to the superblock buffer when possible -so that the writeback hook doesn't have to access the buffer cache to -set NEEDSREPAIR. - -Fixes: 3b7667cb ("xfs_repair: set NEEDSREPAIR the first time we write to a filesystem") -Signed-off-by: Darrick J. Wong -Reviewed-by: Carlos Maiolino -Signed-off-by: Carlos Maiolino -Signed-off-by: Pavel Reichl ---- - libxfs/libxfs_api_defs.h | 2 ++ - libxfs/libxfs_io.h | 1 + - libxfs/rdwr.c | 8 +++++ - repair/phase2.c | 8 +++++ - repair/protos.h | 1 + - repair/xfs_repair.c | 75 +++++++++++++++++++++++++++++++++++----- - 6 files changed, 86 insertions(+), 9 deletions(-) - -diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h -index 2716a731..f8efcce7 100644 ---- a/libxfs/libxfs_api_defs.h -+++ b/libxfs/libxfs_api_defs.h -@@ -53,9 +53,11 @@ - #define xfs_buf_delwri_submit libxfs_buf_delwri_submit - #define xfs_buf_get libxfs_buf_get - #define xfs_buf_get_uncached libxfs_buf_get_uncached -+#define xfs_buf_lock libxfs_buf_lock - #define xfs_buf_read libxfs_buf_read - #define xfs_buf_read_uncached libxfs_buf_read_uncached - #define xfs_buf_relse libxfs_buf_relse -+#define xfs_buf_unlock libxfs_buf_unlock - #define xfs_bunmapi libxfs_bunmapi - #define xfs_bwrite libxfs_bwrite - #define xfs_calc_dquots_per_chunk libxfs_calc_dquots_per_chunk -diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h -index 9c0e2704..fae86427 100644 ---- a/libxfs/libxfs_io.h -+++ b/libxfs/libxfs_io.h -@@ -226,6 +226,7 @@ xfs_buf_hold(struct xfs_buf *bp) - } - - void xfs_buf_lock(struct xfs_buf *bp); -+void xfs_buf_unlock(struct xfs_buf *bp); - - int libxfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags, - struct xfs_buf **bpp); -diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c -index 20e0793c..d5aad3ea 100644 ---- a/libxfs/rdwr.c -+++ b/libxfs/rdwr.c -@@ -384,6 +384,14 @@ xfs_buf_lock( - pthread_mutex_lock(&bp->b_lock); - } - -+void -+xfs_buf_unlock( -+ struct xfs_buf *bp) -+{ -+ if (use_xfs_buf_lock) -+ pthread_mutex_unlock(&bp->b_lock); -+} -+ - static int - __cache_lookup( - struct xfs_bufkey *key, -diff --git a/repair/phase2.c b/repair/phase2.c -index 56a39bb4..2ada95ae 100644 ---- a/repair/phase2.c -+++ b/repair/phase2.c -@@ -370,6 +370,14 @@ phase2( - } else - do_log(_("Phase 2 - using internal log\n")); - -+ /* -+ * Now that we've set up the buffer cache the way we want it, try to -+ * grab our own reference to the primary sb so that the hooks will not -+ * have to call out to the buffer cache. -+ */ -+ if (mp->m_buf_writeback_fn) -+ retain_primary_sb(mp); -+ - /* Zero log if applicable */ - do_log(_(" - zero log...\n")); - -diff --git a/repair/protos.h b/repair/protos.h -index 03ebae14..83e471ff 100644 ---- a/repair/protos.h -+++ b/repair/protos.h -@@ -16,6 +16,7 @@ int get_sb(xfs_sb_t *sbp, - xfs_off_t off, - int size, - xfs_agnumber_t agno); -+int retain_primary_sb(struct xfs_mount *mp); - void write_primary_sb(xfs_sb_t *sbp, - int size); - -diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c -index 871b428d..ff29bea9 100644 ---- a/repair/xfs_repair.c -+++ b/repair/xfs_repair.c -@@ -749,6 +749,63 @@ check_fs_vs_host_sectsize( - } - } - -+/* -+ * If we set up a writeback function to set NEEDSREPAIR while the filesystem is -+ * dirty, there's a chance that calling libxfs_getsb could deadlock the buffer -+ * cache while trying to get the primary sb buffer if the first non-sb write to -+ * the filesystem is the result of a cache shake. Retain a reference to the -+ * primary sb buffer to avoid all that. -+ */ -+static struct xfs_buf *primary_sb_bp; /* buffer for superblock */ -+ -+int -+retain_primary_sb( -+ struct xfs_mount *mp) -+{ -+ int error; -+ -+ error = -libxfs_buf_read(mp->m_ddev_targp, XFS_SB_DADDR, -+ XFS_FSS_TO_BB(mp, 1), 0, &primary_sb_bp, -+ &xfs_sb_buf_ops); -+ if (error) -+ return error; -+ -+ libxfs_buf_unlock(primary_sb_bp); -+ return 0; -+} -+ -+static void -+drop_primary_sb(void) -+{ -+ if (!primary_sb_bp) -+ return; -+ -+ libxfs_buf_lock(primary_sb_bp); -+ libxfs_buf_relse(primary_sb_bp); -+ primary_sb_bp = NULL; -+} -+ -+static int -+get_primary_sb( -+ struct xfs_mount *mp, -+ struct xfs_buf **bpp) -+{ -+ int error; -+ -+ *bpp = NULL; -+ -+ if (!primary_sb_bp) { -+ error = retain_primary_sb(mp); -+ if (error) -+ return error; -+ } -+ -+ libxfs_buf_lock(primary_sb_bp); -+ xfs_buf_hold(primary_sb_bp); -+ *bpp = primary_sb_bp; -+ return 0; -+} -+ - /* Clear needsrepair after a successful repair run. */ - void - clear_needsrepair( -@@ -769,15 +826,14 @@ clear_needsrepair( - do_warn( - _("Cannot clear needsrepair due to flush failure, err=%d.\n"), - error); -- return; -+ goto drop; - } - - /* Clear needsrepair from the superblock. */ -- bp = libxfs_getsb(mp); -- if (!bp || bp->b_error) { -+ error = get_primary_sb(mp, &bp); -+ if (error) { - do_warn( -- _("Cannot clear needsrepair from primary super, err=%d.\n"), -- bp ? bp->b_error : ENOMEM); -+ _("Cannot clear needsrepair from primary super, err=%d.\n"), error); - } else { - mp->m_sb.sb_features_incompat &= - ~XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR; -@@ -786,6 +842,8 @@ clear_needsrepair( - } - if (bp) - libxfs_buf_relse(bp); -+drop: -+ drop_primary_sb(); - } - - static void -@@ -808,11 +866,10 @@ force_needsrepair( - xfs_sb_version_needsrepair(&mp->m_sb)) - return; - -- bp = libxfs_getsb(mp); -- if (!bp || bp->b_error) { -+ error = get_primary_sb(mp, &bp); -+ if (error) { - do_log( -- _("couldn't get superblock to set needsrepair, err=%d\n"), -- bp ? bp->b_error : ENOMEM); -+ _("couldn't get superblock to set needsrepair, err=%d\n"), error); - } else { - /* - * It's possible that we need to set NEEDSREPAIR before we've --- -2.40.0 - diff --git a/SOURCES/xfsprogs-5.19.0.tar.sign b/SOURCES/xfsprogs-5.19.0.tar.sign deleted file mode 100644 index 92b5788..0000000 --- a/SOURCES/xfsprogs-5.19.0.tar.sign +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQJIBAABCAAyFiEEK4GFkZ6NJImBhp3tIK4WkuE93uAFAmL2oA0UHHNhbmRlZW5A -c2FuZGVlbi5uZXQACgkQIK4WkuE93uCKsxAAxhIfv5fSmuy7Qh+b8w3a4khG8r5V -BtaNAqbKE+Zz1Rl8z3TGlYKXcI/Ruola5UKUjXzGeHBbXcOGWDpWoaMp5kDnloUP -SovsR+qpBUijPO4bff/7aR9+4tHS2UvEv0yDuG8gd6VyOGxPXDgwFSCEse4bWf61 -l5UZN3dPXOMmm+G4ZITWuq1Us+3/uz12WwSuftCbPsghcCIDhnEQSA40yqyU2yJH -WTkLBb9/ROFN2iLjJ2HWeCEdZ62+mT767tZrmaQHlzFbK+rrl3CA7S+RjWHFA0qz -tDBLJLDMBdAExmR+sG+48pZTbgd1s8aXmMjCt80q5OzB5dKTfoYlqljkZxyIM0E2 -y2Kq716s4rBHV/Na/lhqYMPAPY3hG9iDOLKAVSJWbI7i/j5t5+Uin697Ha79cupO -3bD7tJBr4JpL+tu9Q9khQhekGgSGqfQG/a9aJA0H8DoPsmOuuUrJBKs10npvVu18 -Cx5WHwNeadK3rr0DLgik0X1POUex0fD+xjYXMWCHSJZhoC2wCbyvgg1xwYgEg16n -iyh+yxYSOlNgTZsseP/AmgsfKDO0hH/k4PiXrd4vT4+jDcVzBEQ62j8QJ629/qyC -mChjhcbzrJosAseLDMbm5gM2M79nqavrdvBhJ9JMEIjq/5m8VaQrmZE12w48lh92 -WIngBgst2MrB8mE= -=KQvs ------END PGP SIGNATURE----- diff --git a/SOURCES/xfsprogs-6.3.0.tar.sign b/SOURCES/xfsprogs-6.3.0.tar.sign new file mode 100644 index 0000000..97bd0f7 --- /dev/null +++ b/SOURCES/xfsprogs-6.3.0.tar.sign @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- + +iIQEABYIAC0WIQT6QG4gav94c4l8aGS0VhjDaiT9IwUCZGs+kg8cY2VtQGtlcm5l +bC5vcmcACgkQtFYYw2ok/SO6wgEAgMdBBcJsx/oEPKLXGZr+ueGZ81K7hGq8ueFF +sXp69AEA+PiK4Bh/angpo2lhftgZhGaOHxmj8vIyH2jJSw53LgE= +=+kzW +-----END PGP SIGNATURE----- diff --git a/SOURCES/xfsprogs-rhelonly-mkfs-fix-man-s-default-value-for-sparse-option.patch b/SOURCES/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch similarity index 78% rename from SOURCES/xfsprogs-rhelonly-mkfs-fix-man-s-default-value-for-sparse-option.patch rename to SOURCES/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch index 5394112..9935ae1 100644 --- a/SOURCES/xfsprogs-rhelonly-mkfs-fix-man-s-default-value-for-sparse-option.patch +++ b/SOURCES/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch @@ -1,17 +1,19 @@ -From 31980fef484df925b23824244de8ef353e436cef Mon Sep 17 00:00:00 2001 +From 965f91091e4442ea74132aa0c3c6795d922bda8c Mon Sep 17 00:00:00 2001 From: Pavel Reichl -Date: Thu, 8 Jun 2023 10:57:52 +0200 +Date: Thu, 8 Jun 2023 11:13:20 +0200 Subject: [PATCH] mkfs: fix man's default value for sparse option Fixes: 9cf846b51 ("mkfs: enable sparse inodes by default") Suggested-by: Lukas Herbolt Signed-off-by: Pavel Reichl +Reviewed-by: Darrick J. Wong +Signed-off-by: Carlos Maiolino --- man/man8/mkfs.xfs.8.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/man8/mkfs.xfs.8.in b/man/man8/mkfs.xfs.8.in -index 49e64d47a..48e26ece7 100644 +index 01f9dc6e..ce6f1e2d 100644 --- a/man/man8/mkfs.xfs.8.in +++ b/man/man8/mkfs.xfs.8.in @@ -631,7 +631,7 @@ Enable sparse inode chunk allocation. The @@ -24,5 +26,5 @@ index 49e64d47a..48e26ece7 100644 .B \-m crc=1. .IP -- -2.40.1 +2.41.0 diff --git a/SOURCES/xfsprogs-kernel-xfs-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch b/SOURCES/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch similarity index 77% rename from SOURCES/xfsprogs-kernel-xfs-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch rename to SOURCES/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch index c343f6a..d85159e 100644 --- a/SOURCES/xfsprogs-kernel-xfs-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch +++ b/SOURCES/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch @@ -1,33 +1,35 @@ -From 8e698ee72c4ecbbf18264568eb310875839fd601 Mon Sep 17 00:00:00 2001 +From 7901c8c1a501de87c42bb1ed83456f99462538c6 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" -Date: Tue, 2 May 2023 09:14:36 +1000 +Date: Thu, 1 Jun 2023 11:41:10 +0200 Subject: [PATCH] xfs: set bnobt/cntbt numrecs correctly when formatting new AGs +Source kernel commit: 8e698ee72c4ecbbf18264568eb310875839fd601 + Through generic/300, I discovered that mkfs.xfs creates corrupt filesystems when given these parameters: # mkfs.xfs -d size=512M /dev/sda -f -d su=128k,sw=4 --unsupported Filesystems formatted with --unsupported are not supported!! meta-data=/dev/sda isize=512 agcount=8, agsize=16352 blks - = sectsz=512 attr=2, projid32bit=1 - = crc=1 finobt=1, sparse=1, rmapbt=1 - = reflink=1 bigtime=1 inobtcount=1 nrext64=1 += sectsz=512 attr=2, projid32bit=1 += crc=1 finobt=1, sparse=1, rmapbt=1 += reflink=1 bigtime=1 inobtcount=1 nrext64=1 data = bsize=4096 blocks=130816, imaxpct=25 - = sunit=32 swidth=128 blks += sunit=32 swidth=128 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=8192, version=2 - = sectsz=512 sunit=32 blks, lazy-count=1 += sectsz=512 sunit=32 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 - = rgcount=0 rgsize=0 blks += rgcount=0 rgsize=0 blks Discarding blocks...Done. # xfs_repair -n /dev/sda Phase 1 - find and verify superblock... - - reporting progress in intervals of 15 minutes +- reporting progress in intervals of 15 minutes Phase 2 - using internal log - - zero log... - - 16:30:50: zeroing log - 16320 of 16320 blocks done - - scan filesystem freespace and inode maps... +- zero log... +- 16:30:50: zeroing log - 16320 of 16320 blocks done +- scan filesystem freespace and inode maps... agf_freeblks 25, counted 0 in ag 4 sb_fdblocks 8823, counted 8798 @@ -54,16 +56,17 @@ Fixes: f327a00745ff ("xfs: account for log space when formatting new AGs") Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner +Signed-off-by: Carlos Maiolino Signed-off-by: Pavel Reichl --- - fs/xfs/libxfs/xfs_ag.c | 19 +++++++++---------- + libxfs/xfs_ag.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) -diff --git a/fs/xfs/libxfs/xfs_ag.c b/fs/xfs/libxfs/xfs_ag.c -index 1b078bbbf225..9b373a0c7aaf 100644 ---- a//libxfs/xfs_ag.c -+++ b//libxfs/xfs_ag.c -@@ -495,10 +495,12 @@ xfs_freesp_init_recs( +diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c +index e3465e06..5d269312 100644 +--- a/libxfs/xfs_ag.c ++++ b/libxfs/xfs_ag.c +@@ -493,10 +493,12 @@ xfs_freesp_init_recs( ASSERT(start >= mp->m_ag_prealloc_blocks); if (start != mp->m_ag_prealloc_blocks) { /* @@ -77,7 +80,7 @@ index 1b078bbbf225..9b373a0c7aaf 100644 nrec = arec + 1; /* -@@ -509,7 +511,6 @@ xfs_freesp_init_recs( +@@ -507,7 +509,6 @@ xfs_freesp_init_recs( be32_to_cpu(arec->ar_startblock) + be32_to_cpu(arec->ar_blockcount)); arec = nrec; @@ -85,7 +88,7 @@ index 1b078bbbf225..9b373a0c7aaf 100644 } /* * Change record start to after the internal log -@@ -518,15 +519,13 @@ xfs_freesp_init_recs( +@@ -516,15 +517,13 @@ xfs_freesp_init_recs( } /* @@ -105,7 +108,7 @@ index 1b078bbbf225..9b373a0c7aaf 100644 } /* -@@ -538,7 +537,7 @@ xfs_bnoroot_init( +@@ -536,7 +535,7 @@ xfs_bnoroot_init( struct xfs_buf *bp, struct aghdr_init_data *id) { @@ -114,7 +117,7 @@ index 1b078bbbf225..9b373a0c7aaf 100644 xfs_freesp_init_recs(mp, bp, id); } -@@ -548,7 +547,7 @@ xfs_cntroot_init( +@@ -546,7 +545,7 @@ xfs_cntroot_init( struct xfs_buf *bp, struct aghdr_init_data *id) { @@ -124,5 +127,5 @@ index 1b078bbbf225..9b373a0c7aaf 100644 } -- -2.40.1 +2.41.0 diff --git a/SOURCES/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch b/SOURCES/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch new file mode 100644 index 0000000..dfe8777 --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch @@ -0,0 +1,132 @@ +From bd970a7390d9af5ce859397a6c368d2465368d76 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Wed, 31 May 2023 11:13:21 +0200 +Subject: [PATCH] xfs: stabilize the dirent name transformation function used + for ascii-ci dir hash computation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Source kernel commit: a9248538facc3d9e769489e50a544509c2f9cebe + +Back in the old days, the "ascii-ci" feature was created to implement +case-insensitive directory entry lookups for latin1-encoded names and +remove the large overhead of Samba's case-insensitive lookup code. UTF8 +names were not allowed, but nobody explicitly wrote in the documentation +that this was only expected to work if the system used latin1 names. +The kernel tolower function was selected to prepare names for hashed +lookups. + +There's a major discrepancy in the function that computes directory entry +hashes for filesystems that have ASCII case-insensitive lookups enabled. +The root of this is that the kernel and glibc's tolower implementations +have differing behavior for extended ASCII accented characters. I wrote +a program to spit out characters for which the tolower() return value is +different from the input: + +glibc tolower: +65:A 66:B 67:C 68:D 69:E 70:F 71:G 72:H 73:I 74:J 75:K 76:L 77:M 78:N +79:O 80:P 81:Q 82:R 83:S 84:T 85:U 86:V 87:W 88:X 89:Y 90:Z + +kernel tolower: +65:A 66:B 67:C 68:D 69:E 70:F 71:G 72:H 73:I 74:J 75:K 76:L 77:M 78:N +79:O 80:P 81:Q 82:R 83:S 84:T 85:U 86:V 87:W 88:X 89:Y 90:Z 192:À 193:Á +194:Â 195:Ã 196:Ä 197:Å 198:Æ 199:Ç 200:È 201:É 202:Ê 203:Ë 204:Ì 205:Í +206:Î 207:Ï 208:Ð 209:Ñ 210:Ò 211:Ó 212:Ô 213:Õ 214:Ö 215:× 216:Ø 217:Ù +218:Ú 219:Û 220:Ü 221:Ý 222:Þ + +Which means that the kernel and userspace do not agree on the hash value +for a directory filename that contains those higher values. The hash +values are written into the leaf index block of directories that are +larger than two blocks in size, which means that xfs_repair will flag +these directories as having corrupted hash indexes and rewrite the index +with hash values that the kernel now will not recognize. + +Because the ascii-ci feature is not frequently enabled and the kernel +touches filesystems far more frequently than xfs_repair does, fix this +by encoding the kernel's toupper predicate and tolower functions into +libxfs. Give the new functions less provocative names to make it really +obvious that this is a pre-hash name preparation function, and nothing +else. This change makes userspace's behavior consistent with the +kernel. + +Found by auditing obfuscate_name in xfs_metadump as part of working on +parent pointers, wondering how it could possibly work correctly with ci +filesystems, writing a test tool to create a directory with +hash-colliding names, and watching xfs_repair flag it. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Christoph Hellwig +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + libxfs/xfs_dir2.c | 5 +++-- + libxfs/xfs_dir2.h | 31 +++++++++++++++++++++++++++++++ + 2 files changed, 34 insertions(+), 2 deletions(-) + +diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c +index d6a19296..c19684b3 100644 +--- a/libxfs/xfs_dir2.c ++++ b/libxfs/xfs_dir2.c +@@ -63,7 +63,7 @@ xfs_ascii_ci_hashname( + int i; + + for (i = 0, hash = 0; i < name->len; i++) +- hash = tolower(name->name[i]) ^ rol32(hash, 7); ++ hash = xfs_ascii_ci_xfrm(name->name[i]) ^ rol32(hash, 7); + + return hash; + } +@@ -84,7 +84,8 @@ xfs_ascii_ci_compname( + for (i = 0; i < len; i++) { + if (args->name[i] == name[i]) + continue; +- if (tolower(args->name[i]) != tolower(name[i])) ++ if (xfs_ascii_ci_xfrm(args->name[i]) != ++ xfs_ascii_ci_xfrm(name[i])) + return XFS_CMP_DIFFERENT; + result = XFS_CMP_CASE; + } +diff --git a/libxfs/xfs_dir2.h b/libxfs/xfs_dir2.h +index dd39f17d..19af22a1 100644 +--- a/libxfs/xfs_dir2.h ++++ b/libxfs/xfs_dir2.h +@@ -248,4 +248,35 @@ unsigned int xfs_dir3_data_end_offset(struct xfs_da_geometry *geo, + struct xfs_dir2_data_hdr *hdr); + bool xfs_dir2_namecheck(const void *name, size_t length); + ++/* ++ * The "ascii-ci" feature was created to speed up case-insensitive lookups for ++ * a Samba product. Because of the inherent problems with CI and UTF-8 ++ * encoding, etc, it was decided that Samba would be configured to export ++ * latin1/iso 8859-1 encodings as that covered >90% of the target markets for ++ * the product. Hence the "ascii-ci" casefolding code could be encoded into ++ * the XFS directory operations and remove all the overhead of casefolding from ++ * Samba. ++ * ++ * To provide consistent hashing behavior between the userspace and kernel, ++ * these functions prepare names for hashing by transforming specific bytes ++ * to other bytes. Robustness with other encodings is not guaranteed. ++ */ ++static inline bool xfs_ascii_ci_need_xfrm(unsigned char c) ++{ ++ if (c >= 0x41 && c <= 0x5a) /* A-Z */ ++ return true; ++ if (c >= 0xc0 && c <= 0xd6) /* latin A-O with accents */ ++ return true; ++ if (c >= 0xd8 && c <= 0xde) /* latin O-Y with accents */ ++ return true; ++ return false; ++} ++ ++static inline unsigned char xfs_ascii_ci_xfrm(unsigned char c) ++{ ++ if (xfs_ascii_ci_need_xfrm(c)) ++ c -= 'A' - 'a'; ++ return c; ++} ++ + #endif /* __XFS_DIR2_H__ */ +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch b/SOURCES/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch new file mode 100644 index 0000000..c1d2a19 --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch @@ -0,0 +1,178 @@ +From 10a01bcdd748773c185255516a72e75a71295bd4 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Thu, 15 Jun 2023 09:11:04 -0700 +Subject: [PATCH] xfs_db: fix metadump name obfuscation for ascii-ci + filesystems + +Now that we've stabilized the dirent hash function for ascii-ci +filesystems, adapt the metadump name obfuscation code to detect when +it's obfuscating a directory entry name on an ascii-ci filesystem and +spit out names that actually have the same hash. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Eric Sandeen +Reviewed-by: Carlos Maiolino +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + db/metadump.c | 82 +++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 73 insertions(+), 9 deletions(-) + +diff --git a/db/metadump.c b/db/metadump.c +index 317ff728..9ccee0b7 100644 +--- a/db/metadump.c ++++ b/db/metadump.c +@@ -817,13 +817,17 @@ static void + obfuscate_name( + xfs_dahash_t hash, + size_t name_len, +- unsigned char *name) ++ unsigned char *name, ++ bool is_dirent) + { +- unsigned char *newp = name; ++ unsigned char *oldname = NULL; ++ unsigned char *newp; + int i; +- xfs_dahash_t new_hash = 0; ++ xfs_dahash_t new_hash; + unsigned char *first; + unsigned char high_bit; ++ int tries = 0; ++ bool is_ci_name = is_dirent && xfs_has_asciici(mp); + int shift; + + /* +@@ -836,6 +840,26 @@ obfuscate_name( + if (name_len < 5) + return; + ++ if (is_ci_name) { ++ oldname = malloc(name_len); ++ if (!oldname) ++ return; ++ memcpy(oldname, name, name_len); ++ } ++ ++again: ++ newp = name; ++ new_hash = 0; ++ ++ /* ++ * If we cannot generate a ci-compatible obfuscated name after 1000 ++ * tries, don't bother obfuscating the name. ++ */ ++ if (tries++ > 1000) { ++ memcpy(name, oldname, name_len); ++ goto out_free; ++ } ++ + /* + * The beginning of the obfuscated name can be pretty much + * anything, so fill it in with random characters. +@@ -843,7 +867,11 @@ obfuscate_name( + */ + for (i = 0; i < name_len - 5; i++) { + *newp = random_filename_char(); +- new_hash = *newp ^ rol32(new_hash, 7); ++ if (is_ci_name) ++ new_hash = xfs_ascii_ci_xfrm(*newp) ^ ++ rol32(new_hash, 7); ++ else ++ new_hash = *newp ^ rol32(new_hash, 7); + newp++; + } + +@@ -867,6 +895,17 @@ obfuscate_name( + high_bit = 0x80; + } else + high_bit = 0; ++ ++ /* ++ * If ascii-ci is enabled, uppercase characters are converted ++ * to lowercase characters while computing the name hash. If ++ * any of the necessary correction bytes are uppercase, the ++ * hash of the new name will not match. Try again with a ++ * different prefix. ++ */ ++ if (is_ci_name && xfs_ascii_ci_need_xfrm(*newp)) ++ goto again; ++ + ASSERT(!is_invalid_char(*newp)); + newp++; + } +@@ -880,8 +919,15 @@ obfuscate_name( + */ + if (high_bit) { + *first ^= 0x10; ++ ++ if (is_ci_name && xfs_ascii_ci_need_xfrm(*first)) ++ goto again; ++ + ASSERT(!is_invalid_char(*first)); + } ++ ++out_free: ++ free(oldname); + } + + /* +@@ -1177,6 +1223,24 @@ handle_duplicate_name(xfs_dahash_t hash, size_t name_len, unsigned char *name) + return 1; + } + ++static inline xfs_dahash_t ++dirattr_hashname( ++ bool is_dirent, ++ const uint8_t *name, ++ int namelen) ++{ ++ if (is_dirent) { ++ struct xfs_name xname = { ++ .name = name, ++ .len = namelen, ++ }; ++ ++ return libxfs_dir2_hashname(mp, &xname); ++ } ++ ++ return libxfs_da_hashname(name, namelen); ++} ++ + static void + generate_obfuscated_name( + xfs_ino_t ino, +@@ -1205,9 +1269,9 @@ generate_obfuscated_name( + + /* Obfuscate the name (if possible) */ + +- hash = libxfs_da_hashname(name, namelen); +- obfuscate_name(hash, namelen, name); +- ASSERT(hash == libxfs_da_hashname(name, namelen)); ++ hash = dirattr_hashname(ino != 0, name, namelen); ++ obfuscate_name(hash, namelen, name, ino != 0); ++ ASSERT(hash == dirattr_hashname(ino != 0, name, namelen)); + + /* + * Make sure the name is not something already seen. If we +@@ -1320,7 +1384,7 @@ obfuscate_path_components( + /* last (or single) component */ + namelen = strnlen((char *)comp, len); + hash = libxfs_da_hashname(comp, namelen); +- obfuscate_name(hash, namelen, comp); ++ obfuscate_name(hash, namelen, comp, false); + ASSERT(hash == libxfs_da_hashname(comp, namelen)); + break; + } +@@ -1332,7 +1396,7 @@ obfuscate_path_components( + continue; + } + hash = libxfs_da_hashname(comp, namelen); +- obfuscate_name(hash, namelen, comp); ++ obfuscate_name(hash, namelen, comp, false); + ASSERT(hash == libxfs_da_hashname(comp, namelen)); + comp += namelen + 1; + len -= namelen + 1; +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch b/SOURCES/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch new file mode 100644 index 0000000..6c7a65f --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch @@ -0,0 +1,56 @@ +From cb8c70b017e30d4004373300bce488a9687166ac Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 5 Jun 2023 08:36:38 -0700 +Subject: [PATCH] xfs_db: move obfuscate_name assertion to callers + +Currently, obfuscate_name asserts that the hash of the new name is the +same as the old name. To enable bug fixes in the next patch, move this +assertion to the callers. + +Signed-off-by: Darrick J. Wong +Reviewed-by: Christoph Hellwig +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + db/metadump.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/db/metadump.c b/db/metadump.c +index 27d1df43..317ff728 100644 +--- a/db/metadump.c ++++ b/db/metadump.c +@@ -882,7 +882,6 @@ obfuscate_name( + *first ^= 0x10; + ASSERT(!is_invalid_char(*first)); + } +- ASSERT(libxfs_da_hashname(name, name_len) == hash); + } + + /* +@@ -1208,6 +1207,7 @@ generate_obfuscated_name( + + hash = libxfs_da_hashname(name, namelen); + obfuscate_name(hash, namelen, name); ++ ASSERT(hash == libxfs_da_hashname(name, namelen)); + + /* + * Make sure the name is not something already seen. If we +@@ -1321,6 +1321,7 @@ obfuscate_path_components( + namelen = strnlen((char *)comp, len); + hash = libxfs_da_hashname(comp, namelen); + obfuscate_name(hash, namelen, comp); ++ ASSERT(hash == libxfs_da_hashname(comp, namelen)); + break; + } + namelen = slash - (char *)comp; +@@ -1332,6 +1333,7 @@ obfuscate_path_components( + } + hash = libxfs_da_hashname(comp, namelen); + obfuscate_name(hash, namelen, comp); ++ ASSERT(hash == libxfs_da_hashname(comp, namelen)); + comp += namelen + 1; + len -= namelen + 1; + } +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch b/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch new file mode 100644 index 0000000..2702e55 --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch @@ -0,0 +1,41 @@ +From aca02624815ca47c6fd4cafdb0aeaad641ca1915 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 5 Jun 2023 08:37:24 -0700 +Subject: [PATCH] xfs_repair: don't add junked entries to the rebuilt directory + +If a directory contains multiple entries with the same name, we create +separate objects in the directory hashtab for each dirent. The first +one has p->junkit==0, but the subsequent ones have p->junkit==1. +Because these are duplicate names that are not garbage, the first +character of p->name.name is not set to a slash. + +Don't add these subsequent hashtab entries to the rebuilt directory. + +Found by running xfs/155 with the parent pointers patchset enabled. + +Fixes: 33165ec3b4b ("Fix dirv2 rebuild in phase6 Merge of master-melb:xfs-cmds:26664a by kenmcd.") +Signed-off-by: Darrick J. Wong +Reviewed-by: Pavel Reichl +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + repair/phase6.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/repair/phase6.c b/repair/phase6.c +index 25bbcd10..3870c5c9 100644 +--- a/repair/phase6.c ++++ b/repair/phase6.c +@@ -1316,7 +1316,8 @@ longform_dir2_rebuild( + /* go through the hash list and re-add the inodes */ + + for (p = hashtab->first; p; p = p->nextbyorder) { +- ++ if (p->junkit) ++ continue; + if (p->name.name[0] == '/' || (p->name.name[0] == '.' && + (p->name.len == 1 || (p->name.len == 2 && + p->name.name[1] == '.')))) +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch b/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch new file mode 100644 index 0000000..26c6a55 --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch @@ -0,0 +1,57 @@ +From 67f541056f4dd3ba1ccc5d11464d67afdab0f2a3 Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 5 Jun 2023 08:37:39 -0700 +Subject: [PATCH] xfs_repair: don't spray correcting imap all by itself + +In xfs/155, I occasionally see this in the xfs_repair output: + +correcting imap +correcting imap +correcting imap +... + +This is completely useless, since we don't actually log which inode +prompted this message. This logic has been here for a really long time, +but ... I can't make heads nor tails of it. If we're running in verbose +or dry-run mode, then print the inode number, but not if we're running +in fixit mode? + +A few lines later, if we're running in verbose dry-run mode, we print +"correcting imap" even though we're not going to write anything. + +If we get here, the inode looks like it's in use, but the inode index +says it isn't. This is a corruption, so either we fix it or we say that +we would fix it. + +Fixes: 6c39a3cbda3 ("Don't trash lost+found in phase 4 Merge of master-melb:xfs-cmds:29144a by kenmcd.") +Signed-off-by: Darrick J. Wong +Reviewed-by: Carlos Maiolino +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + repair/dino_chunks.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c +index 0e09132b..0841e65b 100644 +--- a/repair/dino_chunks.c ++++ b/repair/dino_chunks.c +@@ -871,13 +871,11 @@ next_readbuf: + */ + if (is_used) { + if (is_inode_free(ino_rec, irec_offset)) { +- if (verbose || no_modify) { +- do_warn( ++ do_warn( + _("imap claims in-use inode %" PRIu64 " is free, "), + ino); +- } + +- if (verbose || !no_modify) ++ if (!no_modify) + do_warn(_("correcting imap\n")); + else + do_warn(_("would correct imap\n")); +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch b/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch new file mode 100644 index 0000000..805552a --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch @@ -0,0 +1,39 @@ +From 1e12a0751b99efd48cda501258e16f00bef9d13d Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 5 Jun 2023 08:38:01 -0700 +Subject: [PATCH] xfs_repair: fix messaging when fixing imap due to sparse + cluster + +This logic is wrong -- if we're in verbose dry-run mode, we do NOT want +to say that we're correcting the imap. Otherwise, we print things like: + +imap claims inode XXX is present, but inode cluster is sparse, + +But then we can erroneously tell the user that we would correct the +imap when in fact we /are/ correcting it. + +Fixes: f4ff8086586 ("xfs_repair: don't crash on partially sparse inode clusters") +Signed-off-by: Darrick J. Wong +Reviewed-by: Carlos Maiolino +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + repair/dino_chunks.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c +index 0841e65b1844..64ce2a323c8d 100644 +--- a/repair/dino_chunks.c ++++ b/repair/dino_chunks.c +@@ -834,7 +834,7 @@ next_readbuf: + do_warn( + _("imap claims inode %" PRIu64 " is present, but inode cluster is sparse, "), + ino); +- if (verbose || !no_modify) ++ if (!no_modify) + do_warn(_("correcting imap\n")); + else + do_warn(_("would correct imap\n")); +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch b/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch new file mode 100644 index 0000000..9f1abab --- /dev/null +++ b/SOURCES/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch @@ -0,0 +1,96 @@ +From d159552bbb05de6998388b960f50e5e0012828ea Mon Sep 17 00:00:00 2001 +From: "Darrick J. Wong" +Date: Mon, 5 Jun 2023 08:37:50 -0700 +Subject: [PATCH] xfs_repair: fix messaging when shortform_dir2_junk is called + +This function is called when we've decide to junk a shortform directory +entry. This is obviously corruption of some kind, so we should always +say something, particularly if we're in !verbose repair mode. +Otherwise, if we're in non-verbose repair mode, we print things like: + +entry "FOO" in shortform directory XXX references non-existent inode YYY + +Without telling the sysadmin that we're removing the dirent. + +Fixes: aaca101b1ae ("xfs_repair: add support for validating dirent ftype field") +Signed-off-by: Darrick J. Wong +Reviewed-by: Carlos Maiolino +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + repair/phase6.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +diff --git a/repair/phase6.c b/repair/phase6.c +index c6418534..be10d9b7 100644 +--- a/repair/phase6.c ++++ b/repair/phase6.c +@@ -2440,10 +2440,7 @@ shortform_dir2_junk( + */ + (*index)--; + +- if (verbose) +- do_warn(_("junking entry\n")); +- else +- do_warn("\n"); ++ do_warn(_("junking entry\n")); + return sfep; + } + +@@ -2592,7 +2589,7 @@ shortform_dir2_entry_check( + + if (irec == NULL) { + do_warn( +- _("entry \"%s\" in shortform directory %" PRIu64 " references non-existent inode %" PRIu64 "\n"), ++ _("entry \"%s\" in shortform directory %" PRIu64 " references non-existent inode %" PRIu64 ", "), + fname, ino, lino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, lino, + &max_size, &i, &bytes_deleted, +@@ -2609,7 +2606,7 @@ shortform_dir2_entry_check( + */ + if (is_inode_free(irec, ino_offset)) { + do_warn( +- _("entry \"%s\" in shortform directory inode %" PRIu64 " points to free inode %" PRIu64 "\n"), ++ _("entry \"%s\" in shortform directory inode %" PRIu64 " points to free inode %" PRIu64 ", "), + fname, ino, lino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, lino, + &max_size, &i, &bytes_deleted, +@@ -2625,7 +2622,7 @@ shortform_dir2_entry_check( + */ + if (!inode_isadir(irec, ino_offset)) { + do_warn( +- _("%s (ino %" PRIu64 ") in root (%" PRIu64 ") is not a directory"), ++ _("%s (ino %" PRIu64 ") in root (%" PRIu64 ") is not a directory, "), + ORPHANAGE, lino, ino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, + lino, &max_size, &i, +@@ -2647,7 +2644,7 @@ shortform_dir2_entry_check( + lino, sfep->namelen, sfep->name, + libxfs_dir2_sf_get_ftype(mp, sfep))) { + do_warn( +-_("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"), ++_("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name, "), + fname, lino, ino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, lino, + &max_size, &i, &bytes_deleted, +@@ -2672,7 +2669,7 @@ _("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"), + if (is_inode_reached(irec, ino_offset)) { + do_warn( + _("entry \"%s\" in directory inode %" PRIu64 +- " references already connected inode %" PRIu64 ".\n"), ++ " references already connected inode %" PRIu64 ", "), + fname, ino, lino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, + lino, &max_size, &i, +@@ -2696,7 +2693,7 @@ _("entry \"%s\" (ino %" PRIu64 ") in dir %" PRIu64 " is a duplicate name"), + do_warn( + _("entry \"%s\" in directory inode %" PRIu64 + " not consistent with .. value (%" PRIu64 +- ") in inode %" PRIu64 ",\n"), ++ ") in inode %" PRIu64 ", "), + fname, ino, parent, lino); + next_sfep = shortform_dir2_junk(mp, sfp, sfep, + lino, &max_size, &i, +-- +2.41.0 + diff --git a/SOURCES/xfsprogs-5.19.0-disable-old-kernel-bigtime-inobtcnt-on.patch b/SOURCES/xfsprogs-rhelonly-disable-old-kernel-bigtime-inobtcnt-on.patch similarity index 96% rename from SOURCES/xfsprogs-5.19.0-disable-old-kernel-bigtime-inobtcnt-on.patch rename to SOURCES/xfsprogs-rhelonly-disable-old-kernel-bigtime-inobtcnt-on.patch index 1f5cc7f..c4f739a 100644 --- a/SOURCES/xfsprogs-5.19.0-disable-old-kernel-bigtime-inobtcnt-on.patch +++ b/SOURCES/xfsprogs-rhelonly-disable-old-kernel-bigtime-inobtcnt-on.patch @@ -1,7 +1,7 @@ --- a/mkfs/xfs_mkfs.c.orig 2022-08-12 20:38:21.000000000 +0200 +++ b/mkfs/xfs_mkfs.c 2023-01-25 11:06:01.863076713 +0100 @@ -13,6 +13,8 @@ - #include "libfrog/crc32cselftest.h" + #include "libfrog/dahashselftest.h" #include "proto.h" #include +#include diff --git a/SOURCES/xfsprogs-5.12.0-example-conf.patch b/SOURCES/xfsprogs-rhelonly-example-conf.patch similarity index 100% rename from SOURCES/xfsprogs-5.12.0-example-conf.patch rename to SOURCES/xfsprogs-rhelonly-example-conf.patch diff --git a/SOURCES/xfsprogs-5.19.0-mkfs-tolerate-tiny-filesystems.patch b/SOURCES/xfsprogs-rhelonly-mkfs-tolerate-tiny-filesystems.patch similarity index 100% rename from SOURCES/xfsprogs-5.19.0-mkfs-tolerate-tiny-filesystems.patch rename to SOURCES/xfsprogs-rhelonly-mkfs-tolerate-tiny-filesystems.patch diff --git a/SOURCES/xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch b/SOURCES/xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch new file mode 100644 index 0000000..2a15859 --- /dev/null +++ b/SOURCES/xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch @@ -0,0 +1,91 @@ +From ea73527ddb9c9525e696efe0b0dc5f5c8326ec4a Mon Sep 17 00:00:00 2001 +From: Pavel Reichl +Date: Wed, 11 Oct 2023 22:27:55 +0200 +Subject: [PATCH] xfs_quota: fix missing mount point warning + +When user have mounted an XFS volume, and defined project in +/etc/projects file that points to a directory on a different volume, +then: + `xfs_quota -xc "report -a" $path_to_mounted_volume' + +complains with: + "xfs_quota: cannot find mount point for path \ +`directory_from_projects': Invalid argument" + +unlike `xfs_quota -xc "report -a"' which works as expected and no +warning is printed. + +This is happening because in the 1st call we pass to xfs_quota command +the $path_to_mounted_volume argument which says to xfs_quota not to +look for all mounted volumes on the system, but use only those passed +to the command and ignore all others (This behavior is intended as an +optimization for systems with huge number of mounted volumes). After +that, while projects are initialized, the project's directories on +other volumes are obviously not in searched subset of volumes and +warning is printed. + +I propose to fix this behavior by conditioning the printing of warning +only if all mounted volumes are searched. + +Signed-off-by: Pavel Reichl +--- + libfrog/paths.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +diff --git a/libfrog/paths.c b/libfrog/paths.c +index abb29a237..d8c42163a 100644 +--- a/libfrog/paths.c ++++ b/libfrog/paths.c +@@ -457,7 +457,8 @@ fs_table_insert_mount( + + static int + fs_table_initialise_projects( +- char *project) ++ char *project, ++ bool all_mps_initialised) + { + fs_project_path_t *path; + fs_path_t *fs; +@@ -473,8 +474,10 @@ fs_table_initialise_projects( + continue; + fs = fs_mount_point_from_path(path->pp_pathname); + if (!fs) { +- fprintf(stderr, _("%s: cannot find mount point for path `%s': %s\n"), +- progname, path->pp_pathname, strerror(errno)); ++ if (all_mps_initialised) ++ fprintf(stderr, ++ _("%s: cannot find mount point for path `%s': %s\n"), progname, ++ path->pp_pathname, strerror(errno)); + continue; + } + (void) fs_table_insert(path->pp_pathname, path->pp_prid, +@@ -495,11 +498,12 @@ fs_table_initialise_projects( + + static void + fs_table_insert_project( +- char *project) ++ char *project, ++ bool all_mps_initialised) + { + int error; + +- error = fs_table_initialise_projects(project); ++ error = fs_table_initialise_projects(project, all_mps_initialised); + if (error) + fprintf(stderr, _("%s: cannot setup path for project %s: %s\n"), + progname, project, strerror(error)); +@@ -532,9 +536,9 @@ fs_table_initialise( + } + if (project_count) { + for (i = 0; i < project_count; i++) +- fs_table_insert_project(projects[i]); ++ fs_table_insert_project(projects[i], mount_count == 0); + } else { +- error = fs_table_initialise_projects(NULL); ++ error = fs_table_initialise_projects(NULL, mount_count == 0); + if (error) + goto out_error; + } +-- +2.41.0 + diff --git a/SPECS/xfsprogs.spec b/SPECS/xfsprogs.spec index e693de4..cf850be 100644 --- a/SPECS/xfsprogs.spec +++ b/SPECS/xfsprogs.spec @@ -1,12 +1,12 @@ Summary: Utilities for managing the XFS filesystem Name: xfsprogs -Version: 5.19.0 -Release: 4%{?dist} +Version: 6.3.0 +Release: 1%{?dist} License: GPL+ and LGPLv2+ URL: https://xfs.wiki.kernel.org Source0: http://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.xz Source1: http://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.sign -Source2: https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/plain/keys/20AE1692E13DDEE0.asc +Source2: https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/plain/keys/13F703E6C11CF6F0.asc Source3: rhel8.0.conf Requires: util-linux BuildRequires: make @@ -23,20 +23,20 @@ Obsoletes: xfsprogs-qa-devel <= %{version} Conflicts: xfsdump < 3.0.1 Suggests: xfsprogs-xfs_scrub -Patch0: xfsprogs-5.19.0-disable-old-kernel-bigtime-inobtcnt-on.patch -Patch1: xfsprogs-5.12.0-example-conf.patch -Patch2: xfsprogs-5.19.0-mkfs-tolerate-tiny-filesystems.patch -Patch3: xfsprogs-5.19.0-xfs-hoist-refcount-record-merge-predicates.patch -Patch4: xfsprogs-5.19.0-xfs_db-fix-dir3-block-magic-check.patch -Patch5: xfsprogs-5.19.0-xfs-estimate-post-merge-refcounts-correctly.patch -Patch7: xfsprogs-5.19.0-xfs-fix-off-by-one-error-in-xfs_btree_space_to_heigh.patch -Patch8: xfsprogs-5.19.0-xfs-fix-sb-write-verify-for-lazysbcount.patch -Patch9: xfsprogs-5.19.0-xfs-get-rid-of-assert-from-xfs_btree_islastblock.patch -Patch10: xfsprogs-5.19.0-xfs-removed-useless-condition-in-function-xfs_attr_n.patch -Patch11: xfsprogs-5.19.0-xfs_repair-retain-superblock-buffer-to-avoid-write-h.patch -Patch12: xfsprogs-kernel-xfs-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch -Patch13: xfsprogs-rhelonly-mkfs-fix-man-s-default-value-for-sparse-option.patch -Patch14: xfsprogs-6.5.0-mkfs.xfs.8-correction-on-mkfs.xfs-manpage-since-refl.patch +Patch0: xfsprogs-rhelonly-disable-old-kernel-bigtime-inobtcnt-on.patch +Patch1: xfsprogs-rhelonly-example-conf.patch +Patch2: xfsprogs-rhelonly-mkfs-tolerate-tiny-filesystems.patch +Patch3: xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch +Patch4: xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch +Patch5: xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch +Patch6: xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch +Patch7: xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch +Patch8: xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch +Patch9: xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch +Patch10: xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch +Patch11: xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch +Patch12: xfsprogs-6.5.0-mkfs.xfs.8-correction-on-mkfs.xfs-manpage-since-refl.patch +Patch13: xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch %description A set of commands to use the XFS filesystem, including mkfs.xfs. @@ -148,6 +148,46 @@ install -m 0644 %{SOURCE3} %{buildroot}%{mkfsdir} %{_libdir}/*.so %changelog +* Mon Nov 13 2023 Pavel Reichl - 6.3.0-1 +- Rebase to upstream version 6.3.0 +- +- Following is a list of dropped backported patches which +- are contained in the current rebase: +- xfsprogs-5.19.0-xfs-hoist-refcount-record-merge-predicates.patch (v6.2.0) +- xfsprogs-5.19.0-xfs_db-fix-dir3-block-magic-check.patch (v6.1.0) +- xfsprogs-5.19.0-xfs-estimate-post-merge-refcounts-correctly.patch (v6.2.0) +- xfsprogs-5.19.0-xfs-get-rid-of-assert-from-xfs_btree_islastblock.patch (v6.2.0) +- xfsprogs-5.19.0-xfs-fix-off-by-one-error-in-xfs_btree_space_to_heigh.patch (v6.2.0) +- xfsprogs-5.19.0-xfs-fix-sb-write-verify-for-lazysbcount.patch (v6.1.0) +- xfsprogs-5.19.0-xfs-removed-useless-condition-in-function-xfs_attr_n.patch (v6.0.0) +- xfsprogs-5.19.0-xfs_repair-retain-superblock-buffer-to-avoid-write-h.patch (v6.1.0) +- +- Rename the remaining patches so the name contains upstream version in which +- they are implemented, or "rhelonly". +- +- Drop Eric Sandeen's public key used to check tarball signature and replace it by +- Carlos Maiolino's (current upstream xfsprogs maintainer). +- +- Following is a list of newly backported patches from versions released after 6.3 +- which are fixing patches present in version 6.3: +- xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch +- xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch +- xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch +- xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch +- +- Backport: +- xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch +- xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch +- xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch +- to implement RHEL-RHEL-8284 +- +- Backport xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch +- to implement RHEL-7900 +- +- Related: RHEL-15399 +- Related: RHEL-8284 +- Related: RHEL-7900 + * Wed Aug 02 2023 Pavel Reichl - 5.19.0-4 - Fix man page, mkfs.xfs(8): Update section on dax+reflink - compatibility (#2226900)