Skip to content

Commit 798352c

Browse files
dchinnerdgchinner
authored andcommitted
Merge tag 'fix-asciici-bugs-6.4_2023-04-11' of git://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux into guilt/xfs-for-next
xfs: fix ascii-ci problems, then kill it [v2] Last week, I was fiddling around with the metadump name obfuscation code while writing a debugger command to generate directories full of names that all have the same hash name. I had a few questions about how well all that worked with ascii-ci mode, and discovered a nasty discrepancy between the kernel and glibc's implementations of the tolower() function. I discovered that I could create a directory that is large enough to require separate leaf index blocks. The hashes stored in the dabtree use the ascii-ci specific hash function, which uses a library function to convert the name to lowercase before hashing. If the kernel and C library's versions of tolower do not behave exactly identically, xfs_ascii_ci_hashname will not produce the same results for the same inputs. xfs_repair will deem the leaf information corrupt and rebuild the directory. After that, lookups in the kernel will fail because the hash index doesn't work. The kernel's tolower function will convert extended ascii uppercase letters (e.g. A-with-umlaut) to extended ascii lowercase letters (e.g. a-with-umlaut), whereas glibc's will only do that if you force LANG to ascii. Tiny embedded libc implementations just plain won't do it at all, and the result is a mess. Stabilize the behavior of the hash function by encoding the name transformation function in libxfs, add it to the selftest, and fix all the userspace tools, none of which handle this transformation correctly. The v1 series generated a /lot/ of discussion, in which several things became very clear: (1) Linus is not enamored of case folding of any kind; (2) Dave and Christoph don't seem to agree on whether the feature is supposed to work for 7-bit ascii or latin1; (3) it trashes UTF8 encoded names if those happen to show up; and (4) I don't want to maintain this mess any longer than I have to. Kill it in 2030. v2: rename the functions to make it clear we're moving away from the letters t, o, l, o, w, e, and r; and deprecate the whole feature once we've fixed the bugs and added tests. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Dave Chinner <david@fromorbit.com>
2 parents b89116c + 7ba8385 commit 798352c

6 files changed

Lines changed: 186 additions & 102 deletions

File tree

Documentation/admin-guide/xfs.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ Deprecated Mount Options
240240
Name Removal Schedule
241241
=========================== ================
242242
Mounting with V4 filesystem September 2030
243+
Mounting ascii-ci filesystem September 2030
243244
ikeep/noikeep September 2025
244245
attr2/noattr2 September 2025
245246
=========================== ================

fs/xfs/Kconfig

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,33 @@ config XFS_SUPPORT_V4
4747
To continue supporting the old V4 format (crc=0), say Y.
4848
To close off an attack surface, say N.
4949

50+
config XFS_SUPPORT_ASCII_CI
51+
bool "Support deprecated case-insensitive ascii (ascii-ci=1) format"
52+
depends on XFS_FS
53+
default y
54+
help
55+
The ASCII case insensitivity filesystem feature only works correctly
56+
on systems that have been coerced into using ISO 8859-1, and it does
57+
not work on extended attributes. The kernel has no visibility into
58+
the locale settings in userspace, so it corrupts UTF-8 names.
59+
Enabling this feature makes XFS vulnerable to mixed case sensitivity
60+
attacks. Because of this, the feature is deprecated. All users
61+
should upgrade by backing up their files, reformatting, and restoring
62+
from the backup.
63+
64+
Administrators and users can detect such a filesystem by running
65+
xfs_info against a filesystem mountpoint and checking for a string
66+
beginning with "ascii-ci=". If the string "ascii-ci=1" is found, the
67+
filesystem is a case-insensitive filesystem. If no such string is
68+
found, please upgrade xfsprogs to the latest version and try again.
69+
70+
This option will become default N in September 2025. Support for the
71+
feature will be removed entirely in September 2030. Distributors
72+
can say N here to withdraw support earlier.
73+
74+
To continue supporting case-insensitivity (ascii-ci=1), say Y.
75+
To close off an attack surface, say N.
76+
5077
config XFS_QUOTA
5178
bool "XFS Quota support"
5279
depends on XFS_FS

fs/xfs/libxfs/xfs_dir2.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ xfs_ascii_ci_hashname(
6464
int i;
6565

6666
for (i = 0, hash = 0; i < name->len; i++)
67-
hash = tolower(name->name[i]) ^ rol32(hash, 7);
67+
hash = xfs_ascii_ci_xfrm(name->name[i]) ^ rol32(hash, 7);
6868

6969
return hash;
7070
}
@@ -85,7 +85,8 @@ xfs_ascii_ci_compname(
8585
for (i = 0; i < len; i++) {
8686
if (args->name[i] == name[i])
8787
continue;
88-
if (tolower(args->name[i]) != tolower(name[i]))
88+
if (xfs_ascii_ci_xfrm(args->name[i]) !=
89+
xfs_ascii_ci_xfrm(name[i]))
8990
return XFS_CMP_DIFFERENT;
9091
result = XFS_CMP_CASE;
9192
}

fs/xfs/libxfs/xfs_dir2.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,35 @@ unsigned int xfs_dir3_data_end_offset(struct xfs_da_geometry *geo,
248248
struct xfs_dir2_data_hdr *hdr);
249249
bool xfs_dir2_namecheck(const void *name, size_t length);
250250

251+
/*
252+
* The "ascii-ci" feature was created to speed up case-insensitive lookups for
253+
* a Samba product. Because of the inherent problems with CI and UTF-8
254+
* encoding, etc, it was decided that Samba would be configured to export
255+
* latin1/iso 8859-1 encodings as that covered >90% of the target markets for
256+
* the product. Hence the "ascii-ci" casefolding code could be encoded into
257+
* the XFS directory operations and remove all the overhead of casefolding from
258+
* Samba.
259+
*
260+
* To provide consistent hashing behavior between the userspace and kernel,
261+
* these functions prepare names for hashing by transforming specific bytes
262+
* to other bytes. Robustness with other encodings is not guaranteed.
263+
*/
264+
static inline bool xfs_ascii_ci_need_xfrm(unsigned char c)
265+
{
266+
if (c >= 0x41 && c <= 0x5a) /* A-Z */
267+
return true;
268+
if (c >= 0xc0 && c <= 0xd6) /* latin A-O with accents */
269+
return true;
270+
if (c >= 0xd8 && c <= 0xde) /* latin O-Y with accents */
271+
return true;
272+
return false;
273+
}
274+
275+
static inline unsigned char xfs_ascii_ci_xfrm(unsigned char c)
276+
{
277+
if (xfs_ascii_ci_need_xfrm(c))
278+
c -= 'A' - 'a';
279+
return c;
280+
}
281+
251282
#endif /* __XFS_DIR2_H__ */

fs/xfs/xfs_dahash_test.c

Lines changed: 111 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
#include "xfs_format.h"
1010
#include "xfs_da_format.h"
1111
#include "xfs_da_btree.h"
12+
#include "xfs_trans_resv.h"
13+
#include "xfs_mount.h"
14+
#include "xfs_dir2_priv.h"
1215
#include "xfs_dahash_test.h"
1316

1417
/* 4096 random bytes */
@@ -533,108 +536,109 @@ static struct dahash_test {
533536
uint16_t start; /* random 12 bit offset in buf */
534537
uint16_t length; /* random 8 bit length of test */
535538
xfs_dahash_t dahash; /* expected dahash result */
539+
xfs_dahash_t ascii_ci_dahash; /* expected ascii-ci dahash result */
536540
} test[] __initdata =
537541
{
538-
{0x0567, 0x0097, 0x96951389},
539-
{0x0869, 0x0055, 0x6455ab4f},
540-
{0x0c51, 0x00be, 0x8663afde},
541-
{0x044a, 0x00fc, 0x98fbe432},
542-
{0x0f29, 0x0079, 0x42371997},
543-
{0x08ba, 0x0052, 0x942be4f7},
544-
{0x01f2, 0x0013, 0x5262687e},
545-
{0x09e3, 0x00e2, 0x8ffb0908},
546-
{0x007c, 0x0051, 0xb3158491},
547-
{0x0854, 0x001f, 0x83bb20d9},
548-
{0x031b, 0x0008, 0x98970bdf},
549-
{0x0de7, 0x0027, 0xbfbf6f6c},
550-
{0x0f76, 0x0005, 0x906a7105},
551-
{0x092e, 0x00d0, 0x86631850},
552-
{0x0233, 0x0082, 0xdbdd914e},
553-
{0x04c9, 0x0075, 0x5a400a9e},
554-
{0x0b66, 0x0099, 0xae128b45},
555-
{0x000d, 0x00ed, 0xe61c216a},
556-
{0x0a31, 0x003d, 0xf69663b9},
557-
{0x00a3, 0x0052, 0x643c39ae},
558-
{0x0125, 0x00d5, 0x7c310b0d},
559-
{0x0105, 0x004a, 0x06a77e74},
560-
{0x0858, 0x008e, 0x265bc739},
561-
{0x045e, 0x0095, 0x13d6b192},
562-
{0x0dab, 0x003c, 0xc4498704},
563-
{0x00cd, 0x00b5, 0x802a4e2d},
564-
{0x069b, 0x008c, 0x5df60f71},
565-
{0x0454, 0x006c, 0x5f03d8bb},
566-
{0x040e, 0x0032, 0x0ce513b5},
567-
{0x0874, 0x00e2, 0x6a811fb3},
568-
{0x0521, 0x00b4, 0x93296833},
569-
{0x0ddc, 0x00cf, 0xf9305338},
570-
{0x0a70, 0x0023, 0x239549ea},
571-
{0x083e, 0x0027, 0x2d88ba97},
572-
{0x0241, 0x00a7, 0xfe0b32e1},
573-
{0x0dfc, 0x0096, 0x1a11e815},
574-
{0x023e, 0x001e, 0xebc9a1f3},
575-
{0x067e, 0x0066, 0xb1067f81},
576-
{0x09ea, 0x000e, 0x46fd7247},
577-
{0x036b, 0x008c, 0x1a39acdf},
578-
{0x078f, 0x0030, 0x964042ab},
579-
{0x085c, 0x008f, 0x1829edab},
580-
{0x02ec, 0x009f, 0x6aefa72d},
581-
{0x043b, 0x00ce, 0x65642ff5},
582-
{0x0a32, 0x00b8, 0xbd82759e},
583-
{0x0d3c, 0x0087, 0xf4d66d54},
584-
{0x09ec, 0x008a, 0x06bfa1ff},
585-
{0x0902, 0x0015, 0x755025d2},
586-
{0x08fe, 0x000e, 0xf690ce2d},
587-
{0x00fb, 0x00dc, 0xe55f1528},
588-
{0x0eaa, 0x003a, 0x0fe0a8d7},
589-
{0x05fb, 0x0006, 0x86281cfb},
590-
{0x0dd1, 0x00a7, 0x60ab51b4},
591-
{0x0005, 0x001b, 0xf51d969b},
592-
{0x077c, 0x00dd, 0xc2fed268},
593-
{0x0575, 0x00f5, 0x432c0b1a},
594-
{0x05be, 0x0088, 0x78baa04b},
595-
{0x0c89, 0x0068, 0xeda9e428},
596-
{0x0f5c, 0x0068, 0xec143c76},
597-
{0x06a8, 0x0009, 0xd72651ce},
598-
{0x060f, 0x008e, 0x765426cd},
599-
{0x07b1, 0x0047, 0x2cfcfa0c},
600-
{0x04f1, 0x0041, 0x55b172f9},
601-
{0x0e05, 0x00ac, 0x61efde93},
602-
{0x0bf7, 0x0097, 0x05b83eee},
603-
{0x04e9, 0x00f3, 0x9928223a},
604-
{0x023a, 0x0005, 0xdfada9bc},
605-
{0x0acb, 0x000e, 0x2217cecd},
606-
{0x0148, 0x0060, 0xbc3f7405},
607-
{0x0764, 0x0059, 0xcbc201b1},
608-
{0x021f, 0x0059, 0x5d6b2256},
609-
{0x0f1e, 0x006c, 0xdefeeb45},
610-
{0x071c, 0x00b9, 0xb9b59309},
611-
{0x0564, 0x0063, 0xae064271},
612-
{0x0b14, 0x0044, 0xdb867d9b},
613-
{0x0e5a, 0x0055, 0xff06b685},
614-
{0x015e, 0x00ba, 0x1115ccbc},
615-
{0x0379, 0x00e6, 0x5f4e58dd},
616-
{0x013b, 0x0067, 0x4897427e},
617-
{0x0e64, 0x0071, 0x7af2b7a4},
618-
{0x0a11, 0x0050, 0x92105726},
619-
{0x0109, 0x0055, 0xd0d000f9},
620-
{0x00aa, 0x0022, 0x815d229d},
621-
{0x09ac, 0x004f, 0x02f9d985},
622-
{0x0e1b, 0x00ce, 0x5cf92ab4},
623-
{0x08af, 0x00d8, 0x17ca72d1},
624-
{0x0e33, 0x000a, 0xda2dba6b},
625-
{0x0ee3, 0x006a, 0xb00048e5},
626-
{0x0648, 0x001a, 0x2364b8cb},
627-
{0x0315, 0x0085, 0x0596fd0d},
628-
{0x0fbb, 0x003e, 0x298230ca},
629-
{0x0422, 0x006a, 0x78ada4ab},
630-
{0x04ba, 0x0073, 0xced1fbc2},
631-
{0x007d, 0x0061, 0x4b7ff236},
632-
{0x070b, 0x00d0, 0x261cf0ae},
633-
{0x0c1a, 0x0035, 0x8be92ee2},
634-
{0x0af8, 0x0063, 0x824dcf03},
635-
{0x08f8, 0x006d, 0xd289710c},
636-
{0x021b, 0x00ee, 0x6ac1c41d},
637-
{0x05b5, 0x00da, 0x8e52f0e2},
542+
{0x0567, 0x0097, 0x96951389, 0xc153aa0d},
543+
{0x0869, 0x0055, 0x6455ab4f, 0xd07f69bf},
544+
{0x0c51, 0x00be, 0x8663afde, 0xf9add90c},
545+
{0x044a, 0x00fc, 0x98fbe432, 0xbf2abb76},
546+
{0x0f29, 0x0079, 0x42371997, 0x282588b3},
547+
{0x08ba, 0x0052, 0x942be4f7, 0x2e023547},
548+
{0x01f2, 0x0013, 0x5262687e, 0x5266287e},
549+
{0x09e3, 0x00e2, 0x8ffb0908, 0x1da892f3},
550+
{0x007c, 0x0051, 0xb3158491, 0xb67f9e63},
551+
{0x0854, 0x001f, 0x83bb20d9, 0x22bb21db},
552+
{0x031b, 0x0008, 0x98970bdf, 0x9cd70adf},
553+
{0x0de7, 0x0027, 0xbfbf6f6c, 0xae3f296c},
554+
{0x0f76, 0x0005, 0x906a7105, 0x906a7105},
555+
{0x092e, 0x00d0, 0x86631850, 0xa3f6ac04},
556+
{0x0233, 0x0082, 0xdbdd914e, 0x5d8c7aac},
557+
{0x04c9, 0x0075, 0x5a400a9e, 0x12f60711},
558+
{0x0b66, 0x0099, 0xae128b45, 0x7551310d},
559+
{0x000d, 0x00ed, 0xe61c216a, 0xc22d3c4c},
560+
{0x0a31, 0x003d, 0xf69663b9, 0x51960bf8},
561+
{0x00a3, 0x0052, 0x643c39ae, 0xa93c73a8},
562+
{0x0125, 0x00d5, 0x7c310b0d, 0xf221cbb3},
563+
{0x0105, 0x004a, 0x06a77e74, 0xa4ef4561},
564+
{0x0858, 0x008e, 0x265bc739, 0xd6c36d9b},
565+
{0x045e, 0x0095, 0x13d6b192, 0x5f5c1d62},
566+
{0x0dab, 0x003c, 0xc4498704, 0x10414654},
567+
{0x00cd, 0x00b5, 0x802a4e2d, 0xfbd17c9d},
568+
{0x069b, 0x008c, 0x5df60f71, 0x91ddca5f},
569+
{0x0454, 0x006c, 0x5f03d8bb, 0x5c59fce0},
570+
{0x040e, 0x0032, 0x0ce513b5, 0xa8cd99b1},
571+
{0x0874, 0x00e2, 0x6a811fb3, 0xca028316},
572+
{0x0521, 0x00b4, 0x93296833, 0x2c4d4880},
573+
{0x0ddc, 0x00cf, 0xf9305338, 0x2c94210d},
574+
{0x0a70, 0x0023, 0x239549ea, 0x22b561aa},
575+
{0x083e, 0x0027, 0x2d88ba97, 0x5cd8bb9d},
576+
{0x0241, 0x00a7, 0xfe0b32e1, 0x17b506b8},
577+
{0x0dfc, 0x0096, 0x1a11e815, 0xee4141bd},
578+
{0x023e, 0x001e, 0xebc9a1f3, 0x5689a1f3},
579+
{0x067e, 0x0066, 0xb1067f81, 0xd9952571},
580+
{0x09ea, 0x000e, 0x46fd7247, 0x42b57245},
581+
{0x036b, 0x008c, 0x1a39acdf, 0x58bf1586},
582+
{0x078f, 0x0030, 0x964042ab, 0xb04218b9},
583+
{0x085c, 0x008f, 0x1829edab, 0x9ceca89c},
584+
{0x02ec, 0x009f, 0x6aefa72d, 0x634cc2a7},
585+
{0x043b, 0x00ce, 0x65642ff5, 0x6c8a584e},
586+
{0x0a32, 0x00b8, 0xbd82759e, 0x0f96a34f},
587+
{0x0d3c, 0x0087, 0xf4d66d54, 0xb71ba5f4},
588+
{0x09ec, 0x008a, 0x06bfa1ff, 0x576ca80f},
589+
{0x0902, 0x0015, 0x755025d2, 0x517225c2},
590+
{0x08fe, 0x000e, 0xf690ce2d, 0xf690cf3d},
591+
{0x00fb, 0x00dc, 0xe55f1528, 0x707d7d92},
592+
{0x0eaa, 0x003a, 0x0fe0a8d7, 0x87638cc5},
593+
{0x05fb, 0x0006, 0x86281cfb, 0x86281cf9},
594+
{0x0dd1, 0x00a7, 0x60ab51b4, 0xe28ef00c},
595+
{0x0005, 0x001b, 0xf51d969b, 0xe71dd6d3},
596+
{0x077c, 0x00dd, 0xc2fed268, 0xdc30c555},
597+
{0x0575, 0x00f5, 0x432c0b1a, 0x81dd7d16},
598+
{0x05be, 0x0088, 0x78baa04b, 0xd69b433e},
599+
{0x0c89, 0x0068, 0xeda9e428, 0xe9b4fa0a},
600+
{0x0f5c, 0x0068, 0xec143c76, 0x9947067a},
601+
{0x06a8, 0x0009, 0xd72651ce, 0xd72651ee},
602+
{0x060f, 0x008e, 0x765426cd, 0x2099626f},
603+
{0x07b1, 0x0047, 0x2cfcfa0c, 0x1a4baa07},
604+
{0x04f1, 0x0041, 0x55b172f9, 0x15331a79},
605+
{0x0e05, 0x00ac, 0x61efde93, 0x320568cc},
606+
{0x0bf7, 0x0097, 0x05b83eee, 0xc72fb7a3},
607+
{0x04e9, 0x00f3, 0x9928223a, 0xe8c77de2},
608+
{0x023a, 0x0005, 0xdfada9bc, 0xdfadb9be},
609+
{0x0acb, 0x000e, 0x2217cecd, 0x0017d6cd},
610+
{0x0148, 0x0060, 0xbc3f7405, 0xf5fd6615},
611+
{0x0764, 0x0059, 0xcbc201b1, 0xbb089bf4},
612+
{0x021f, 0x0059, 0x5d6b2256, 0xa16a0a59},
613+
{0x0f1e, 0x006c, 0xdefeeb45, 0xfc34f9d6},
614+
{0x071c, 0x00b9, 0xb9b59309, 0xb645eae2},
615+
{0x0564, 0x0063, 0xae064271, 0x954dc6d1},
616+
{0x0b14, 0x0044, 0xdb867d9b, 0xdf432309},
617+
{0x0e5a, 0x0055, 0xff06b685, 0xa65ff257},
618+
{0x015e, 0x00ba, 0x1115ccbc, 0x11c365f4},
619+
{0x0379, 0x00e6, 0x5f4e58dd, 0x2d176d31},
620+
{0x013b, 0x0067, 0x4897427e, 0xc40532fe},
621+
{0x0e64, 0x0071, 0x7af2b7a4, 0x1fb7bf43},
622+
{0x0a11, 0x0050, 0x92105726, 0xb1185e51},
623+
{0x0109, 0x0055, 0xd0d000f9, 0x60a60bfd},
624+
{0x00aa, 0x0022, 0x815d229d, 0x215d379c},
625+
{0x09ac, 0x004f, 0x02f9d985, 0x10b90b20},
626+
{0x0e1b, 0x00ce, 0x5cf92ab4, 0x6a477573},
627+
{0x08af, 0x00d8, 0x17ca72d1, 0x385af156},
628+
{0x0e33, 0x000a, 0xda2dba6b, 0xda2dbb69},
629+
{0x0ee3, 0x006a, 0xb00048e5, 0xa9a2decc},
630+
{0x0648, 0x001a, 0x2364b8cb, 0x3364b1cb},
631+
{0x0315, 0x0085, 0x0596fd0d, 0xa651740f},
632+
{0x0fbb, 0x003e, 0x298230ca, 0x7fc617c7},
633+
{0x0422, 0x006a, 0x78ada4ab, 0xc576ae2a},
634+
{0x04ba, 0x0073, 0xced1fbc2, 0xaac8455b},
635+
{0x007d, 0x0061, 0x4b7ff236, 0x347d5739},
636+
{0x070b, 0x00d0, 0x261cf0ae, 0xc7fb1c10},
637+
{0x0c1a, 0x0035, 0x8be92ee2, 0x8be9b4e1},
638+
{0x0af8, 0x0063, 0x824dcf03, 0x53010388},
639+
{0x08f8, 0x006d, 0xd289710c, 0x30418edd},
640+
{0x021b, 0x00ee, 0x6ac1c41d, 0x2557e9a3},
641+
{0x05b5, 0x00da, 0x8e52f0e2, 0x98531012},
638642
};
639643

640644
int __init
@@ -644,12 +648,19 @@ xfs_dahash_test(void)
644648
unsigned int errors = 0;
645649

646650
for (i = 0; i < ARRAY_SIZE(test); i++) {
651+
struct xfs_name xname = { };
647652
xfs_dahash_t hash;
648653

649654
hash = xfs_da_hashname(test_buf + test[i].start,
650655
test[i].length);
651656
if (hash != test[i].dahash)
652657
errors++;
658+
659+
xname.name = test_buf + test[i].start;
660+
xname.len = test[i].length;
661+
hash = xfs_ascii_ci_hashname(&xname);
662+
if (hash != test[i].ascii_ci_dahash)
663+
errors++;
653664
}
654665

655666
if (errors) {

fs/xfs/xfs_super.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,6 +1548,19 @@ xfs_fs_fill_super(
15481548
#endif
15491549
}
15501550

1551+
/* ASCII case insensitivity is undergoing deprecation. */
1552+
if (xfs_has_asciici(mp)) {
1553+
#ifdef CONFIG_XFS_SUPPORT_ASCII_CI
1554+
xfs_warn_once(mp,
1555+
"Deprecated ASCII case-insensitivity feature (ascii-ci=1) will not be supported after September 2030.");
1556+
#else
1557+
xfs_warn(mp,
1558+
"Deprecated ASCII case-insensitivity feature (ascii-ci=1) not supported by kernel.");
1559+
error = -EINVAL;
1560+
goto out_free_sb;
1561+
#endif
1562+
}
1563+
15511564
/* Filesystem claims it needs repair, so refuse the mount. */
15521565
if (xfs_has_needsrepair(mp)) {
15531566
xfs_warn(mp, "Filesystem needs repair. Please run xfs_repair.");

0 commit comments

Comments
 (0)