From 96a8a81319eda0d8826ab644bcbb4820eb6cf666 Mon Sep 17 00:00:00 2001 From: Pavel Reichl Date: Tue, 21 May 2024 01:07:00 +0200 Subject: [PATCH] Rebase to upstream v6.4.0 Following is a list of dropped backported patches which are contained in the current rebase: xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.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-shortform_dir2_junk-is.patch 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 - Rename xfs_quota-fix-missing-mount-point-warning.patch to reflect upstream - version it was merged in. Resolves: RHEL-28339 Signed-off-by: Pavel Reichl --- .gitignore | 2 + sources | 4 +- ...an-s-default-value-for-sparse-option.patch | 30 --- ...tbt-numrecs-correctly-when-formattin.patch | 131 ------------- ...e-dirent-name-transformation-functio.patch | 132 ------------- ...ump-name-obfuscation-for-ascii-ci-fi.patch | 178 ------------------ ...-obfuscate_name-assertion-to-callers.patch | 56 ------ ...-add-junked-entries-to-the-rebuilt-d.patch | 41 ---- ...-spray-correcting-imap-all-by-itself.patch | 57 ------ ...essaging-when-fixing-imap-due-to-spa.patch | 39 ---- ...essaging-when-shortform_dir2_junk-is.patch | 96 ---------- ...uota-fix-missing-mount-point-warning.patch | 0 xfsprogs.spec | 33 ++-- 13 files changed, 25 insertions(+), 774 deletions(-) delete mode 100644 xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch delete mode 100644 xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch delete mode 100644 xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch delete mode 100644 xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch delete mode 100644 xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch delete mode 100644 xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch delete mode 100644 xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch delete mode 100644 xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch delete mode 100644 xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch rename xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch => xfsprogs-rhelonly-upstream-v6.6.0-xfs_quota-fix-missing-mount-point-warning.patch (100%) diff --git a/.gitignore b/.gitignore index 28585a3..e29410f 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,5 @@ xfsprogs-3.1.2.tar.gz /xfsprogs-5.19.0.tar.sign /xfsprogs-6.3.0.tar.sign /xfsprogs-6.3.0.tar.xz +/xfsprogs-6.4.0.tar.sign +/xfsprogs-6.4.0.tar.xz diff --git a/sources b/sources index 1db37a9..db8382b 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (xfsprogs-6.3.0.tar.sign) = 55d25cba087ab3b34ac4ff6ee12267c56aab8391cb74c0f1fbba82930ab8061de04014c29fa3e2db2800fb5c943b3c3656e0db832e0ed5206c24fe1478890b13 -SHA512 (xfsprogs-6.3.0.tar.xz) = dbb3e77d0d9cf184a0e647b8231350401a7549a23a0bfd9121cf2a1b48e85f71d98329dff440fc6e984bcecfdcc2a72f0f27c4989560f3c55359f21f3fb434bb +SHA512 (xfsprogs-6.4.0.tar.sign) = 7b3d48bc398d2962ac113f2f2804423cc8abfb3784ccee607945c19d89e34da629cc5b2b8c946af3d7b5839c6745cf20f1a72ddd2dea6e922c39d2ec9b7d6bc6 +SHA512 (xfsprogs-6.4.0.tar.xz) = 831e7747640bc2964b182226d8bb6f637610b123aeec9b3cb97a5de5d5b65bde30c6b40ad2e78de6a5214e823dd75de3a2bdfddd8ab1638f5c7340a760c91b3f diff --git a/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch b/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch deleted file mode 100644 index 9935ae1..0000000 --- a/xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 965f91091e4442ea74132aa0c3c6795d922bda8c Mon Sep 17 00:00:00 2001 -From: Pavel Reichl -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 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 - .I value - is either 0 or 1, with 1 signifying that sparse allocation is enabled. - If the value is omitted, 1 is assumed. Sparse inode allocation is --disabled by default. This feature is only available for filesystems -+enabled by default. This feature is only available for filesystems - formatted with - .B \-m crc=1. - .IP --- -2.41.0 - diff --git a/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch b/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch deleted file mode 100644 index d85159e..0000000 --- a/xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 7901c8c1a501de87c42bb1ed83456f99462538c6 Mon Sep 17 00:00:00 2001 -From: "Darrick J. Wong" -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 -data = bsize=4096 blocks=130816, imaxpct=25 -= 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 -realtime =none extsz=4096 blocks=0, rtextents=0 -= 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 -Phase 2 - using internal log -- 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 - -The root cause of this problem is the numrecs handling in -xfs_freesp_init_recs, which is used to initialize a new AG. Prior to -calling the function, we set up the new bnobt block with numrecs == 1 -and rely on _freesp_init_recs to format that new record. If the last -record created has a blockcount of zero, then it sets numrecs = 0. - -That last bit isn't correct if the AG contains the log, the start of the -log is not immediately after the initial blocks due to stripe alignment, -and the end of the log is perfectly aligned with the end of the AG. For -this case, we actually formatted a single bnobt record to handle the -free space before the start of the (stripe aligned) log, and incremented -arec to try to format a second record. That second record turned out to -be unnecessary, so what we really want is to leave numrecs at 1. - -The numrecs handling itself is overly complicated because a different -function sets numrecs == 1. Change the bnobt creation code to start -with numrecs set to zero and only increment it after successfully -formatting a free space extent into the btree block. - -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 ---- - libxfs/xfs_ag.c | 19 +++++++++---------- - 1 file changed, 9 insertions(+), 10 deletions(-) - -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) { - /* -- * Modify first record to pad stripe align of log -+ * Modify first record to pad stripe align of log and -+ * bump the record count. - */ - arec->ar_blockcount = cpu_to_be32(start - - mp->m_ag_prealloc_blocks); -+ be16_add_cpu(&block->bb_numrecs, 1); - nrec = arec + 1; - - /* -@@ -507,7 +509,6 @@ xfs_freesp_init_recs( - be32_to_cpu(arec->ar_startblock) + - be32_to_cpu(arec->ar_blockcount)); - arec = nrec; -- be16_add_cpu(&block->bb_numrecs, 1); - } - /* - * Change record start to after the internal log -@@ -516,15 +517,13 @@ xfs_freesp_init_recs( - } - - /* -- * Calculate the record block count and check for the case where -- * the log might have consumed all available space in the AG. If -- * so, reset the record count to 0 to avoid exposure of an invalid -- * record start block. -+ * Calculate the block count of this record; if it is nonzero, -+ * increment the record count. - */ - arec->ar_blockcount = cpu_to_be32(id->agsize - - be32_to_cpu(arec->ar_startblock)); -- if (!arec->ar_blockcount) -- block->bb_numrecs = 0; -+ if (arec->ar_blockcount) -+ be16_add_cpu(&block->bb_numrecs, 1); - } - - /* -@@ -536,7 +535,7 @@ xfs_bnoroot_init( - struct xfs_buf *bp, - struct aghdr_init_data *id) - { -- xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 1, id->agno); -+ xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 0, id->agno); - xfs_freesp_init_recs(mp, bp, id); - } - -@@ -546,7 +545,7 @@ xfs_cntroot_init( - struct xfs_buf *bp, - struct aghdr_init_data *id) - { -- xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 1, id->agno); -+ xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 0, id->agno); - xfs_freesp_init_recs(mp, bp, id); - } - --- -2.41.0 - diff --git a/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch b/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch deleted file mode 100644 index dfe8777..0000000 --- a/xfsprogs-6.4.0-xfs-stabilize-the-dirent-name-transformation-functio.patch +++ /dev/null @@ -1,132 +0,0 @@ -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/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch b/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch deleted file mode 100644 index c1d2a19..0000000 --- a/xfsprogs-6.4.0-xfs_db-fix-metadump-name-obfuscation-for-ascii-ci-fi.patch +++ /dev/null @@ -1,178 +0,0 @@ -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/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch b/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch deleted file mode 100644 index 6c7a65f..0000000 --- a/xfsprogs-6.4.0-xfs_db-move-obfuscate_name-assertion-to-callers.patch +++ /dev/null @@ -1,56 +0,0 @@ -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/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch b/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch deleted file mode 100644 index 2702e55..0000000 --- a/xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch +++ /dev/null @@ -1,41 +0,0 @@ -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/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch b/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch deleted file mode 100644 index 26c6a55..0000000 --- a/xfsprogs-6.4.0-xfs_repair-don-t-spray-correcting-imap-all-by-itself.patch +++ /dev/null @@ -1,57 +0,0 @@ -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/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch b/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch deleted file mode 100644 index 805552a..0000000 --- a/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.patch +++ /dev/null @@ -1,39 +0,0 @@ -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/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch b/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch deleted file mode 100644 index 9f1abab..0000000 --- a/xfsprogs-6.4.0-xfs_repair-fix-messaging-when-shortform_dir2_junk-is.patch +++ /dev/null @@ -1,96 +0,0 @@ -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/xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch b/xfsprogs-rhelonly-upstream-v6.6.0-xfs_quota-fix-missing-mount-point-warning.patch similarity index 100% rename from xfsprogs-rhelonly-xfs_quota-fix-missing-mount-point-warning.patch rename to xfsprogs-rhelonly-upstream-v6.6.0-xfs_quota-fix-missing-mount-point-warning.patch diff --git a/xfsprogs.spec b/xfsprogs.spec index cf850be..9c0a477 100644 --- a/xfsprogs.spec +++ b/xfsprogs.spec @@ -1,6 +1,6 @@ Summary: Utilities for managing the XFS filesystem Name: xfsprogs -Version: 6.3.0 +Version: 6.4.0 Release: 1%{?dist} License: GPL+ and LGPLv2+ URL: https://xfs.wiki.kernel.org @@ -26,17 +26,8 @@ Suggests: xfsprogs-xfs_scrub 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 +Patch3: xfsprogs-rhelonly-upstream-v6.6.0-xfs_quota-fix-missing-mount-point-warning.patch +Patch4: xfsprogs-6.5.0-mkfs.xfs.8-correction-on-mkfs.xfs-manpage-since-refl.patch %description A set of commands to use the XFS filesystem, including mkfs.xfs. @@ -148,6 +139,24 @@ install -m 0644 %{SOURCE3} %{buildroot}%{mkfsdir} %{_libdir}/*.so %changelog +* Mon May 20 2024 Pavel Reichl - 6.4.0-1 +- Rebase to a more recent upstream release +- Related: RHEL-28339 +- Following is a list of dropped backported patches which +- are contained in the current rebase: +- xfsprogs-6.4.0-set-bnobt-cntbt-numrecs-correctly-when-formattin.patch +- xfsprogs-6.4.0-mkfs-fix-man-s-default-value-for-sparse-option.patch +- xfsprogs-6.4.0-xfs_repair-don-t-add-junked-entries-to-the-rebuilt-d.patch +- xfsprogs-6.4.0-xfs_repair-fix-messaging-when-fixing-imap-due-to-spa.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-shortform_dir2_junk-is.patch +- 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 +- +- Rename xfs_quota-fix-missing-mount-point-warning.patch to reflect upstream +- version it was merged in. + * Mon Nov 13 2023 Pavel Reichl - 6.3.0-1 - Rebase to upstream version 6.3.0 -