From e6918187568dbd01842d8d1d2c808ce16a894239 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:54:28 +0200 Subject: Adding upstream version 18.2.2. Signed-off-by: Daniel Baumann --- qa/btrfs/.gitignore | 3 ++ qa/btrfs/Makefile | 11 ++++++ qa/btrfs/clone_range.c | 35 +++++++++++++++++ qa/btrfs/create_async_snap.c | 34 ++++++++++++++++ qa/btrfs/test_async_snap.c | 83 ++++++++++++++++++++++++++++++++++++++++ qa/btrfs/test_rmdir_async_snap.c | 62 ++++++++++++++++++++++++++++++ 6 files changed, 228 insertions(+) create mode 100644 qa/btrfs/.gitignore create mode 100644 qa/btrfs/Makefile create mode 100644 qa/btrfs/clone_range.c create mode 100644 qa/btrfs/create_async_snap.c create mode 100644 qa/btrfs/test_async_snap.c create mode 100644 qa/btrfs/test_rmdir_async_snap.c (limited to 'qa/btrfs') diff --git a/qa/btrfs/.gitignore b/qa/btrfs/.gitignore new file mode 100644 index 000000000..530c1b5b4 --- /dev/null +++ b/qa/btrfs/.gitignore @@ -0,0 +1,3 @@ +/clone_range +/test_async_snap +/create_async_snap diff --git a/qa/btrfs/Makefile b/qa/btrfs/Makefile new file mode 100644 index 000000000..be95ecfd3 --- /dev/null +++ b/qa/btrfs/Makefile @@ -0,0 +1,11 @@ +CFLAGS = -Wall -Wextra -D_GNU_SOURCE + +TARGETS = clone_range test_async_snap create_async_snap + +.c: + $(CC) $(CFLAGS) $@.c -o $@ + +all: $(TARGETS) + +clean: + rm $(TARGETS) diff --git a/qa/btrfs/clone_range.c b/qa/btrfs/clone_range.c new file mode 100644 index 000000000..0a88e1601 --- /dev/null +++ b/qa/btrfs/clone_range.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +#include +#include "../../src/os/btrfs_ioctl.h" +#include +#include + +int main(int argc, char **argv) +{ + struct btrfs_ioctl_clone_range_args ca; + int dfd; + int r; + + if (argc < 6) { + printf("usage: %s \n", argv[0]); + exit(1); + } + + ca.src_fd = open(argv[1], O_RDONLY); + ca.src_offset = atoi(argv[2]); + ca.src_length = atoi(argv[3]); + dfd = open(argv[4], O_WRONLY|O_CREAT); + ca.dest_offset = atoi(argv[5]); + + r = ioctl(dfd, BTRFS_IOC_CLONE_RANGE, &ca); + printf("clone_range %s %lld %lld~%lld to %s %d %lld = %d %s\n", + argv[1], ca.src_fd, + ca.src_offset, ca.src_length, + argv[4], dfd, + ca.dest_offset, r, strerror(errno)); + return r; +} diff --git a/qa/btrfs/create_async_snap.c b/qa/btrfs/create_async_snap.c new file mode 100644 index 000000000..2ef22af7b --- /dev/null +++ b/qa/btrfs/create_async_snap.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../../src/os/btrfs_ioctl.h" + +struct btrfs_ioctl_vol_args_v2 va; + +int main(int argc, char **argv) +{ + int fd; + int r; + + if (argc != 3) { + printf("usage: %s \n", argv[0]); + return 1; + } + printf("creating snap ./%s from %s\n", argv[2], argv[1]); + fd = open(".", O_RDONLY); + va.fd = open(argv[1], O_RDONLY); + va.flags = BTRFS_SUBVOL_CREATE_ASYNC; + strcpy(va.name, argv[2]); + r = ioctl(fd, BTRFS_IOC_SNAP_CREATE_V2, (unsigned long long)&va); + printf("result %d\n", r ? -errno:0); + return r; +} diff --git a/qa/btrfs/test_async_snap.c b/qa/btrfs/test_async_snap.c new file mode 100644 index 000000000..211be95a6 --- /dev/null +++ b/qa/btrfs/test_async_snap.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../../src/os/btrfs_ioctl.h" + +struct btrfs_ioctl_vol_args_v2 va; +struct btrfs_ioctl_vol_args vold; +int max = 4; + +void check_return(int r) +{ + if (r < 0) { + printf("********* failed with %d %s ********\n", errno, strerror(errno)); + exit(1); + } +} + +int main(int argc, char **argv) +{ + int num = 1000; + + if (argc > 1) + num = atoi(argv[1]); + printf("will do %d iterations\n", num); + + int cwd = open(".", O_RDONLY); + printf("cwd = %d\n", cwd); + while (num-- > 0) { + if (rand() % 10 == 0) { + __u64 transid; + int r; + printf("sync starting\n"); + r = ioctl(cwd, BTRFS_IOC_START_SYNC, &transid); + check_return(r); + printf("sync started, transid %lld, waiting\n", transid); + r = ioctl(cwd, BTRFS_IOC_WAIT_SYNC, &transid); + check_return(r); + printf("sync finished\n"); + } + + int i = rand() % max; + struct stat st; + va.fd = cwd; + sprintf(va.name, "test.%d", i); + va.transid = 0; + int r = stat(va.name, &st); + if (r < 0) { + if (rand() % 3 == 0) { + printf("snap create (sync) %s\n", va.name); + va.flags = 0; + r = ioctl(cwd, BTRFS_IOC_SNAP_CREATE_V2, &va); + check_return(r); + } else { + printf("snap create (async) %s\n", va.name); + va.flags = BTRFS_SUBVOL_CREATE_ASYNC; + r = ioctl(cwd, BTRFS_IOC_SNAP_CREATE_V2, &va); + check_return(r); + printf("snap created, transid %lld\n", va.transid); + if (rand() % 2 == 0) { + printf("waiting for async snap create\n"); + r = ioctl(cwd, BTRFS_IOC_WAIT_SYNC, &va.transid); + check_return(r); + } + } + } else { + printf("snap remove %s\n", va.name); + vold.fd = va.fd; + strcpy(vold.name, va.name); + r = ioctl(cwd, BTRFS_IOC_SNAP_DESTROY, &vold); + check_return(r); + } + } + return 0; +} diff --git a/qa/btrfs/test_rmdir_async_snap.c b/qa/btrfs/test_rmdir_async_snap.c new file mode 100644 index 000000000..5dafaacaa --- /dev/null +++ b/qa/btrfs/test_rmdir_async_snap.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "../../src/os/btrfs_ioctl.h" + +struct btrfs_ioctl_vol_args_v2 va; +struct btrfs_ioctl_vol_args vold; + +int main(int argc, char **argv) +{ + int num = 1000; + int i, r, fd; + char buf[30]; + + if (argc > 1) + num = atoi(argv[1]); + printf("will do %d iterations\n", num); + + fd = open(".", O_RDONLY); + vold.fd = 0; + strcpy(vold.name, "current"); + r = ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, (unsigned long int)&vold); + printf("create current ioctl got %d\n", r ? errno:0); + if (r) + return 1; + + for (i=0; i