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 <preichl@redhat.com>
This commit is contained in:
parent
c49945ae5f
commit
96a8a81319
2
.gitignore
vendored
2
.gitignore
vendored
@ -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
|
||||
|
4
sources
4
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
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 965f91091e4442ea74132aa0c3c6795d922bda8c Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Reichl <preichl@redhat.com>
|
||||
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 <lukas@herbolt.com>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
---
|
||||
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
|
||||
|
@ -1,131 +0,0 @@
|
||||
From 7901c8c1a501de87c42bb1ed83456f99462538c6 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Dave Chinner <dchinner@redhat.com>
|
||||
Signed-off-by: Dave Chinner <david@fromorbit.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,132 +0,0 @@
|
||||
From bd970a7390d9af5ce859397a6c368d2465368d76 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Christoph Hellwig <hch@lst.de>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,178 +0,0 @@
|
||||
From 10a01bcdd748773c185255516a72e75a71295bd4 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
|
||||
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,56 +0,0 @@
|
||||
From cb8c70b017e30d4004373300bce488a9687166ac Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Christoph Hellwig <hch@lst.de>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,41 +0,0 @@
|
||||
From aca02624815ca47c6fd4cafdb0aeaad641ca1915 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Pavel Reichl <preichl@redhat.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 67f541056f4dd3ba1ccc5d11464d67afdab0f2a3 Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 1e12a0751b99efd48cda501258e16f00bef9d13d Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -1,96 +0,0 @@
|
||||
From d159552bbb05de6998388b960f50e5e0012828ea Mon Sep 17 00:00:00 2001
|
||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
||||
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 <djwong@kernel.org>
|
||||
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
|
||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
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
|
||||
|
@ -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 <preichl@redhat.com> - 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 <preichl@redhat.com> - 6.3.0-1
|
||||
- Rebase to upstream version 6.3.0
|
||||
-
|
||||
|
Loading…
Reference in New Issue
Block a user