parent
c484d980f8
commit
ea8f4865c1
@ -1 +1 @@
|
|||||||
SOURCES/xfsprogs-5.19.0.tar.xz
|
SOURCES/xfsprogs-6.3.0.tar.xz
|
||||||
|
@ -1 +1 @@
|
|||||||
12afbdd497603b98945ea18f9aa5a78c671a6e4c SOURCES/xfsprogs-5.19.0.tar.xz
|
e976c2c41a957ee16094690596ee210dd45951fa SOURCES/xfsprogs-6.3.0.tar.xz
|
||||||
|
@ -0,0 +1,174 @@
|
|||||||
|
pub ed25519 2022-05-27 [C]
|
||||||
|
4020459E58C1A52511F5399113F703E6C11CF6F0
|
||||||
|
uid Carlos Eduardo Maiolino <carlos@maiolino.me>
|
||||||
|
uid Carlos Eduardo Maiolino <cmaiolino@redhat.com>
|
||||||
|
uid Carlos Eduardo Maiolino <cem@kernel.org>
|
||||||
|
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-----
|
@ -1,185 +0,0 @@
|
|||||||
pub rsa4096 2011-11-03 [SC]
|
|
||||||
2B8185919E8D248981869DED20AE1692E13DDEE0
|
|
||||||
uid Eric R. Sandeen <sandeen@sandeen.net>
|
|
||||||
uid Eric R. Sandeen <sandeen@redhat.com>
|
|
||||||
sub rsa4096 2011-11-03 [E]
|
|
||||||
048CA40C8F5B5507E3A6CD6BE2C297037B26BEB4
|
|
||||||
|
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
4NMMCC8gkONe4tek
|
|
||||||
=EFoy
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
@ -1,113 +0,0 @@
|
|||||||
From b445624f0882badf00da739c52e58a85c18ae002 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
||||||
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 <djwong@kernel.org>
|
|
||||||
Reviewed-by: Dave Chinner <dchinner@redhat.com>
|
|
||||||
Reviewed-by: Xiao Yang <yangx.jy@fujitsu.com>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
|||||||
From a68dabd45f3591456ecf7e35f6a6077db79f6bc6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
||||||
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 <djwong@kernel.org>
|
|
||||||
Reviewed-by: Dave Chinner <dchinner@redhat.com>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
|||||||
From b827e2318ea2bb3eabca13a965c2535a1d7289e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Long Li <leo.lilong@huawei.com>
|
|
||||||
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 <leo.lilong@huawei.com>
|
|
||||||
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
|||||||
From f5ef812888a81be534466fa34df747c16bb65b7f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Guo Xuenan <guoxuenan@huawei.com>
|
|
||||||
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 <guoxuenan@huawei.com>
|
|
||||||
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,187 +0,0 @@
|
|||||||
From d1dca9f6b365e439878e550ed0c801bbfb6d347b Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
||||||
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 <djwong@kernel.org>
|
|
||||||
Reviewed-by: Dave Chinner <dchinner@redhat.com>
|
|
||||||
Reviewed-by: Xiao Yang <yangx.jy@fujitsu.com>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
|||||||
From 798d43495df2c8a09a73b8e868a71d8f2fd81d5e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Andrey Strachuk <strochuk@ispras.ru>
|
|
||||||
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 <strochuk@ispras.ru>
|
|
||||||
|
|
||||||
Fixes: 4d0cdd2bb8f0 ("xfs: clean up xfs_attr_node_hasname")
|
|
||||||
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
|
|
||||||
Signed-off-by: Carlos Maiolino <cem@kernel.org>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
From 7374f58bfeb38467bab6552a47a5cd6bbe3c2e2e Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
||||||
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 <djwong@kernel.org>
|
|
||||||
Reviewed-by: Dave Chinner <dchinner@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/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
|
|
||||||
|
|
@ -1,266 +0,0 @@
|
|||||||
From 945c7341dedab44ae5daed83377e6366c3fb8fee Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
||||||
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=<optimized out>, flags=<optimized out>, 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 <xfs_sb_buf_ops>)
|
|
||||||
at rdwr.c:704
|
|
||||||
#9 libxfs_buf_read (ops=<optimized out>, bpp=0x7fffe55e0278, flags=0, numblks=<optimized out>, blkno=0, target=<optimized out>)
|
|
||||||
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=<optimized out>) 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=<optimized out>, flags=<optimized out>, bpp=0x7fffe55e0538) at rdwr.c:457
|
|
||||||
#18 __libxfs_buf_get_map (btp=<optimized out>, map=map@entry=0x7fffe55e05b0, nmaps=<optimized out>, flags=flags@entry=1, bpp=bpp@entry=0x7fffe55e0538) at rdwr.c:501
|
|
||||||
#19 libxfs_buf_get_map (btp=<optimized out>, map=map@entry=0x7fffe55e05b0, nmaps=<optimized out>, 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=<optimized out>, flag=flag@entry=11) at prefetch.c:124
|
|
||||||
#21 pf_read_bmbt_reclist (args=0x5555556722c0, rp=<optimized out>, 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 <pf_scanfunc_bmap>) at prefetch.c:298
|
|
||||||
#23 pf_read_btinode (isadir=1, dino=<optimized out>, 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=<optimized out>, 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=<optimized out>) 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 <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>
|
|
||||||
---
|
|
||||||
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
|
|
||||||
|
|
@ -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-----
|
|
@ -0,0 +1,7 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iIQEABYIAC0WIQT6QG4gav94c4l8aGS0VhjDaiT9IwUCZGs+kg8cY2VtQGtlcm5l
|
||||||
|
bC5vcmcACgkQtFYYw2ok/SO6wgEAgMdBBcJsx/oEPKLXGZr+ueGZ81K7hGq8ueFF
|
||||||
|
sXp69AEA+PiK4Bh/angpo2lhftgZhGaOHxmj8vIyH2jJSw53LgE=
|
||||||
|
=+kzW
|
||||||
|
-----END PGP SIGNATURE-----
|
@ -0,0 +1,178 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,56 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,41 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
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
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
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,7 +1,7 @@
|
|||||||
--- a/mkfs/xfs_mkfs.c.orig 2022-08-12 20:38:21.000000000 +0200
|
--- 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
|
+++ b/mkfs/xfs_mkfs.c 2023-01-25 11:06:01.863076713 +0100
|
||||||
@@ -13,6 +13,8 @@
|
@@ -13,6 +13,8 @@
|
||||||
#include "libfrog/crc32cselftest.h"
|
#include "libfrog/dahashselftest.h"
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
#include <ini.h>
|
#include <ini.h>
|
||||||
+#include <linux/version.h>
|
+#include <linux/version.h>
|
@ -0,0 +1,91 @@
|
|||||||
|
From ea73527ddb9c9525e696efe0b0dc5f5c8326ec4a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pavel Reichl <preichl@redhat.com>
|
||||||
|
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 <preichl@redhat.com>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
Loading…
Reference in new issue