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