1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h"
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef HAVE_LINUX_BTRFS_H
4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <errno.h>
6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <fcntl.h>
7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <inttypes.h>
8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <limits.h>
9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdbool.h>
10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdint.h>
11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdio.h>
12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdlib.h>
13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <string.h>
14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <unistd.h>
15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/ioctl.h>
16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/stat.h>
17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/vfs.h>
18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/fs.h>
19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/btrfs.h>
20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/magic.h>
21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat.h"
22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_balance_args.h"
24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_balance_flags.h"
25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_balance_state.h"
26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_compress_types.h"
27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_defrag_flags.h"
28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_dev_stats_values.h"
29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_dev_stats_flags.h"
30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_qgroup_inherit_flags.h"
31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_qgroup_limit_flags.h"
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_scrub_flags.h"
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_send_flags.h"
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_space_info_flags.h"
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_snap_flags_v2.h"
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_tree_objectids.h"
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_features_compat.h"
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_features_compat_ro.h"
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_features_incompat.h"
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/btrfs_key_types.h"
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef HAVE_LINUX_FIEMAP_H
43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <linux/fiemap.h>
44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include "xlat/fiemap_flags.h"
45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include "xlat/fiemap_extent_flags.h"
46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_LABEL_SIZE
49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define BTRFS_LABEL_SIZE 256
50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_NAME_LEN
53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define BTRFS_NAME_LEN 255
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Prior to Linux 3.12, the BTRFS_IOC_DEFAULT_SUBVOL used u64 in
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * its definition, which isn't exported by the kernel.
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughestypedef __u64 u64;
61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const char *btrfs_test_root;
63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic int btrfs_test_dir_fd;
64dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesstatic bool verbose;
65dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughesstatic bool write_ok;
66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesconst unsigned char uuid_reference[BTRFS_UUID_SIZE] = {
68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesconst char uuid_reference_string[] = "01234567-89ab-cdef-fedc-ba9876543210";
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_IOC_QUOTA_RESCAN
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct btrfs_ioctl_quota_rescan_args {
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t flags, progress, reserved[6];
77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
78dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_QUOTA_RESCAN			\
79dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOW(BTRFS_IOCTL_MAGIC, 44, struct btrfs_ioctl_quota_rescan_args)
80dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_QUOTA_RESCAN_STATUS		\
81dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOR(BTRFS_IOCTL_MAGIC, 45, struct btrfs_ioctl_quota_rescan_args)
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_IOC_QUOTA_RESCAN_WAIT
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define BTRFS_IOC_QUOTA_RESCAN_WAIT _IO(BTRFS_IOCTL_MAGIC, 46)
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_IOC_GET_FEATURES
89dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_GET_FEATURES			\
90dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOR(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags)
91dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_SET_FEATURES			\
92dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOW(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags[2])
93dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_GET_SUPPORTED_FEATURES	\
94dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOR(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags[3])
95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef HAVE_STRUCT_BTRFS_IOCTL_FEATURE_FLAGS_COMPAT_FLAGS
98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct btrfs_ioctl_feature_flags {
99dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t compat_flags;
100dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t compat_ro_flags;
101dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t incompat_flags;
102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef HAVE_STRUCT_BTRFS_IOCTL_DEFRAG_RANGE_ARGS_START
106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct btrfs_ioctl_defrag_range_args {
107dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t start;
108dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t len;
109dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t flags;
110dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint32_t extent_thresh;
111dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint32_t compress_type;
112dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint32_t unused[4];
113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef FIDEDUPERANGE
117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define FIDEDUPERANGE   _IOWR(0x94, 54, struct file_dedupe_range)
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct file_dedupe_range_info {
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int64_t dest_fd;	/* in - destination file */
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t dest_offset;	/* in - start of extent in destination */
121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t bytes_deduped;	/* out - total # of bytes we were able
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				 * to dedupe from this file. */
123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* status of this dedupe operation:
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * < 0 for error
125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * == FILE_DEDUPE_RANGE_SAME if dedupe succeeds
126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * == FILE_DEDUPE_RANGE_DIFFERS if data differs
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 */
128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int32_t status;		/* out - see above description */
129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint32_t reserved;	/* must be zero */
130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct file_dedupe_range {
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t src_offset;	/* in - start of extent in source */
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t src_length;	/* in - length of extent */
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint16_t dest_count;	/* in - total elements in info array */
136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint16_t reserved1;	/* must be zero */
137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint32_t reserved2;	/* must be zero */
138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct file_dedupe_range_info info[0];
139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
140d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
142d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BTRFS_IOC_TREE_SEARCH_V2
143dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BTRFS_IOC_TREE_SEARCH_V2	\
144dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	_IOWR(BTRFS_IOCTL_MAGIC, 17, struct btrfs_ioctl_search_args_v2)
145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct btrfs_ioctl_search_args_v2 {
146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_search_key key; /* in/out - search parameters */
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t buf_size;		   /* in - size of buffer
148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					    * out - on EOVERFLOW: needed size
149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					    *       to store item */
150dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	uint64_t buf[0];		   /* out - found items */
151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const char *
156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmaybe_print_uint64max(uint64_t val)
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (val == UINT64_MAX)
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return " /* UINT64_MAX */";
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return "";
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* takes highest valid flag bit */
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic uint64_t
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmax_flags_plus_one(int bit)
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int i;
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t val = 0;
169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (bit == -1)
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return 1;
171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i <= bit + 1 && i < 64; i++)
172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		val |= (1ULL << i);
173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return val;
174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes no arguments, returns nothing:
178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_TRANS_START
180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_TRANS_END
181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_trans_ioctls(void)
184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TRANS_START, NULL);
186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TRANS_START) = -1 EBADF (%m)\n");
187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TRANS_END, NULL);
189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TRANS_END) = -1 EBADF (%m)\n");
190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes no arguments, returns nothing:
194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SYNC
195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing
197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_WAIT_SYNC
198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_sync_ioctls(void)
201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t u64val = 0xdeadbeefbadc0dedULL;
203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SYNC, NULL);
205d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SYNC) = -1 EBADF (%m)\n");
206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_WAIT_SYNC, NULL);
208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_WAIT_SYNC, NULL) = -1 EBADF (%m)\n");
209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_WAIT_SYNC, &u64val);
211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_WAIT_SYNC, [%" PRIu64
212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "]) = -1 EBADF (%m)\n", u64val);
213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
214d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/*
215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * The live test of BTRFS_IOC_SYNC happens as a part of the test
216d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * for BTRFS_IOC_LOGICAL_INO
217d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 */
218d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
219d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
221d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_qgroup_inherit(struct btrfs_qgroup_inherit *inherit)
222d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
223d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{flags=");
224d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_qgroup_inherit_flags, inherit->flags,
225d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_QGROUP_INHERIT_???");
226d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", num_qgroups=%" PRI__u64
227d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", num_ref_copies=%" PRI__u64
228d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", num_excl_copies=%" PRI__u64", lim={flags=",
229d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       inherit->num_qgroups, inherit->num_ref_copies,
230d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       inherit->num_excl_copies);
231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_qgroup_limit_flags,
232d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   inherit->lim.flags,
233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_QGROUP_LIMIT_???");
234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", max_rfer=%" PRI__u64 ", max_excl=%" PRI__u64
235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", rsv_rfer=%" PRI__u64 ", rsv_excl=%" PRI__u64
236d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}, qgroups=",
237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       inherit->lim.max_rfer, inherit->lim.max_excl,
238d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       inherit->lim.rsv_rfer, inherit->lim.rsv_excl);
239d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose) {
240d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		unsigned int i;
241d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[");
242d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		for (i = 0; i < inherit->num_qgroups; i++) {
243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (i > 0)
244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(", ");
245d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("%" PRI__u64, inherit->qgroups[i]);
246d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
247d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]");
248d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else
249d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("...");
250d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}");
251d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_vol_args_v2(struct btrfs_ioctl_vol_args_v2 *args, int print_qgroups)
256d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
257d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{fd=%d, flags=", (int) args->fd);
258d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_snap_flags_v2, args->flags, "BTRFS_SUBVOL_???");
259d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
260d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) {
261d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", size=%" PRI__u64 ", qgroup_inherit=", args->size);
262d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (args->qgroup_inherit && print_qgroups)
263d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_print_qgroup_inherit(args->qgroup_inherit);
264d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		else if (args->qgroup_inherit)
265d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("%p", args->qgroup_inherit);
266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		else
267d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("NULL");
268d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
269d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", name=\"%s\"}", args->name);
270d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
271d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
274d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SNAP_CREATE
275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SUBVOL_CREATE
276d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SNAP_DESTROY
277d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_DEFAULT_SUBVOL
278d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
279d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns u64:
280d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SNAP_CREATE_V2
281d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SUBVOL_CREATE_V2
282d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
284d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
285d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_subvol_ioctls(void)
286d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
287d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *subvol_name = "subvol-name";
288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char *long_subvol_name;
289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	void *bad_pointer = (void *) (unsigned long) 0xdeadbeeffffffeedULL;
290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t u64val = 0xdeadbeefbadc0dedULL;
291d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_vol_args vol_args = {};
292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_vol_args_v2 vol_args_v2 = {
293d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.fd = 2,
294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = max_flags_plus_one(2),
295d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
296d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
297d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long_subvol_name = malloc(BTRFS_PATH_NAME_MAX);
298d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!long_subvol_name)
299d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		perror_msg_and_fail("malloc failed");
300d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memset(long_subvol_name, 'f', BTRFS_PATH_NAME_MAX);
301d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long_subvol_name[BTRFS_PATH_NAME_MAX - 1] = '\0';
302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
303d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(vol_args.name, subvol_name);
304d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
305d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE, NULL);
306d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE, NULL) = -1 EBADF (%m)\n");
307d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
308d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE, &vol_args);
309d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE, "
310d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
312d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE, &vol_args);
313d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE, "
314d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
315d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_DESTROY, &vol_args);
317d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_DESTROY,"
318d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       " {fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
319d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
320d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strncpy(vol_args.name, long_subvol_name, BTRFS_PATH_NAME_MAX);
321d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE, &vol_args);
322d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE,"
323d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       " {fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
324d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
325d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE, &vol_args);
326d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE,"
327d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       " {fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
328d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
329d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_DESTROY, &vol_args);
330d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_DESTROY,"
331d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       " {fd=0, name=\"%s\"}) = -1 EBADF (%m)\n", vol_args.name);
332d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long_subvol_name = realloc(long_subvol_name, BTRFS_SUBVOL_NAME_MAX);
334d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!long_subvol_name)
335d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		perror_msg_and_fail("realloc failed");
336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, NULL);
338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, NULL) = -1 EBADF (%m)\n");
339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, NULL);
341d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, NULL) = -1 EBADF (%m)\n");
342d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
343d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(vol_args_v2.name, subvol_name);
344d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, ");
345d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
346d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, &vol_args_v2);
347d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
348d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
349d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, ");
350d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
351d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, &vol_args_v2);
352d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
353d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
354d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strncpy(vol_args_v2.name, long_subvol_name, BTRFS_SUBVOL_NAME_MAX);
355d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, ");
356d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
357d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, &vol_args_v2);
358d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
360d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, ");
361d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
362d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, &vol_args_v2);
363d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
364d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
365d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(vol_args_v2.name, subvol_name);
366d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	vol_args_v2.qgroup_inherit = bad_pointer;
367d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
368d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, ");
369d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 0);
370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, &vol_args_v2);
371d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
372d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
373d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, ");
374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 0);
375d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, &vol_args_v2);
376d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
377d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
378d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const unsigned int n_qgroups = 8;
379d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int i;
380d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_qgroup_inherit *inherit;
381d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	vol_args_v2.size =
382d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		sizeof(*inherit) + n_qgroups * sizeof(inherit->qgroups[0]);
383d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit = tail_alloc(vol_args_v2.size);
384d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
385d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->flags = 0x3;
386d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->num_ref_copies = 0;
387d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->num_excl_copies = 0;
388d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->num_qgroups = n_qgroups;
389d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < n_qgroups; i++)
390d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		inherit->qgroups[i] = 1ULL << i;
391d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->lim.flags = 0x7f;
392d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->lim.max_rfer = u64val;
393d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->lim.max_excl = u64val;
394d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->lim.rsv_rfer = u64val;
395d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	inherit->lim.rsv_excl = u64val;
396d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	vol_args_v2.qgroup_inherit = inherit;
397d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
398d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, ");
399d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
400d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SNAP_CREATE_V2, &vol_args_v2);
401d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
402d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
403d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, ");
404d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_vol_args_v2(&vol_args_v2, 1);
405d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_CREATE_V2, &vol_args_v2);
406d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
407d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
408d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFAULT_SUBVOL, NULL);
409d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFAULT_SUBVOL, NULL) = -1 EBADF (%m)\n");
410d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
411d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFAULT_SUBVOL, &u64val);
412d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFAULT_SUBVOL, [%"
413d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       PRIu64 "]) = -1 EBADF (%m)\n", u64val);
414d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
415d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SUBVOL_SETFLAGS, ");
416d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_snap_flags_v2, vol_args_v2.flags,
417d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_SUBVOL_???");
418d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SUBVOL_SETFLAGS, &vol_args_v2.flags);
419d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
420d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
421d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (write_ok) {
422d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct btrfs_ioctl_vol_args_v2 args_passed;
423d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		/*
424d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 * Returns transid if flags & BTRFS_SUBVOL_CREATE_ASYNC
425d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 * - BTRFS_IOC_SNAP_CREATE_V2
426d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 * - BTRFS_IOC_SUBVOL_CREATE_V2
427d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 */
428d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int subvolfd;
429d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
430d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strncpy(vol_args_v2.name, subvol_name,
431d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			sizeof(vol_args_v2.name));
432d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		vol_args_v2.flags = BTRFS_SUBVOL_CREATE_ASYNC;
433d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		vol_args_v2.size = 0;
434d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		vol_args_v2.qgroup_inherit = NULL;
435d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args_passed = vol_args_v2;
436d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SUBVOL_CREATE_V2, ",
437d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd);
438d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_vol_args_v2(&vol_args_v2, 1);
439d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SUBVOL_CREATE_V2,
440d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		      &args_passed);
441d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {transid=%" PRI__u64"}) = 0\n",
442d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args_passed.transid);
443d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
444d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		subvolfd = openat(btrfs_test_dir_fd, subvol_name,
445d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				  O_RDONLY|O_DIRECTORY);
446d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (subvolfd < 0)
447d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("openat(%s) failed", subvol_name);
448d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
449d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strncpy(vol_args_v2.name, long_subvol_name, BTRFS_NAME_LEN);
450d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		vol_args_v2.fd = subvolfd;
451d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args_passed = vol_args_v2;
452d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SNAP_CREATE_V2, ",
453d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd);
454d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_vol_args_v2(&args_passed, 1);
455d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SNAP_CREATE_V2,
456d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		      &args_passed);
457d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {transid=%" PRI__u64"}) = 0\n",
458d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args_passed.transid);
459d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
460d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		/* This only works when mounted w/ -ouser_subvol_rm_allowed */
461d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strncpy(vol_args.name, long_subvol_name, 255);
462d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		vol_args.name[255] = 0;
463d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SNAP_DESTROY, &vol_args);
464d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SNAP_DESTROY, "
465d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{fd=%d, name=\"%.*s\"}) = 0\n",
466d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd, (int) vol_args.fd, 255, long_subvol_name);
467d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
468d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		strcpy(vol_args.name, subvol_name);
469d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SNAP_DESTROY, &vol_args);
470d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SNAP_DESTROY, "
471d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{fd=%d, name=\"%s\"}) = 0\n",
472d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd, (int) vol_args.fd, subvol_name);
473d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
474d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(subvolfd);
475d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
476d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	free(long_subvol_name);
477d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
478d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
479d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
480d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_balance_args(struct btrfs_balance_args *args)
481d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
482d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{profiles=");
483d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_space_info_flags, args->profiles,
484d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_BLOCK_GROUP_???");
485d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", usage=%"PRI__u64 "%s, devid=%"PRI__u64 "%s, pstart=%"PRI__u64
486d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "%s, pend=%"PRI__u64 "%s, vstart=%"PRI__u64 "%s, vend=%"PRI__u64
487d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "%s, target=%"PRI__u64 "%s, flags=",
488d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->usage, maybe_print_uint64max(args->usage),
489d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->devid, maybe_print_uint64max(args->devid),
490d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->pstart, maybe_print_uint64max(args->pstart),
491d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->pend, maybe_print_uint64max(args->pend),
492d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->vstart, maybe_print_uint64max(args->vstart),
493d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->vend, maybe_print_uint64max(args->vend),
494d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->target, maybe_print_uint64max(args->target));
495d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_balance_args, args->flags, "BTRFS_BALANCE_ARGS_???");
496d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}");
497d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
498d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
499d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
500d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Accepts argument, returns nothing
501d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_BALANCE
502d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_BALANCE_CTL
503d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
504d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Accepts argument, returns argument
505d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_BALANCE_V2
506d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
507d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
508d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_balance_ioctls(void)
509d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
510d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_balance_args args = {
511d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = 0x3f,
512d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.data = {
513d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.profiles = 0x7,
514d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.flags = 0x7,
515d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.devid = 1,
516d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.pend = -1ULL,
517d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.vend = -1ULL,
518d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		},
519d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
520d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.meta = {
521d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.profiles = 0x38,
522d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.flags = 0x38,
523d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.devid = 1,
524d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		},
525d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
526d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.sys = {
527d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.profiles = 0x1c0 | (1ULL << 48),
528d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.flags = 0x4c0,
529d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.devid = 1,
530d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		},
531d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
532d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_vol_args vol_args = {};
533d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
534d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE_CTL, 1);
535d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE_CTL, "
536d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "BTRFS_BALANCE_CTL_PAUSE) = -1 EBADF (%m)\n");
537d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
538d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE_CTL, 2);
539d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE_CTL, "
540d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "BTRFS_BALANCE_CTL_CANCEL) = -1 EBADF (%m)\n");
541d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
542d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE, NULL);
543d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE) = -1 EBADF (%m)\n");
544d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
545d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE, &vol_args);
546d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE) = -1 EBADF (%m)\n");
547d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
548d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* struct btrfs_ioctl_balance_args */
549d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE_V2, NULL);
550d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE_V2, NULL) = -1 EBADF (%m)\n");
551d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
552d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_BALANCE_V2, {flags=");
553d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_balance_flags, args.flags, "BTRFS_BALANCE_???");
554d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", data=");
555d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_balance_args(&args.data);
556d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", meta=");
557d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_balance_args(&args.meta);
558d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", sys=");
559d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_balance_args(&args.sys);
560d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_BALANCE_V2, &args);
561d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
562d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
563d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (write_ok) {
564d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.flags = BTRFS_BALANCE_DATA | BTRFS_BALANCE_METADATA |
565d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			     BTRFS_BALANCE_SYSTEM;
566d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.data.flags = 0;
567d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.data.profiles = 0;
568d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.meta.flags = 0;
569d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.meta.profiles = 0;
570d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.sys.flags = 0;
571d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.sys.profiles = 0;
572d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_BALANCE_V2, {flags=",
573d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd);
574d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
575d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(btrfs_balance_flags, args.flags,
576d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			   "BTRFS_BALANCE_???");
577d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", data=");
578d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.data);
579d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", meta=");
580d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.meta);
581d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", sys=");
582d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.sys);
583d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_BALANCE_V2,  &args);
584d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("} => {flags=");
585d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(btrfs_balance_flags, args.flags,
586d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			   "BTRFS_BALANCE_???");
587d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", state=");
588d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(btrfs_balance_state, args.state,
589d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			   "BTRFS_BALANCE_STATE_???");
590d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", data=");
591d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.data);
592d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", meta=");
593d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.meta);
594d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", sys=");
595d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_balance_args(&args.sys);
596d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}) = 0\n");
597d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
598d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
599d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
600d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
601d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
602d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_RESIZE
603d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
604d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Requires /dev/btrfs-control, consumes argument, returns nothing:
605d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SCAN_DEV
606d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_DEVICES_READY
607d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
608d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
609d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
610d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_device_ioctls(void)
611d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
612d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *devid = "1";
613d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *devname = "/dev/sda1";
614d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_vol_args args = {
615d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.fd = 2,
616d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
617d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
618d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_RESIZE, NULL);
619d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_RESIZE, NULL) = -1 EBADF (%m)\n");
620d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
621d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(args.name, devid);
622d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_RESIZE, &args);
623d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_RESIZE, "
624d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=%d, name=\"%s\"}) = -1 EBADF (%m)\n",
625d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.fd, args.name);
626d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
627d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCAN_DEV, NULL);
628d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCAN_DEV, NULL) = -1 EBADF (%m)\n");
629d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
630d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(args.name, devname);
631d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCAN_DEV, &args);
632d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCAN_DEV, "
633d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=%d, name=\"%s\"}) = -1 EBADF (%m)\n",
634d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.fd, args.name);
635d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
636d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_ADD_DEV, NULL);
637d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_ADD_DEV, NULL) = -1 EBADF (%m)\n");
638d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
639d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_ADD_DEV, &args);
640d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_ADD_DEV, "
641d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=%d, name=\"%s\"}) = -1 EBADF (%m)\n",
642d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.fd, args.name);
643d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
644d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_RM_DEV, NULL);
645d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_RM_DEV, NULL) = -1 EBADF (%m)\n");
646d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
647d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_RM_DEV, &args);
648d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_RM_DEV, "
649d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{fd=%d, name=\"%s\"}) = -1 EBADF (%m)\n",
650d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.fd, args.name);
651d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
652d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
653d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
654d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
655d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
656d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_CLONE
657d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_CLONE_RANGE
658d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
659d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
660d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_clone_ioctls(void)
661d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
662d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int clone_fd = 4;
663d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_clone_range_args args = {
664d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src_fd = clone_fd,
665d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src_offset = 4096,
666d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src_length = 16384,
667d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.dest_offset = 128 * 1024,
668d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
669d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
670d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_CLONE, clone_fd);
671d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_CLONE or FICLONE, %x) = -1 EBADF (%m)\n",
672d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		clone_fd);
673d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
674d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_CLONE_RANGE, NULL);
675d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_CLONE_RANGE or FICLONERANGE, "
676d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "NULL) = -1 EBADF (%m)\n");
677d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
678d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_CLONE_RANGE, &args);
679d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_CLONE_RANGE or FICLONERANGE, "
680d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{src_fd=%d, src_offset=%" PRI__u64 ", src_length=%" PRI__u64
681d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", dest_offset=%" PRI__u64 "}) = -1 EBADF (%m)\n",
682d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(int) args.src_fd, args.src_offset, args.src_length,
683d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.dest_offset);
684d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
685d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
686d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define BTRFS_COMPRESS_TYPES 2
687d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define BTRFS_INVALID_COMPRESS (BTRFS_COMPRESS_TYPES + 1)
688d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
689d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
690d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_defrag_range_args(struct btrfs_ioctl_defrag_range_args *args)
691d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
692d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{start=%" PRIu64", len=%" PRIu64 "%s, flags=",
693d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(uint64_t) args->start, (uint64_t) args->len,
694d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		maybe_print_uint64max(args->len));
695d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
696d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_defrag_flags, args->flags, "BTRFS_DEFRAG_RANGE_???");
697d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", extent_thresh=%u, compress_type=", args->extent_thresh);
698d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printxval(btrfs_compress_types, args->compress_type,
699d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		  "BTRFS_COMPRESS_???");
700d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}");
701d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
702d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
703d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
704d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
705d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_DEFRAG
706d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_DEFRAG_RANGE
707d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
708d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
709d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_defrag_ioctls(void)
710d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
711d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_vol_args vol_args = {};
712d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_defrag_range_args args = {
713d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.start = 0,
714d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.len = -1ULL,
715d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = max_flags_plus_one(1),
716d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.extent_thresh = 128 * 1024,
717d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.compress_type = 2, /* BTRFS_COMPRESS_LZO */
718d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
719d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
720d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/*
721d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * These are documented as using vol_args but don't
722d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * actually consume it.
723d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 */
724d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG, NULL);
725d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG) = -1 EBADF (%m)\n");
726d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
727d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG, &vol_args);
728d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG) = -1 EBADF (%m)\n");
729d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
730d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* struct btrfs_ioctl_defrag_range_args */
731d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, NULL);
732d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, NULL) = -1 EBADF (%m)\n");
733d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
734d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, ");
735d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_defrag_range_args(&args);
736d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, &args);
737d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
738d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
739d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.compress_type = BTRFS_INVALID_COMPRESS;
740d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, ");
741d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_defrag_range_args(&args);
742d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, &args);
743d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
744d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
745d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.len--;
746d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, ");
747d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_defrag_range_args(&args);
748d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEFRAG_RANGE, &args);
749d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(") = -1 EBADF (%m)\n");
750d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
751d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
752d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const char *
753d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesxlookup(const struct xlat *xlat, const uint64_t val)
754d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
755d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (; xlat->str != NULL; xlat++)
756d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (xlat->val == val)
757d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			return xlat->str;
758d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return NULL;
759d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
760d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
761d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
762d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_objectid(uint64_t objectid)
763d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
764d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *str = xlookup(btrfs_tree_objectids, objectid);
765d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("%" PRIu64, objectid);
766d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (str)
767d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" /* %s */", str);
768d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
769d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
770d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
771d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_key_type(uint32_t type)
772d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
773d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *str = xlookup(btrfs_key_types, type);
774d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("%u", type);
775d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (str)
776d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" /* %s */", str);
777d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
778d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
779d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
780d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_search_key(struct btrfs_ioctl_search_key *key)
781d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
782d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("key={tree_id=");
783d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_objectid(key->tree_id);
784d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose || key->min_objectid != 256) {
785d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", min_objectid=");
786d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(key->min_objectid);
787d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
788d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose || key->max_objectid != -256ULL) {
789d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", max_objectid=");
790d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(key->max_objectid);
791d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
792d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (key->min_offset)
793d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", min_offset=%" PRI__u64 "%s",
794d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       key->min_offset, maybe_print_uint64max(key->min_offset));
795d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (key->max_offset)
796d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", max_offset=%" PRI__u64 "%s",
797d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       key->max_offset, maybe_print_uint64max(key->max_offset));
798d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (key->min_transid)
799d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", min_transid=%" PRI__u64"%s", key->min_transid,
800d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       maybe_print_uint64max(key->min_transid));
801d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (key->max_transid)
802d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", max_transid=%" PRI__u64"%s", key->max_transid,
803d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       maybe_print_uint64max(key->max_transid));
804d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", min_type=");
805d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_key_type(key->min_type);
806d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", max_type=");
807d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_key_type(key->max_type);
808d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", nr_items=%u}", key->nr_items);
809d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
810d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
811d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
812d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_tree_search_buf(struct btrfs_ioctl_search_key *key,
813d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			    void *buf, uint64_t buf_size)
814d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
815d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose) {
816d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		uint64_t i;
817d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		uint64_t off = 0;
818d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[");
819d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		for (i = 0; i < key->nr_items; i++) {
820d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			struct btrfs_ioctl_search_header *sh;
821d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			sh = (typeof(sh))(buf + off);
822d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (i)
823d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(", ");
824d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("{transid=%" PRI__u64 ", objectid=",
825d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				sh->transid);
826d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_print_objectid(sh->objectid);
827d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", offset=%" PRI__u64 ", type=", sh->offset);
828d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_print_key_type(sh->type);
829d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", len=%u}", sh->len);
830d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			off += sizeof(*sh) + sh->len;
831d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
832d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]");
833d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else
834d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("...");
835d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
836d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
837d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
838d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
839d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_TREE_SEARCH
840d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_TREE_SEARCH_V2
841d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
842d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
843d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_search_ioctls(void)
844d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
845d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_search_key key_reference = {
846d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.tree_id = 5,
847d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.min_objectid = 256,
848d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.max_objectid = -1ULL,
849d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.min_offset = 0,
850d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.max_offset = -1ULL,
851d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.min_transid = 0,
852d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.max_transid = -1ULL,
853d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.min_type = 0,
854d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.max_type = -1U,
855d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.nr_items = 10,
856d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
857d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_search_args search_args;
858d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_search_args_v2 search_args_v2 = {
859d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.buf_size = 4096,
860d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
861d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
862d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, NULL);
863d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, NULL) = -1 EBADF (%m)\n");
864d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
865d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, NULL);
866d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, NULL) = -1 EBADF (%m)\n");
867d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
868d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args.key = key_reference;
869d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, {");
870d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args.key);
871d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, &search_args);
872d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
873d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
874d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args_v2.key = key_reference;
875d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, {");
876d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args_v2.key);
877d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, &search_args_v2);
878d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", buf_size=%" PRIu64 "}) = -1 EBADF (%m)\n",
879d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (uint64_t)search_args_v2.buf_size);
880d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
881d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.min_objectid = 6;
882d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.max_objectid = 7;
883d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args.key = key_reference;
884d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, {");
885d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args.key);
886d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, &search_args);
887d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
888d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
889d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args_v2.key = key_reference;
890d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, {");
891d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args_v2.key);
892d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, &search_args_v2);
893d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", buf_size=%" PRIu64 "}) = -1 EBADF (%m)\n",
894d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (uint64_t)search_args_v2.buf_size);
895d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
896d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.min_offset++;
897d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.max_offset--;
898d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args.key = key_reference;
899d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, {");
900d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args.key);
901d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, &search_args);
902d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
903d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
904d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args_v2.key = key_reference;
905d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, {");
906d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args_v2.key);
907d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, &search_args_v2);
908d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", buf_size=%" PRIu64 "}) = -1 EBADF (%m)\n",
909d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (uint64_t)search_args_v2.buf_size);
910d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
911d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.min_transid++;
912d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.max_transid--;
913d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args.key = key_reference;
914d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, {");
915d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args.key);
916d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, &search_args);
917d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
918d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
919d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args_v2.key = key_reference;
920d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, {");
921d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args_v2.key);
922d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, &search_args_v2);
923d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", buf_size=%" PRIu64 "}) = -1 EBADF (%m)\n",
924d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (uint64_t)search_args_v2.buf_size);
925d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
926d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.min_type = 1;
927d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	key_reference.max_type = 12;
928d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args.key = key_reference;
929d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH, {");
930d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args.key);
931d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH, &search_args);
932d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
933d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
934d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	search_args_v2.key = key_reference;
935d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, {");
936d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_search_key(&search_args_v2.key);
937d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_TREE_SEARCH_V2, &search_args_v2);
938d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", buf_size=%" PRIu64 "}) = -1 EBADF (%m)\n",
939d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (uint64_t)search_args_v2.buf_size);
940d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
941d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
942d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct btrfs_ioctl_search_args_v2 *args;
943d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int bufsize = 4096;
944d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
945d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.tree_id = 5;
946d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.min_type = 1;
947d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.max_type = 1;
948d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.min_objectid = 256;
949d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.max_objectid = 357;
950d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.min_offset = 0;
951d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		key_reference.max_offset = -1ULL;
952d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
953d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		search_args.key = key_reference;
954d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_TREE_SEARCH, {",
955d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd);
956d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_search_key(&search_args.key);
957d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_TREE_SEARCH, &search_args);
958d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("} => {key={nr_items=%u}, buf=",
959d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			search_args.key.nr_items);
960d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_tree_search_buf(&search_args.key, search_args.buf,
961d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					    sizeof(search_args.buf));
962d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}) = 0\n");
963d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
964d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args = malloc(sizeof(*args) + bufsize);
965d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (!args)
966d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("malloc failed");
967d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
968d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->key = key_reference;
969d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->buf_size = bufsize;
970d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_TREE_SEARCH_V2, {",
971d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd);
972d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_search_key(&key_reference);
973d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", buf_size=%" PRIu64 "}", (uint64_t) args->buf_size);
974d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_TREE_SEARCH_V2, args);
975d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {key={nr_items=%u}, buf_size=%" PRIu64 ", buf=",
976d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args->key.nr_items, (uint64_t)args->buf_size);
977d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_tree_search_buf(&args->key, args->buf,
978d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					    args->buf_size);
979d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}) = 0\n");
980d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
981d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->key = key_reference;
982d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args->buf_size = sizeof(struct btrfs_ioctl_search_header);
983d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_TREE_SEARCH_V2, {",
984d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd);
985d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_search_key(&args->key);
986d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", buf_size=%" PRIu64 "}", (uint64_t)args->buf_size);
987d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_TREE_SEARCH_V2, args);
988d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {buf_size=%" PRIu64 "}) = -1 EOVERFLOW (%m)\n",
989d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			(uint64_t)args->buf_size);
990d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		free(args);
991d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
992d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
993d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
994d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
995d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
996d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_INO_LOOKUP
997d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
998d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
999d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_ino_lookup_ioctl(void)
1000d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1001d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_ino_lookup_args args = {
1002d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.treeid = 5,
1003d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.objectid = 256,
1004d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1005d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1006d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_INO_LOOKUP, NULL);
1007d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_INO_LOOKUP, NULL) = -1 EBADF (%m)\n");
1008d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1009d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_INO_LOOKUP, {treeid=");
1010d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_objectid(args.treeid);
1011d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", objectid=");
1012d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_objectid(args.objectid);
1013d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_INO_LOOKUP, &args);
1014d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1015d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1016d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
1017d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_INO_LOOKUP, {treeid=",
1018d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd);
1019d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(args.treeid);
1020d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", objectid=");
1021d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(args.objectid);
1022d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_INO_LOOKUP, &args);
1023d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("} => {name=\"%s\"}) = 0\n", args.name);
1024d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1025d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1026d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1027d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1028d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1029d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SPACE_INFO
1030d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1031d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1032d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_space_info_ioctl(void)
1033d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1034d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_space_args args = {};
1035d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1036d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SPACE_INFO, NULL);
1037d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SPACE_INFO, NULL) = -1 EBADF (%m)\n");
1038d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1039d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SPACE_INFO, &args);
1040d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SPACE_INFO, "
1041d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{space_slots=%" PRI__u64 "}) = -1 EBADF (%m)\n",
1042d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.space_slots);
1043d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1044d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
1045d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct btrfs_ioctl_space_args args_passed;
1046d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct btrfs_ioctl_space_args *argsp;
1047d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args_passed = args;
1048d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SPACE_INFO, "
1049d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{space_slots=%" PRI__u64 "}",
1050d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd, args_passed.space_slots);
1051d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SPACE_INFO, &args_passed);
1052d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {total_spaces=%" PRI__u64 "}) = 0\n",
1053d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args_passed.total_spaces);
1054d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1055d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp = malloc(sizeof(args) +
1056d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args_passed.total_spaces * sizeof(args.spaces[0]));
1057d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (!argsp)
1058d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("malloc failed");
1059d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1060d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		*argsp = args;
1061d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->space_slots = args_passed.total_spaces;
1062d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SPACE_INFO, "
1063d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{space_slots=%" PRI__u64 "}",
1064d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd, argsp->space_slots);
1065d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SPACE_INFO, argsp);
1066d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {total_spaces=%" PRI__u64 ", spaces=",
1067d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			argsp->total_spaces);
1068d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose) {
1069d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			unsigned int i;
1070d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("[");
1071d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			for (i = 0; i < argsp->total_spaces; i++) {
1072d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				struct btrfs_ioctl_space_info *info;
1073d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				info = &argsp->spaces[i];
1074d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				if (i)
1075d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					printf(", ");
1076d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf("{flags=");
1077d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printflags(btrfs_space_info_flags, info->flags,
1078d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   "BTRFS_SPACE_INFO_???");
1079d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(", total_bytes=%" PRI__u64
1080d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       ", used_bytes=%" PRI__u64 "}",
1081d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       info->total_bytes, info->used_bytes);
1082d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			}
1083d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1084d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("]");
1085d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else
1086d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("...");
1087d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}) = 0\n");
1088d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		free(argsp);
1089d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1090d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1091d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1092d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1093d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes no arguments, returns nothing:
1094d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SCRUB_CANCEL
1095d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1096d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes - * BTRFS_IOC_SCRUB
1097d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes - * BTRFS_IOC_SCRUB_PROGRESS
1098d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1099d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_scrub_ioctls(void)
1101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_scrub_args args = {
1103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.devid = 1,
1104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.start = 0,
1105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.end = -1ULL,
1106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = max_flags_plus_one(0),
1107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCRUB, NULL);
1110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCRUB, NULL) = -1 EBADF (%m)\n");
1111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCRUB_CANCEL, NULL);
1113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCRUB_CANCEL) = -1 EBADF (%m)\n");
1114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCRUB, {devid=%" PRI__u64 ", start=%"
1116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		PRI__u64 "%s, end=%" PRI__u64"%s, flags=",
1117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.devid, args.start, maybe_print_uint64max(args.start),
1118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.end, maybe_print_uint64max(args.end));
1119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_scrub_flags, args.flags, "BTRFS_SCRUB_???");
1120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCRUB, &args);
1121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCRUB_PROGRESS, NULL);
1124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCRUB_PROGRESS, NULL) = -1 EBADF (%m)\n");
1125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SCRUB_PROGRESS, &args);
1127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SCRUB_PROGRESS, "
1128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{devid=%" PRI__u64 "}) = -1 EBADF (%m)\n", args.devid);
1129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_DEV_INFO
1134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_dev_info_ioctl(void)
1137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_dev_info_args args = {
1139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.devid = 1,
1140d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memcpy(&args.uuid, uuid_reference, BTRFS_UUID_SIZE);
1142d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEV_INFO, NULL);
1144d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEV_INFO, NULL) = -1 EBADF (%m)\n");
1145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEV_INFO, &args);
1147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEV_INFO, "
1148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{devid=%" PRI__u64", uuid=%s}) = -1 EBADF (%m)\n",
1149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.devid, uuid_reference_string);
1150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_INO_PATHS
1155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_LOGICAL_INO
1156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_ino_path_ioctls(void)
1159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char buf[16384];
1161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_ino_path_args args = {
1162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.inum = 256,
1163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.size = sizeof(buf),
1164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.fspath = (unsigned long)buf,
1165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_INO_PATHS, NULL);
1168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_INO_PATHS, NULL) = -1 EBADF (%m)\n");
1169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_LOGICAL_INO, NULL);
1171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_LOGICAL_INO, NULL) = -1 EBADF (%m)\n");
1172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_INO_PATHS, &args);
1174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_INO_PATHS, "
1175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{inum=%" PRI__u64", size=%" PRI__u64
1176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", fspath=0x%" PRI__x64 "}) = -1 EBADF (%m)\n",
1177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       args.inum, args.size, args.fspath);
1178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_LOGICAL_INO, &args);
1180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_LOGICAL_INO, {logical=%" PRI__u64
1181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", size=%" PRI__u64", inodes=0x%" PRI__x64
1182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", args.inum, args.size, args.fspath);
1183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef HAVE_LINUX_FIEMAP_H
1185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
1186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int size;
1187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct stat si;
1188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int ret;
1189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct btrfs_data_container *data = (void *)buf;
1190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct fiemap *fiemap;
1191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int fd;
1192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ret = fstat(btrfs_test_dir_fd, &si);
1194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (ret)
1195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("fstat failed");
1196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.inum = si.st_ino;
1198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_INO_PATHS, "
1199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{inum=%" PRI__u64", size=%" PRI__u64
1200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       ", fspath=0x%" PRI__x64"}",
1201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd, args.inum, args.size,
1202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       args.fspath);
1203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_INO_PATHS, &args);
1204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {fspath={bytes_left=%u, bytes_missing=%u, elem_cnt=%u, elem_missed=%u, val=",
1205d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			data->bytes_left, data->bytes_missing, data->elem_cnt,
1206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			data->elem_missed);
1207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose) {
1208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("[\"strace-test\"]");
1209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else
1210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("...");
1211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}}) = 0\n");
1212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fd = openat(btrfs_test_dir_fd, "file1", O_RDWR|O_CREAT, 0600);
1214d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (fd < 0)
1215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("openat(file1) failed");
1216d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1217d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ret = fstat(fd, &si);
1218d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (ret)
1219d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("fstat failed");
1220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1221d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (write(fd, buf, sizeof(buf)) < 0)
1222d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("write: fd");
1223d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1224d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		/*
1225d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 * Force delalloc so we can actually
1226d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 * search for the extent.
1227d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		 */
1228d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fsync(fd);
1229d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(fd, BTRFS_IOC_SYNC, NULL);
1230d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SYNC) = 0\n", fd);
1231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1232d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		size = sizeof(*fiemap) + 2 * sizeof(fiemap->fm_extents[0]);
1233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fiemap = malloc(size);
1234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (!fiemap)
1235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("malloc failed");
1236d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		memset(fiemap, 0, size);
1237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1238d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fiemap->fm_length = sizeof(buf);
1239d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fiemap->fm_extent_count = 2;
1240d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1241d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		/* This is also a live test for FIEMAP */
1242d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, FS_IOC_FIEMAP, {fm_start=%" PRI__u64
1243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       ", fm_length=%" PRI__u64", fm_flags=",
1244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       fd, fiemap->fm_start, fiemap->fm_length);
1245d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(fiemap_flags, fiemap->fm_flags, "FIEMAP_FLAG_???");
1246d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", fm_extent_count=%u}", fiemap->fm_extent_count);
1247d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(fd, FS_IOC_FIEMAP, fiemap);
1248d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {fm_flags=");
1249d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(fiemap_flags, fiemap->fm_flags, "FIEMAP_FLAG_???");
1250d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", fm_mapped_extents=%u, fm_extents=",
1251d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			fiemap->fm_mapped_extents);
1252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose) {
1253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("[");
1254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			unsigned int i;
1255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			for (i = 0; i < fiemap->fm_mapped_extents; i++) {
1256d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				struct fiemap_extent *fe;
1257d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				fe = &fiemap->fm_extents[i];
1258d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				if (i)
1259d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					printf(", ");
1260d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf("{fe_logical=%" PRI__u64
1261d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       ", fe_physical=%" PRI__u64
1262d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       ", fe_length=%" PRI__u64
1263d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       ", ",
1264d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       fe->fe_logical, fe->fe_physical,
1265d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       fe->fe_length);
1266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printflags(fiemap_extent_flags, fe->fe_flags,
1267d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   "FIEMAP_EXTENT_???");
1268d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf("}");
1269d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			}
1270d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("]");
1271d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else
1272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("...");
1273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}) = 0\n");
1274d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.inum = fiemap->fm_extents[0].fe_physical;
1276d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_LOGICAL_INO, {logical=%" PRI__u64
1277d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       ", size=%" PRI__u64", inodes=0x%" PRI__x64"}",
1278d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       fd, args.inum, args.size, args.fspath);
1279d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(fd, BTRFS_IOC_LOGICAL_INO, &args);
1280d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(" => {inodes={bytes_left=%u, bytes_missing=%u, elem_cnt=%u, elem_missed=%u, val=",
1281d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			data->bytes_left, data->bytes_missing, data->elem_cnt,
1282d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			data->elem_missed);
1283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose) {
1284d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("[{inum=%llu, offset=0, root=5}]",
1285d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       (unsigned long long) si.st_ino);
1286d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else
1287d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("...");
1288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("}}) = 0\n");
1289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd);
1290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		free(fiemap);
1291d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* HAVE_LINUX_FIEMAP_H */
1293d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1295d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1296d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1297d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SET_RECEIVED_SUBVOL
1298d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1299d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1300d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_set_received_subvol_ioctl(void)
1301d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_received_subvol_args args = {
1303d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.stransid = 0x12345,
1304d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.stime = {
1305d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.sec = 1463193386,
1306d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.nsec = 12345,
1307d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		},
1308d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1309d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memcpy(&args.uuid, uuid_reference, BTRFS_UUID_SIZE);
1310d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_RECEIVED_SUBVOL, NULL);
1312d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_RECEIVED_SUBVOL, "
1313d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "NULL) = -1 EBADF (%m)\n");
1314d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1315d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_RECEIVED_SUBVOL, &args);
1316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_RECEIVED_SUBVOL, "
1317d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{uuid=%s, stransid=%" PRI__u64", stime=%" PRI__u64
1318d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ".%u, flags=0}) = -1 EBADF (%m)\n",
1319d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       uuid_reference_string, args.stransid, args.stime.sec,
1320d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       args.stime.nsec);
1321d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1322d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1323d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1324d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing (output is via send_fd)
1325d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SEND
1326d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1327d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1328d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_send_ioctl(void)
1329d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1330d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	uint64_t u64_array[2] = { 256, 257 };
1331d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_send_args args = {
1332d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.send_fd = 4,
1333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.parent_root = 257,
1334d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = max_flags_plus_one(2),
1335d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SEND, NULL);
1338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SEND, NULL) = -1 EBADF (%m)\n");
1339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SEND, "
1341d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{send_fd=%d, clone_sources_count=%" PRI__u64
1342d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", clone_sources=",
1343d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.send_fd, args.clone_sources_count);
1344d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose)
1345d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("NULL");
1346d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	else
1347d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("...");
1348d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", parent_root=");
1349d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_objectid(args.parent_root);
1350d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", flags=");
1351d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_send_flags, args.flags, "BTRFS_SEND_FLAGS_???");
1352d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SEND, &args);
1353d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1354d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1355d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.clone_sources_count = 2;
1356d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.clone_sources = (__u64 *) (void *) u64_array;
1357d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1358d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SEND, "
1359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{send_fd=%d, clone_sources_count=%" PRI__u64
1360d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", clone_sources=",
1361d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) args.send_fd, args.clone_sources_count);
1362d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose) {
1363d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[");
1364d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(u64_array[0]);
1365d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", ");
1366d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_objectid(u64_array[1]);
1367d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]");
1368d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else
1369d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("...");
1370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", parent_root=");
1371d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_objectid(args.parent_root);
1372d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", flags=");
1373d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_send_flags, args.flags, "BTRFS_SEND_FLAGS_???");
1374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SEND, &args);
1375d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1376d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1377d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1378d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1379d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1380d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_QUOTA_CTL
1381d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1382d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1383d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_quota_ctl_ioctl(void)
1384d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1385d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_quota_ctl_args args = {
1386d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.cmd = 1,
1387d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1388d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1389d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_CTL, NULL);
1390d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_CTL, NULL) = -1 EBADF (%m)\n");
1391d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1392d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_CTL, &args);
1393d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_CTL, "
1394d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "BTRFS_QUOTA_CTL_ENABLE}) = -1 EBADF (%m)\n");
1395d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1396d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.cmd = 2;
1397d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_CTL, &args);
1398d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_CTL, "
1399d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "BTRFS_QUOTA_CTL_DISABLE}) = -1 EBADF (%m)\n");
1400d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1401d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.cmd = 3;
1402d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_CTL, &args);
1403d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_CTL, "
1404d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "BTRFS_QUOTA_CTL_RESCAN__NOTUSED}) = -1 EBADF (%m)\n");
1405d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1406d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.cmd = 4;
1407d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_CTL, &args);
1408d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_CTL, "
1409d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "0x4 /* BTRFS_QUOTA_CTL_??? */}) = -1 EBADF (%m)\n");
1410d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1411d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1412d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1413d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1414d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_QGROUP_ASSIGN
1415d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1416d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1417d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_qgroup_assign_ioctl(void)
1418d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1419d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_qgroup_assign_args args = {
1420d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.assign = 1,
1421d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src = 257,
1422d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.dst = 258,
1423d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1424d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1425d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QGROUP_ASSIGN, NULL);
1426d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QGROUP_ASSIGN, NULL) = -1 EBADF (%m)\n");
1427d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1428d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QGROUP_ASSIGN, &args);
1429d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QGROUP_ASSIGN, "
1430d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{assign=%" PRI__u64", src=%" PRI__u64", dst=%" PRI__u64
1431d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", args.assign, args.src, args.dst);
1432d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1433d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1434d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1435d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1436d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_QGROUP_CREATE
1437d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes  */
1438d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1439d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_qgroup_create_ioctl(void)
1440d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1441d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_qgroup_create_args args = {
1442d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.create = 1,
1443d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.qgroupid = 257,
1444d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1445d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1446d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QGROUP_CREATE, NULL);
1447d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QGROUP_CREATE, NULL) = -1 EBADF (%m)\n");
1448d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1449d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QGROUP_CREATE, &args);
1450d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QGROUP_CREATE, "
1451d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{create=%" PRI__u64", qgroupid=%" PRI__u64
1452d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", args.create, args.qgroupid);
1453d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1454d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1455d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1456d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes nothing, returns nothing:
1457d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_QUOTA_RESCAN_WAIT
1458d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1459d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_QUOTA_RESCAN
1460d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1461d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1462d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_quota_rescan_ioctl(void)
1463d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1464d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_quota_rescan_args args = {
1465d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.progress = 1,
1466d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1467d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1468d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_RESCAN, NULL);
1469d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_RESCAN, NULL) = -1 EBADF (%m)\n");
1470d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1471d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_RESCAN, &args);
1472d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_RESCAN, "
1473d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{flags=0}) = -1 EBADF (%m)\n");
1474d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_QUOTA_RESCAN_WAIT, NULL);
1475d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_QUOTA_RESCAN_WAIT) = -1 EBADF (%m)\n");
1476d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1477d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1478d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1479d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1480d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1481d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SET_FSLABEL
1482d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
1483d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes no argument, returns argument:
1484d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_GET_FS_LABEL
1485d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1486d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1487d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_label_ioctls(void)
1488d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1489d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char label[BTRFS_LABEL_SIZE] = "btrfs-label";
1490d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1491d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_FSLABEL, NULL);
1492d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_FSLABEL, NULL) = -1 EBADF (%m)\n");
1493d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1494d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_FSLABEL, label);
1495d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_FSLABEL, \"%s\") = -1 EBADF (%m)\n",
1496d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		label);
1497d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1498d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (write_ok) {
1499d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_SET_FSLABEL, label);
1500d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_SET_FSLABEL, \"%s\") = 0\n",
1501d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd, label);
1502d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1503d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_GET_FSLABEL, label);
1504d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_GET_FSLABEL, \"%s\") = 0\n",
1505d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd, label);
1506d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1507d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1508d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1509d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1510d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1511d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_GET_DEV_STATS
1512d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1513d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1514d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_get_dev_stats_ioctl(void)
1515d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1516d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_get_dev_stats args = {
1517d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.devid = 1,
1518d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.nr_items = 5,
1519d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.flags = max_flags_plus_one(0),
1520d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1521d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1522d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_GET_DEV_STATS, NULL);
1523d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_GET_DEV_STATS, NULL) = -1 EBADF (%m)\n");
1524d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1525d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_GET_DEV_STATS, {devid=%" PRI__u64
1526d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		", nr_items=%" PRI__u64", flags=",
1527d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.devid, args.nr_items);
1528d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_dev_stats_flags, args.flags,
1529d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     "BTRFS_DEV_STATS_???");
1530d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_GET_DEV_STATS, &args);
1531d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1532d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1533d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (write_ok) {
1534d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		unsigned int i;
1535d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		args.flags = BTRFS_DEV_STATS_RESET;
1536d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_GET_DEV_STATS, {devid=%" PRI__u64
1537d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			", nr_items=%" PRI__u64", flags=",
1538d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_dir_fd, args.devid, args.nr_items);
1539d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(btrfs_dev_stats_flags, args.flags,
1540d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			     "BTRFS_DEV_STATS_???");
1541d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_GET_DEV_STATS, &args);
1542d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("} => {nr_items=%" PRI__u64 ", flags=",
1543d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			args.nr_items);
1544d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(btrfs_dev_stats_flags, args.flags,
1545d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			   "BTRFS_DEV_STATS_???");
1546d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", [");
1547d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		for (i = 0; i < args.nr_items; i++) {
1548d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			const char *name = xlookup(btrfs_dev_stats_values, i);
1549d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (i)
1550d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(", ");
1551d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("%" PRI__u64, args.values[i]);
155239bac055674d23770b9a724221b728e443196ea7Elliott Hughes			if (name)
155339bac055674d23770b9a724221b728e443196ea7Elliott Hughes				printf(" /* %s */", name);
1554d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
1555d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]}) = 0\n");
1556d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1557d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1558d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1559d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1560d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns argument:
1561d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_DEV_REPLACE
1562d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
1563d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Test environment for this is more difficult; It's better to do it by hand.
1564d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1565d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1566d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_dev_replace_ioctl(void)
1567d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1568d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_dev_replace_args args = {
1569d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_START,
1570d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1571d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.start.srcdevid = 1;
1572d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy((char *)args.start.srcdev_name, "/dev/sda1");
1573d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy((char *)args.start.tgtdev_name, "/dev/sdb1");
1574d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1575d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* struct btrfs_ioctl_dev_replace_args */
1576d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEV_REPLACE, NULL);
1577d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEV_REPLACE, NULL) = -1 EBADF (%m)\n");
1578d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1579d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEV_REPLACE, &args);
1580d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEV_REPLACE, "
1581d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{cmd=BTRFS_IOCTL_DEV_REPLACE_CMD_START, start={srcdevid=%"
1582d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       PRI__u64", cont_reading_from_srcdev_mode=%" PRI__u64
1583d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", srcdev_name=\"%s\", tgtdev_name=\"%s\"}}) = -1 EBADF (%m)\n",
1584d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       args.start.srcdevid,
1585d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       args.start.cont_reading_from_srcdev_mode,
1586d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (char *)args.start.srcdev_name,
1587d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (char *)args.start.tgtdev_name);
1588d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1589d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args.cmd = 1;
1590d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_DEV_REPLACE, &args);
1591d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_DEV_REPLACE, "
1592d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{cmd=BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS}) = -1 EBADF (%m)\n");
1593d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1594d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1595d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1596d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_extent_same_ioctl(void)
1597d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1598d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef BTRFS_IOC_FILE_EXTENT_SAME
1599d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct file_dedupe_range args = {
1600d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src_offset = 1024,
1601d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.src_length = 10240,
1602d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1603d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct file_dedupe_range *argsp;
1604d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1605d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME, NULL);
1606d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
1607d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "NULL) = -1 EBADF (%m)\n");
1608d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1609d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
1610d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{src_offset=%" PRIu64
1611d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", src_length=%" PRIu64
1612d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", dest_count=%hu, info=[]",
1613d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(uint64_t)args.src_offset,
1614d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(uint64_t)args.src_length, args.dest_count);
1615d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME, &args);
1616d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1617d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1618d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp = malloc(sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
1619d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!argsp)
1620d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		perror_msg_and_fail("malloc failed");
1621d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memset(argsp, 0, sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
1622d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1623d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	*argsp = args;
1624d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->dest_count = 3;
1625d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[0].dest_fd = 2;
1626d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[0].dest_offset = 0;
1627d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[1].dest_fd = 2;
1628d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[1].dest_offset = 10240;
1629d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[2].dest_fd = 2;
1630d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	argsp->info[2].dest_offset = 20480;
1631d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1632d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
1633d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{src_offset=%" PRIu64
1634d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", src_length=%" PRIu64
1635d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", dest_count=%hu, info=",
1636d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(int64_t)argsp->src_offset,
1637d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(uint64_t)argsp->src_length, argsp->dest_count);
1638d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[{dest_fd=%" PRId64 ", dest_offset=%" PRIu64
1639d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "}, {dest_fd=%" PRId64 ", dest_offset=%"PRIu64 "}",
1640d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (int64_t)argsp->info[0].dest_fd,
1641d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[0].dest_offset,
1642d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (int64_t)argsp->info[1].dest_fd,
1643d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[1].dest_offset);
1644d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (verbose)
1645d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", {dest_fd=%" PRId64 ", dest_offset=%" PRIu64 "}",
1646d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (int64_t)argsp->info[2].dest_fd,
1647d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[2].dest_offset);
1648d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	else
1649d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(", ...");
1650d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("]");
1651d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_FILE_EXTENT_SAME, argsp);
1652d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = -1 EBADF (%m)\n");
1653d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1654d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (write_ok) {
1655d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int fd1, fd2;
1656d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		char buf[16384];
1657d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1658d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		memset(buf, 0, sizeof(buf));
1659d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1660d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fd1 = openat(btrfs_test_dir_fd, "file1", O_RDWR|O_CREAT, 0600);
1661d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (fd1 < 0)
1662d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("open file1 failed");
1663d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1664d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fd2 = openat(btrfs_test_dir_fd, "file2", O_RDWR|O_CREAT, 0600);
1665d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (fd2 < 0)
1666d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("open file2 failed");
1667d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1668d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (write(fd1, buf, sizeof(buf)) < 0)
1669d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("write: fd1");
1670d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (write(fd1, buf, sizeof(buf)) < 0)
1671d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("write: fd1");
1672d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (write(fd2, buf, sizeof(buf)) < 0)
1673d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("write: fd2");
1674d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (write(fd2, buf, sizeof(buf)) < 0)
1675d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("write: fd2");
1676d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1677d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd2);
1678d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fd2 = openat(btrfs_test_dir_fd, "file2", O_RDONLY);
1679d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (fd2 < 0)
1680d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("open file2 failed");
1681d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1682d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		memset(argsp, 0, sizeof(*argsp) + sizeof(argsp->info[0]) * 3);
1683d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1684d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->src_offset = 0;
1685d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->src_length = 4096;
1686d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->dest_count = 3;
1687d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[0].dest_fd = fd2;
1688d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[0].dest_offset = 0;
1689d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[1].dest_fd = fd2;
1690d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[1].dest_offset = 10240;
1691d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[2].dest_fd = fd2;
1692d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		argsp->info[2].dest_offset = 20480;
1693d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1694d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_FILE_EXTENT_SAME or FIDEDUPERANGE, "
1695d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "{src_offset=%" PRIu64 ", src_length=%" PRIu64
1696d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       ", dest_count=%hu, info=", fd1,
1697d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->src_offset,
1698d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->src_length, argsp->dest_count);
1699d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[{dest_fd=%" PRId64 ", dest_offset=%" PRIu64
1700d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "}, {dest_fd=%" PRId64 ", dest_offset=%"PRIu64 "}",
1701d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (int64_t)argsp->info[0].dest_fd,
1702d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[0].dest_offset,
1703d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (int64_t)argsp->info[1].dest_fd,
1704d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[1].dest_offset);
1705d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose)
1706d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", {dest_fd=%" PRId64
1707d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       ", dest_offset=%" PRIu64 "}",
1708d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       (int64_t)argsp->info[2].dest_fd,
1709d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       (uint64_t)argsp->info[2].dest_offset);
1710d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		else
1711d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", ...");
1712d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1713d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(fd1, BTRFS_IOC_FILE_EXTENT_SAME, argsp);
1714d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]} => {info=");
1715d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("[{bytes_deduped=%" PRIu64 ", status=%d}, "
1716d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"{bytes_deduped=%" PRIu64 ", status=%d}",
1717d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[0].bytes_deduped,
1718d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       argsp->info[0].status,
1719d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       (uint64_t)argsp->info[1].bytes_deduped,
1720d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       argsp->info[1].status);
1721d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (verbose)
1722d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", {bytes_deduped=%" PRIu64 ", status=%d}",
1723d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       (uint64_t)argsp->info[2].bytes_deduped,
1724d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			       argsp->info[2].status);
1725d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		else
1726d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(", ...");
1727d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("]}) = 0\n");
1728d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd1);
1729d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd2);
1730d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		unlinkat(btrfs_test_dir_fd, "file1", 0);
1731d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		unlinkat(btrfs_test_dir_fd, "file2", 0);
1732d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd1);
1733d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(fd2);
1734d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1735d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	free(argsp);
1736d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* BTRFS_IOC_FILE_EXTENT_SAME */
1737d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1738d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1739d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1740d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_print_features(struct btrfs_ioctl_feature_flags *flags)
1741d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1742d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{compat_flags=");
1743d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_features_compat, flags->compat_flags,
1744d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_FEATURE_COMPAT_???");
1745d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1746d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", compat_ro_flags=");
1747d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_features_compat_ro, flags->compat_ro_flags,
1748d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_FEATURE_COMPAT_RO_???");
1749d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1750d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", incompat_flags=");
1751d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printflags(btrfs_features_incompat, flags->incompat_flags,
1752d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   "BTRFS_FEATURE_INCOMPAT_???");
1753d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}");
1754d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1755d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1756d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
1757d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes argument, returns nothing:
1758d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_SET_FEATURES
1759d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
1760d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Consumes nothing, returns argument:
1761d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_GET_FEATURES
1762d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * - BTRFS_IOC_GET_SUPPORTED_FEATURES
1763d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
1764d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1765d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_features_ioctls(void)
1766d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1767d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_feature_flags args[2] = {
1768d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{
1769d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.compat_flags = max_flags_plus_one(-1),
1770d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.incompat_flags = max_flags_plus_one(9),
1771d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.compat_ro_flags = max_flags_plus_one(0),
1772d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}, {
1773d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.compat_flags = max_flags_plus_one(-1),
1774d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.incompat_flags = max_flags_plus_one(9),
1775d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			.compat_ro_flags = max_flags_plus_one(0),
1776d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		},
1777d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1778d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct btrfs_ioctl_feature_flags supported_features[3];
1779d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1780d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_FEATURES, NULL);
1781d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_FEATURES, NULL) = -1 EBADF (%m)\n");
1782d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1783d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, BTRFS_IOC_SET_FEATURES, [");
1784d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_features(&args[0]);
1785d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf(", ");
1786d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_print_features(&args[1]);
1787d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, BTRFS_IOC_SET_FEATURES, &args);
1788d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("]) = -1 EBADF (%m)\n");
1789d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1790d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
1791d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_GET_FEATURES, ",
1792d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd);
1793d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_GET_FEATURES,
1794d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		      &supported_features);
1795d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_features(&supported_features[0]);
1796d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf(") = 0\n");
1797d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1798d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(btrfs_test_dir_fd, BTRFS_IOC_GET_SUPPORTED_FEATURES,
1799d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		      &supported_features);
1800d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(%d, BTRFS_IOC_GET_SUPPORTED_FEATURES, ",
1801d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       btrfs_test_dir_fd);
180239bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf("[");
1803d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_features(&supported_features[0]);
180439bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf(" /* supported */, ");
1805d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_features(&supported_features[1]);
180639bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf(" /* safe to set */, ");
1807d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_print_features(&supported_features[2]);
180839bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf(" /* safe to clear */]) = 0\n");
1809d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1810d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1811d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1812d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
1813d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesbtrfs_test_read_ioctls(void)
1814d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1815d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const struct xlat btrfs_read_cmd[] = {
1816d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_BALANCE_PROGRESS),
1817d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_FS_INFO),
1818d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_GET_FEATURES),
1819d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_GET_FSLABEL),
1820d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_GET_SUPPORTED_FEATURES),
1821d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_QGROUP_LIMIT),
1822d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_QUOTA_RESCAN_STATUS),
1823d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_START_SYNC),
1824d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		XLAT(BTRFS_IOC_SUBVOL_GETFLAGS),
1825d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
1826d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1827d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int i;
1828d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < ARRAY_SIZE(btrfs_read_cmd); ++i) {
1829d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(-1, (unsigned long) btrfs_read_cmd[i].val, 0);
1830d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n", btrfs_read_cmd[i].str);
1831d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1832d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1833d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1834d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint
1835d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(int argc, char *argv[])
1836d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
1837d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1838d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int opt;
1839d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int ret;
1840d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *path;
1841d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1842d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	while ((opt = getopt(argc, argv, "wv")) != -1) {
1843d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		switch (opt) {
1844d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		case 'v':
1845d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			/*
1846d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			 * These tests are incomplete, especially when
1847d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			 * printing arrays of objects are involved.
1848d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			 */
1849d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			verbose = true;
1850d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			break;
1851d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		case 'w':
1852d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			write_ok = true;
1853d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			break;
1854d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		default:
1855d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			error_msg_and_fail("usage: btrfs [-v] [-w] [path]");
1856d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
1857d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1858d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1859d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/*
1860d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * This will enable optional tests that require a valid file descriptor
1861d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 */
1862d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (optind < argc) {
1863d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		int rootfd;
1864d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct statfs sfi;
1865d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		path = argv[optind];
1866d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1867d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ret = statfs(path, &sfi);
1868d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (ret)
1869d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("statfs(%s) failed", path);
1870d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1871d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if ((unsigned) sfi.f_type != BTRFS_SUPER_MAGIC)
1872d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			error_msg_and_fail("%s is not a btrfs file system",
1873d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   path);
1874d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1875d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_test_root = path;
1876d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		rootfd = open(path, O_RDONLY|O_DIRECTORY);
1877d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (rootfd < 0)
1878d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("open(%s) failed", path);
1879d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1880d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ret = mkdirat(rootfd, "strace-test", 0755);
1881d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (ret < 0 && errno != EEXIST)
1882d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("mkdirat(strace-test) failed");
1883d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1884d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		btrfs_test_dir_fd = openat(rootfd, "strace-test",
1885d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   O_RDONLY|O_DIRECTORY);
1886d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (btrfs_test_dir_fd < 0)
1887d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_fail("openat(strace-test) failed");
1888d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		close(rootfd);
1889d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} else
1890d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		write_ok = false;
1891d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1892d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (btrfs_test_root) {
1893d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		fprintf(stderr, "Testing live ioctls on %s (%s)\n",
1894d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			btrfs_test_root, write_ok ? "read/write" : "read only");
1895d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
1896d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1897d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_read_ioctls();
1898d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_trans_ioctls();
1899d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_sync_ioctls();
1900d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_subvol_ioctls();
1901d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_balance_ioctls();
1902d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_device_ioctls();
1903d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_clone_ioctls();
1904d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_defrag_ioctls();
1905d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_search_ioctls();
1906d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_ino_lookup_ioctl();
1907d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_space_info_ioctl();
1908d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_scrub_ioctls();
1909d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_dev_info_ioctl();
1910d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_ino_path_ioctls();
1911d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_set_received_subvol_ioctl();
1912d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_send_ioctl();
1913d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_quota_ctl_ioctl();
1914d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_qgroup_assign_ioctl();
1915d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_qgroup_create_ioctl();
1916d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_quota_rescan_ioctl();
1917d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_label_ioctls();
1918d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_get_dev_stats_ioctl();
1919d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_dev_replace_ioctl();
1920d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_extent_same_ioctl();
1921d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	btrfs_test_features_ioctls();
1922d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1923d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	puts("+++ exited with 0 +++");
1924d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1925d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return 0;
1926d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
1927d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1928d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else
1929d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1930d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesSKIP_MAIN_UNDEFINED("HAVE_LINUX_BTRFS_H")
1931d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
1932d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
1933