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; 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");