On 11.11.24 15:56, Mark Harmstone wrote: > Add btrfs/333 and its helper programs btrfs_encoded_read and > btrfs_encoded_write, in order to test encoded reads. > > We use the BTRFS_IOC_ENCODED_WRITE ioctl to write random data into a > compressed extent, then use the BTRFS_IOC_ENCODED_READ ioctl to check > that it matches what we've written. If the new io_uring interface for > encoded reads is supported, we also check that that matches the ioctl. > > Note that what we write isn't valid compressed data, so any non-encoded > reads on these files will fail. > > Signed-off-by: Mark Harmstone <maharmstone@xxxxxx> > --- > .gitignore | 2 + > src/Makefile | 3 +- > src/btrfs_encoded_read.c | 175 ++++++++++++++++++++++++++++++ > src/btrfs_encoded_write.c | 206 +++++++++++++++++++++++++++++++++++ > tests/btrfs/333 | 220 ++++++++++++++++++++++++++++++++++++++ > tests/btrfs/333.out | 2 + > 6 files changed, 607 insertions(+), 1 deletion(-) > create mode 100644 src/btrfs_encoded_read.c > create mode 100644 src/btrfs_encoded_write.c > create mode 100755 tests/btrfs/333 > create mode 100644 tests/btrfs/333.out > > diff --git a/.gitignore b/.gitignore > index f16173d9..efd47773 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -62,6 +62,8 @@ tags > /src/attr_replace_test > /src/attr-list-by-handle-cursor-test > /src/bstat > +/src/btrfs_encoded_read > +/src/btrfs_encoded_write > /src/bulkstat_null_ocount > /src/bulkstat_unlink_test > /src/bulkstat_unlink_test_modified > diff --git a/src/Makefile b/src/Makefile > index a0396332..b42b8147 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -34,7 +34,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > attr_replace_test swapon mkswap t_attr_corruption t_open_tmpfiles \ > fscrypt-crypt-util bulkstat_null_ocount splice-test chprojid_fail \ > detached_mounts_propagation ext4_resize t_readdir_3 splice2pipe \ > - uuid_ioctl t_snapshot_deleted_subvolume fiemap-fault min_dio_alignment > + uuid_ioctl t_snapshot_deleted_subvolume fiemap-fault min_dio_alignment \ > + btrfs_encoded_read btrfs_encoded_write > > EXTRA_EXECS = dmerror fill2attr fill2fs fill2fs_check scaleread.sh \ > btrfs_crc32c_forged_name.py popdir.pl popattr.py \ > diff --git a/src/btrfs_encoded_read.c b/src/btrfs_encoded_read.c > new file mode 100644 > index 00000000..a5082f70 > --- /dev/null > +++ b/src/btrfs_encoded_read.c > @@ -0,0 +1,175 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// Copyright (c) Meta Platforms, Inc. and affiliates. > + > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <errno.h> > +#include <fcntl.h> > +#include <unistd.h> > +#include <sys/uio.h> > +#include <sys/ioctl.h> > +#include <linux/btrfs.h> For this I need +#include <linux/io_uring.h> otherwise I get: [CC] btrfs_encoded_read /bin/sh ../libtool --quiet --tag=CC --mode=link /usr/bin/gcc-13 btrfs_encoded_read.c -o btrfs_encoded_read -g -O2 -g -O2 -DDEBUG -I../include -DVERSION=\"1.1.1\" -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -funsigned-char -fno-strict-aliasing -Wall -DHAVE_FALLOCATE -DNEED_INTERNAL_XFS_IOC_EXCHANGE_RANGE -lhandle -lacl -lpthread -lrt -luuid -lgdbm_compat -lgdbm -laio -luring ../lib/libtest.la btrfs_encoded_read.c: In function 'encoded_read_io_uring': btrfs_encoded_read.c:100:26: error: 'IORING_OP_URING_CMD' undeclared (first use in this function); did you mean 'IORING_OP_LINKAT'? 100 | io_uring_prep_rw(IORING_OP_URING_CMD, sqe, fd, &enc, sizeof(enc), 0); | ^~~~~~~~~~~~~~~~~~~ | IORING_OP_LINKAT btrfs_encoded_read.c:100:26: note: each undeclared identifier is reported only once for each function it appears in btrfs_encoded_read.c:101:12: error: 'struct io_uring_sqe' has no member named 'cmd_op' 101 | sqe->cmd_op = BTRFS_IOC_ENCODED_READ; | ^~ during compilation. Not sure if a ./configure macro thingy should/would solve this.