On 6/9/22 6:53 PM, Luís Henriques wrote:
CephFS doesn't have a maximum xattr size. Instead, it imposes a maximum
size for the full set of xattrs names+values, which by default is 64K.
And since ceph reports 4M as the blocksize (the default ceph object size),
generic/486 will fail in this filesystem because it will end up using
XATTR_SIZE_MAX to set the size of the 2nd (big) xattr value.
The fix is to adjust the max size in attr_replace_test so that it takes
into account the initial xattr name and value lengths.
Signed-off-by: Luís Henriques <lhenriques@xxxxxxx>
---
src/attr_replace_test.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c
index cca8dcf8ff60..1c8d1049a1d8 100644
--- a/src/attr_replace_test.c
+++ b/src/attr_replace_test.c
@@ -29,6 +29,11 @@ int main(int argc, char *argv[])
char *value;
struct stat sbuf;
size_t size = sizeof(value);
+ /*
+ * Take into account the initial (small) xattr name and value sizes and
+ * subtract them from the XATTR_SIZE_MAX maximum.
+ */
+ size_t maxsize = XATTR_SIZE_MAX - strlen(name) - 1;
Why not use the statfs to get the filesystem type first ? And then just
minus the strlen(name) for ceph only ?
if (argc != 2)
fail("Usage: %s <file>\n", argv[0]);
@@ -46,7 +51,7 @@ int main(int argc, char *argv[])
size = sbuf.st_blksize * 3 / 4;
if (!size)
fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize);
- size = MIN(size, XATTR_SIZE_MAX);
+ size = MIN(size, maxsize);
value = malloc(size);
if (!value)
fail("Failed to allocate memory\n");