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 it reports 4M as the blocksize (the default ceph object size), generic/486 will fail in ceph because the XATTR_SIZE_MAX value can't be used in attr_replace_test. The fix is to add a new argument to the test so that the max size can be passed in instead of trying to auto-probe a value for it. Signed-off-by: Luís Henriques <lhenriques@xxxxxxx> --- src/attr_replace_test.c | 30 ++++++++++++++++++++++++++---- tests/generic/486 | 11 ++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c index cca8dcf8ff60..1218e7264c8f 100644 --- a/src/attr_replace_test.c +++ b/src/attr_replace_test.c @@ -20,19 +20,41 @@ exit(1); } while (0) fprintf(stderr, __VA_ARGS__); exit (1); \ } while (0) +void usage(char *progname) +{ + fail("usage: %s [-m max_attr_size] <file>\n", progname); +} + int main(int argc, char *argv[]) { int ret; int fd; + int c; char *path; char *name = "user.world"; char *value; struct stat sbuf; size_t size = sizeof(value); + size_t maxsize = XATTR_SIZE_MAX; + + while ((c = getopt(argc, argv, "m:")) != -1) { + char *endp; + + switch (c) { + case 'm': + maxsize = strtoul(optarg, &endp, 0); + if (*endp || (maxsize > XATTR_SIZE_MAX)) + fail("Invalid 'max_attr_size' value\n"); + break; + default: + usage(argv[0]); + } + } - if (argc != 2) - fail("Usage: %s <file>\n", argv[0]); - path = argv[1]; + if (optind == argc - 1) + path = argv[optind]; + else + usage(argv[0]); fd = open(path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd < 0) die(); @@ -46,7 +68,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"); diff --git a/tests/generic/486 b/tests/generic/486 index 7de198f93a71..7dbfcb9835d9 100755 --- a/tests/generic/486 +++ b/tests/generic/486 @@ -41,7 +41,16 @@ filter_attr_output() { sed -e 's/has a [0-9]* byte value/has a NNNN byte value/g' } -$here/src/attr_replace_test $SCRATCH_MNT/hello +max_attr_size=65536 + +# attr_replace_test can't easily auto-probe the attr size for ceph because: +# - ceph imposes a maximum value for the total xattr names+values, and +# - ceph reports the 'object size' in the block size, which is, by default, much +# larger than XATTR_SIZE_MAX (4M > 64k) +# Hence, we need to provide it with a maximum size. +[ "$FSTYP" = "ceph" ] && max_attr_size=65000 + +$here/src/attr_replace_test -m $max_attr_size $SCRATCH_MNT/hello $ATTR_PROG -l $SCRATCH_MNT/hello >>$seqres.full 2>&1 $ATTR_PROG -l $SCRATCH_MNT/hello | filter_attr_output