1 /* 2 * Copyright (C) 2007 Oracle. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public 6 * License v2 as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 * General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public 14 * License along with this program; if not, write to the 15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 * Boston, MA 021110-1307, USA. 17 */ 18 19 #ifndef __IOCTL_ 20 #define __IOCTL_ 21 #include <linux/ioctl.h> 22 23 #define BTRFS_IOCTL_MAGIC 0x94 24 #define BTRFS_VOL_NAME_MAX 255 25 26 /* this should be 4k */ 27 #define BTRFS_PATH_NAME_MAX 4087 28 struct btrfs_ioctl_vol_args { 29 __s64 fd; 30 char name[BTRFS_PATH_NAME_MAX + 1]; 31 }; 32 33 #define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0) 34 #define BTRFS_SUBVOL_RDONLY (1ULL << 1) 35 #define BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2) 36 #define BTRFS_FSID_SIZE 16 37 #define BTRFS_UUID_SIZE 16 38 39 #define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0) 40 41 struct btrfs_qgroup_limit { 42 __u64 flags; 43 __u64 max_rfer; 44 __u64 max_excl; 45 __u64 rsv_rfer; 46 __u64 rsv_excl; 47 }; 48 49 struct btrfs_qgroup_inherit { 50 __u64 flags; 51 __u64 num_qgroups; 52 __u64 num_ref_copies; 53 __u64 num_excl_copies; 54 struct btrfs_qgroup_limit lim; 55 __u64 qgroups[0]; 56 }; 57 58 struct btrfs_ioctl_qgroup_limit_args { 59 __u64 qgroupid; 60 struct btrfs_qgroup_limit lim; 61 }; 62 63 #define BTRFS_SUBVOL_NAME_MAX 4039 64 struct btrfs_ioctl_vol_args_v2 { 65 __s64 fd; 66 __u64 transid; 67 __u64 flags; 68 union { 69 struct { 70 __u64 size; 71 struct btrfs_qgroup_inherit __user *qgroup_inherit; 72 }; 73 __u64 unused[4]; 74 }; 75 char name[BTRFS_SUBVOL_NAME_MAX + 1]; 76 }; 77 78 /* 79 * structure to report errors and progress to userspace, either as a 80 * result of a finished scrub, a canceled scrub or a progress inquiry 81 */ 82 struct btrfs_scrub_progress { 83 __u64 data_extents_scrubbed; /* # of data extents scrubbed */ 84 __u64 tree_extents_scrubbed; /* # of tree extents scrubbed */ 85 __u64 data_bytes_scrubbed; /* # of data bytes scrubbed */ 86 __u64 tree_bytes_scrubbed; /* # of tree bytes scrubbed */ 87 __u64 read_errors; /* # of read errors encountered (EIO) */ 88 __u64 csum_errors; /* # of failed csum checks */ 89 __u64 verify_errors; /* # of occurences, where the metadata 90 * of a tree block did not match the 91 * expected values, like generation or 92 * logical */ 93 __u64 no_csum; /* # of 4k data block for which no csum 94 * is present, probably the result of 95 * data written with nodatasum */ 96 __u64 csum_discards; /* # of csum for which no data was found 97 * in the extent tree. */ 98 __u64 super_errors; /* # of bad super blocks encountered */ 99 __u64 malloc_errors; /* # of internal kmalloc errors. These 100 * will likely cause an incomplete 101 * scrub */ 102 __u64 uncorrectable_errors; /* # of errors where either no intact 103 * copy was found or the writeback 104 * failed */ 105 __u64 corrected_errors; /* # of errors corrected */ 106 __u64 last_physical; /* last physical address scrubbed. In 107 * case a scrub was aborted, this can 108 * be used to restart the scrub */ 109 __u64 unverified_errors; /* # of occurences where a read for a 110 * full (64k) bio failed, but the re- 111 * check succeeded for each 4k piece. 112 * Intermittent error. */ 113 }; 114 115 #define BTRFS_SCRUB_READONLY 1 116 struct btrfs_ioctl_scrub_args { 117 __u64 devid; /* in */ 118 __u64 start; /* in */ 119 __u64 end; /* in */ 120 __u64 flags; /* in */ 121 struct btrfs_scrub_progress progress; /* out */ 122 /* pad to 1k */ 123 __u64 unused[(1024-32-sizeof(struct btrfs_scrub_progress))/8]; 124 }; 125 126 #define BTRFS_DEVICE_PATH_NAME_MAX 1024 127 struct btrfs_ioctl_dev_info_args { 128 __u64 devid; /* in/out */ 129 __u8 uuid[BTRFS_UUID_SIZE]; /* in/out */ 130 __u64 bytes_used; /* out */ 131 __u64 total_bytes; /* out */ 132 __u64 unused[379]; /* pad to 4k */ 133 __u8 path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */ 134 }; 135 136 struct btrfs_ioctl_fs_info_args { 137 __u64 max_id; /* out */ 138 __u64 num_devices; /* out */ 139 __u8 fsid[BTRFS_FSID_SIZE]; /* out */ 140 __u64 reserved[124]; /* pad to 1k */ 141 }; 142 143 /* balance control ioctl modes */ 144 #define BTRFS_BALANCE_CTL_PAUSE 1 145 #define BTRFS_BALANCE_CTL_CANCEL 2 146 147 /* 148 * this is packed, because it should be exactly the same as its disk 149 * byte order counterpart (struct btrfs_disk_balance_args) 150 */ 151 struct btrfs_balance_args { 152 __u64 profiles; 153 __u64 usage; 154 __u64 devid; 155 __u64 pstart; 156 __u64 pend; 157 __u64 vstart; 158 __u64 vend; 159 160 __u64 target; 161 162 __u64 flags; 163 164 __u64 unused[8]; 165 } __attribute__ ((__packed__)); 166 167 /* report balance progress to userspace */ 168 struct btrfs_balance_progress { 169 __u64 expected; /* estimated # of chunks that will be 170 * relocated to fulfill the request */ 171 __u64 considered; /* # of chunks we have considered so far */ 172 __u64 completed; /* # of chunks relocated so far */ 173 }; 174 175 #define BTRFS_BALANCE_STATE_RUNNING (1ULL << 0) 176 #define BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1) 177 #define BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2) 178 179 struct btrfs_ioctl_balance_args { 180 __u64 flags; /* in/out */ 181 __u64 state; /* out */ 182 183 struct btrfs_balance_args data; /* in/out */ 184 struct btrfs_balance_args meta; /* in/out */ 185 struct btrfs_balance_args sys; /* in/out */ 186 187 struct btrfs_balance_progress stat; /* out */ 188 189 __u64 unused[72]; /* pad to 1k */ 190 }; 191 192 #define BTRFS_INO_LOOKUP_PATH_MAX 4080 193 struct btrfs_ioctl_ino_lookup_args { 194 __u64 treeid; 195 __u64 objectid; 196 char name[BTRFS_INO_LOOKUP_PATH_MAX]; 197 }; 198 199 struct btrfs_ioctl_search_key { 200 /* which root are we searching. 0 is the tree of tree roots */ 201 __u64 tree_id; 202 203 /* keys returned will be >= min and <= max */ 204 __u64 min_objectid; 205 __u64 max_objectid; 206 207 /* keys returned will be >= min and <= max */ 208 __u64 min_offset; 209 __u64 max_offset; 210 211 /* max and min transids to search for */ 212 __u64 min_transid; 213 __u64 max_transid; 214 215 /* keys returned will be >= min and <= max */ 216 __u32 min_type; 217 __u32 max_type; 218 219 /* 220 * how many items did userland ask for, and how many are we 221 * returning 222 */ 223 __u32 nr_items; 224 225 /* align to 64 bits */ 226 __u32 unused; 227 228 /* some extra for later */ 229 __u64 unused1; 230 __u64 unused2; 231 __u64 unused3; 232 __u64 unused4; 233 }; 234 235 struct btrfs_ioctl_search_header { 236 __u64 transid; 237 __u64 objectid; 238 __u64 offset; 239 __u32 type; 240 __u32 len; 241 }; 242 243 #define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key)) 244 /* 245 * the buf is an array of search headers where 246 * each header is followed by the actual item 247 * the type field is expanded to 32 bits for alignment 248 */ 249 struct btrfs_ioctl_search_args { 250 struct btrfs_ioctl_search_key key; 251 char buf[BTRFS_SEARCH_ARGS_BUFSIZE]; 252 }; 253 254 struct btrfs_ioctl_clone_range_args { 255 __s64 src_fd; 256 __u64 src_offset, src_length; 257 __u64 dest_offset; 258 }; 259 260 /* flags for the defrag range ioctl */ 261 #define BTRFS_DEFRAG_RANGE_COMPRESS 1 262 #define BTRFS_DEFRAG_RANGE_START_IO 2 263 264 struct btrfs_ioctl_space_info { 265 __u64 flags; 266 __u64 total_bytes; 267 __u64 used_bytes; 268 }; 269 270 struct btrfs_ioctl_space_args { 271 __u64 space_slots; 272 __u64 total_spaces; 273 struct btrfs_ioctl_space_info spaces[0]; 274 }; 275 276 struct btrfs_data_container { 277 __u32 bytes_left; /* out -- bytes not needed to deliver output */ 278 __u32 bytes_missing; /* out -- additional bytes needed for result */ 279 __u32 elem_cnt; /* out */ 280 __u32 elem_missed; /* out */ 281 __u64 val[0]; /* out */ 282 }; 283 284 struct btrfs_ioctl_ino_path_args { 285 __u64 inum; /* in */ 286 __u64 size; /* in */ 287 __u64 reserved[4]; 288 /* struct btrfs_data_container *fspath; out */ 289 __u64 fspath; /* out */ 290 }; 291 292 struct btrfs_ioctl_logical_ino_args { 293 __u64 logical; /* in */ 294 __u64 size; /* in */ 295 __u64 reserved[4]; 296 /* struct btrfs_data_container *inodes; out */ 297 __u64 inodes; 298 }; 299 300 enum btrfs_dev_stat_values { 301 /* disk I/O failure stats */ 302 BTRFS_DEV_STAT_WRITE_ERRS, /* EIO or EREMOTEIO from lower layers */ 303 BTRFS_DEV_STAT_READ_ERRS, /* EIO or EREMOTEIO from lower layers */ 304 BTRFS_DEV_STAT_FLUSH_ERRS, /* EIO or EREMOTEIO from lower layers */ 305 306 /* stats for indirect indications for I/O failures */ 307 BTRFS_DEV_STAT_CORRUPTION_ERRS, /* checksum error, bytenr error or 308 * contents is illegal: this is an 309 * indication that the block was damaged 310 * during read or write, or written to 311 * wrong location or read from wrong 312 * location */ 313 BTRFS_DEV_STAT_GENERATION_ERRS, /* an indication that blocks have not 314 * been written */ 315 316 BTRFS_DEV_STAT_VALUES_MAX 317 }; 318 319 /* Reset statistics after reading; needs SYS_ADMIN capability */ 320 #define BTRFS_DEV_STATS_RESET (1ULL << 0) 321 322 struct btrfs_ioctl_get_dev_stats { 323 __u64 devid; /* in */ 324 __u64 nr_items; /* in/out */ 325 __u64 flags; /* in/out */ 326 327 /* out values: */ 328 __u64 values[BTRFS_DEV_STAT_VALUES_MAX]; 329 330 __u64 unused[128 - 2 - BTRFS_DEV_STAT_VALUES_MAX]; /* pad to 1k */ 331 }; 332 333 #define BTRFS_QUOTA_CTL_ENABLE 1 334 #define BTRFS_QUOTA_CTL_DISABLE 2 335 #define BTRFS_QUOTA_CTL_RESCAN 3 336 struct btrfs_ioctl_quota_ctl_args { 337 __u64 cmd; 338 __u64 status; 339 }; 340 341 struct btrfs_ioctl_qgroup_assign_args { 342 __u64 assign; 343 __u64 src; 344 __u64 dst; 345 }; 346 347 struct btrfs_ioctl_qgroup_create_args { 348 __u64 create; 349 __u64 qgroupid; 350 }; 351 struct btrfs_ioctl_timespec { 352 __u64 sec; 353 __u32 nsec; 354 }; 355 356 struct btrfs_ioctl_received_subvol_args { 357 char uuid[BTRFS_UUID_SIZE]; /* in */ 358 __u64 stransid; /* in */ 359 __u64 rtransid; /* out */ 360 struct btrfs_ioctl_timespec stime; /* in */ 361 struct btrfs_ioctl_timespec rtime; /* out */ 362 __u64 flags; /* in */ 363 __u64 reserved[16]; /* in */ 364 }; 365 366 struct btrfs_ioctl_send_args { 367 __s64 send_fd; /* in */ 368 __u64 clone_sources_count; /* in */ 369 __u64 __user *clone_sources; /* in */ 370 __u64 parent_root; /* in */ 371 __u64 flags; /* in */ 372 __u64 reserved[4]; /* in */ 373 }; 374 375 #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ 376 struct btrfs_ioctl_vol_args) 377 #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ 378 struct btrfs_ioctl_vol_args) 379 #define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, \ 380 struct btrfs_ioctl_vol_args) 381 #define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \ 382 struct btrfs_ioctl_vol_args) 383 /* trans start and trans end are dangerous, and only for 384 * use by applications that know how to avoid the 385 * resulting deadlocks 386 */ 387 #define BTRFS_IOC_TRANS_START _IO(BTRFS_IOCTL_MAGIC, 6) 388 #define BTRFS_IOC_TRANS_END _IO(BTRFS_IOCTL_MAGIC, 7) 389 #define BTRFS_IOC_SYNC _IO(BTRFS_IOCTL_MAGIC, 8) 390 391 #define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int) 392 #define BTRFS_IOC_ADD_DEV _IOW(BTRFS_IOCTL_MAGIC, 10, \ 393 struct btrfs_ioctl_vol_args) 394 #define BTRFS_IOC_RM_DEV _IOW(BTRFS_IOCTL_MAGIC, 11, \ 395 struct btrfs_ioctl_vol_args) 396 #define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \ 397 struct btrfs_ioctl_vol_args) 398 399 #define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \ 400 struct btrfs_ioctl_clone_range_args) 401 402 #define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, \ 403 struct btrfs_ioctl_vol_args) 404 #define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, \ 405 struct btrfs_ioctl_vol_args) 406 #define BTRFS_IOC_DEFRAG_RANGE _IOW(BTRFS_IOCTL_MAGIC, 16, \ 407 struct btrfs_ioctl_defrag_range_args) 408 #define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \ 409 struct btrfs_ioctl_search_args) 410 #define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \ 411 struct btrfs_ioctl_ino_lookup_args) 412 #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) 413 #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ 414 struct btrfs_ioctl_space_args) 415 #define BTRFS_IOC_START_SYNC _IOR(BTRFS_IOCTL_MAGIC, 24, __u64) 416 #define BTRFS_IOC_WAIT_SYNC _IOW(BTRFS_IOCTL_MAGIC, 22, __u64) 417 #define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \ 418 struct btrfs_ioctl_vol_args_v2) 419 #define BTRFS_IOC_SUBVOL_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 24, \ 420 struct btrfs_ioctl_vol_args_v2) 421 #define BTRFS_IOC_SUBVOL_GETFLAGS _IOR(BTRFS_IOCTL_MAGIC, 25, __u64) 422 #define BTRFS_IOC_SUBVOL_SETFLAGS _IOW(BTRFS_IOCTL_MAGIC, 26, __u64) 423 #define BTRFS_IOC_SCRUB _IOWR(BTRFS_IOCTL_MAGIC, 27, \ 424 struct btrfs_ioctl_scrub_args) 425 #define BTRFS_IOC_SCRUB_CANCEL _IO(BTRFS_IOCTL_MAGIC, 28) 426 #define BTRFS_IOC_SCRUB_PROGRESS _IOWR(BTRFS_IOCTL_MAGIC, 29, \ 427 struct btrfs_ioctl_scrub_args) 428 #define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \ 429 struct btrfs_ioctl_dev_info_args) 430 #define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \ 431 struct btrfs_ioctl_fs_info_args) 432 #define BTRFS_IOC_BALANCE_V2 _IOWR(BTRFS_IOCTL_MAGIC, 32, \ 433 struct btrfs_ioctl_balance_args) 434 #define BTRFS_IOC_BALANCE_CTL _IOW(BTRFS_IOCTL_MAGIC, 33, int) 435 #define BTRFS_IOC_BALANCE_PROGRESS _IOR(BTRFS_IOCTL_MAGIC, 34, \ 436 struct btrfs_ioctl_balance_args) 437 #define BTRFS_IOC_INO_PATHS _IOWR(BTRFS_IOCTL_MAGIC, 35, \ 438 struct btrfs_ioctl_ino_path_args) 439 #define BTRFS_IOC_LOGICAL_INO _IOWR(BTRFS_IOCTL_MAGIC, 36, \ 440 struct btrfs_ioctl_ino_path_args) 441 #define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, \ 442 struct btrfs_ioctl_received_subvol_args) 443 #define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args) 444 #define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \ 445 struct btrfs_ioctl_vol_args) 446 #define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, \ 447 struct btrfs_ioctl_quota_ctl_args) 448 #define BTRFS_IOC_QGROUP_ASSIGN _IOW(BTRFS_IOCTL_MAGIC, 41, \ 449 struct btrfs_ioctl_qgroup_assign_args) 450 #define BTRFS_IOC_QGROUP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 42, \ 451 struct btrfs_ioctl_qgroup_create_args) 452 #define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, \ 453 struct btrfs_ioctl_qgroup_limit_args) 454 #define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ 455 struct btrfs_ioctl_get_dev_stats) 456 #endif 457