Skip to main content

btrfs_uapi/
raw.rs

1//! # Raw bindgen output and ioctl declarations for the btrfs UAPI
2//!
3//! The types in this module are generated automatically from
4//! `uapi/src/raw/btrfs.h` and `btrfs_tree.h` by bindgen.  The `ioctl_*!`
5//! macro declarations translate each `BTRFS_IOC_*` C macro into a callable
6//! Rust function with the correct direction and argument type.
7//!
8//! Prefer the typed wrappers in the sibling modules over using this module
9//! directly.  The functions here operate on raw bindgen structs, require
10//! `unsafe`, and do not map errno values to meaningful errors.
11
12use nix::{
13    ioctl_none, ioctl_read, ioctl_readwrite, ioctl_write_int, ioctl_write_ptr,
14    libc::{c_char, c_int},
15};
16
17// this is in a nested module so that we can suppress warnings from bindgen.
18mod bindings {
19    #![allow(warnings)]
20    include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
21}
22
23pub use bindings::*;
24
25ioctl_write_ptr!(
26    btrfs_ioc_snap_create,
27    BTRFS_IOCTL_MAGIC,
28    1,
29    btrfs_ioctl_vol_args
30);
31
32ioctl_write_ptr!(btrfs_ioc_defrag, BTRFS_IOCTL_MAGIC, 2, btrfs_ioctl_vol_args);
33
34ioctl_write_ptr!(btrfs_ioc_resize, BTRFS_IOCTL_MAGIC, 3, btrfs_ioctl_vol_args);
35
36ioctl_write_ptr!(
37    btrfs_ioc_scan_dev,
38    BTRFS_IOCTL_MAGIC,
39    4,
40    btrfs_ioctl_vol_args
41);
42
43ioctl_write_ptr!(
44    btrfs_ioc_forget_dev,
45    BTRFS_IOCTL_MAGIC,
46    5,
47    btrfs_ioctl_vol_args
48);
49
50ioctl_none!(btrfs_ioc_sync, BTRFS_IOCTL_MAGIC, 8);
51
52ioctl_write_ptr!(btrfs_ioc_clone, BTRFS_IOCTL_MAGIC, 9, c_int);
53
54ioctl_write_ptr!(
55    btrfs_ioc_add_dev,
56    BTRFS_IOCTL_MAGIC,
57    10,
58    btrfs_ioctl_vol_args
59);
60
61ioctl_write_ptr!(
62    btrfs_ioc_rm_dev,
63    BTRFS_IOCTL_MAGIC,
64    11,
65    btrfs_ioctl_vol_args
66);
67
68ioctl_write_ptr!(
69    btrfs_ioc_balance,
70    BTRFS_IOCTL_MAGIC,
71    12,
72    btrfs_ioctl_vol_args
73);
74
75ioctl_write_ptr!(
76    btrfs_ioc_clone_range,
77    BTRFS_IOCTL_MAGIC,
78    13,
79    btrfs_ioctl_clone_range_args
80);
81
82ioctl_write_ptr!(
83    btrfs_ioc_subvol_create,
84    BTRFS_IOCTL_MAGIC,
85    14,
86    btrfs_ioctl_vol_args
87);
88
89ioctl_write_ptr!(
90    btrfs_ioc_snap_destroy,
91    BTRFS_IOCTL_MAGIC,
92    15,
93    btrfs_ioctl_vol_args
94);
95
96ioctl_write_ptr!(
97    btrfs_ioc_defrag_range,
98    BTRFS_IOCTL_MAGIC,
99    16,
100    btrfs_ioctl_defrag_range_args
101);
102
103ioctl_readwrite!(
104    btrfs_ioc_tree_search,
105    BTRFS_IOCTL_MAGIC,
106    17,
107    btrfs_ioctl_search_args
108);
109
110ioctl_readwrite!(
111    btrfs_ioc_tree_search_v2,
112    BTRFS_IOCTL_MAGIC,
113    17,
114    btrfs_ioctl_search_args_v2
115);
116
117ioctl_readwrite!(
118    btrfs_ioc_ino_lookup,
119    BTRFS_IOCTL_MAGIC,
120    18,
121    btrfs_ioctl_ino_lookup_args
122);
123
124ioctl_write_ptr!(btrfs_ioc_default_subvol, BTRFS_IOCTL_MAGIC, 19, u64);
125
126ioctl_readwrite!(
127    btrfs_ioc_space_info,
128    BTRFS_IOCTL_MAGIC,
129    20,
130    btrfs_ioctl_space_args
131);
132
133ioctl_write_ptr!(btrfs_ioc_wait_sync, BTRFS_IOCTL_MAGIC, 22, u64);
134
135ioctl_write_ptr!(
136    btrfs_ioc_snap_create_v2,
137    BTRFS_IOCTL_MAGIC,
138    23,
139    btrfs_ioctl_vol_args_v2
140);
141
142// NOTE: number 24 is shared between START_SYNC (_IOR) and SUBVOL_CREATE_V2 (_IOW)
143// in the kernel header — both are translated faithfully here.
144ioctl_read!(btrfs_ioc_start_sync, BTRFS_IOCTL_MAGIC, 24, u64);
145
146ioctl_write_ptr!(
147    btrfs_ioc_subvol_create_v2,
148    BTRFS_IOCTL_MAGIC,
149    24,
150    btrfs_ioctl_vol_args_v2
151);
152
153ioctl_read!(btrfs_ioc_subvol_getflags, BTRFS_IOCTL_MAGIC, 25, u64);
154
155ioctl_write_ptr!(btrfs_ioc_subvol_setflags, BTRFS_IOCTL_MAGIC, 26, u64);
156
157ioctl_readwrite!(
158    btrfs_ioc_scrub,
159    BTRFS_IOCTL_MAGIC,
160    27,
161    btrfs_ioctl_scrub_args
162);
163
164ioctl_none!(btrfs_ioc_scrub_cancel, BTRFS_IOCTL_MAGIC, 28);
165
166ioctl_readwrite!(
167    btrfs_ioc_scrub_progress,
168    BTRFS_IOCTL_MAGIC,
169    29,
170    btrfs_ioctl_scrub_args
171);
172
173ioctl_readwrite!(
174    btrfs_ioc_dev_info,
175    BTRFS_IOCTL_MAGIC,
176    30,
177    btrfs_ioctl_dev_info_args
178);
179
180ioctl_read!(
181    btrfs_ioc_fs_info,
182    BTRFS_IOCTL_MAGIC,
183    31,
184    btrfs_ioctl_fs_info_args
185);
186
187ioctl_readwrite!(
188    btrfs_ioc_balance_v2,
189    BTRFS_IOCTL_MAGIC,
190    32,
191    btrfs_ioctl_balance_args
192);
193
194ioctl_write_int!(btrfs_ioc_balance_ctl, BTRFS_IOCTL_MAGIC, 33);
195
196ioctl_read!(
197    btrfs_ioc_balance_progress,
198    BTRFS_IOCTL_MAGIC,
199    34,
200    btrfs_ioctl_balance_args
201);
202
203ioctl_readwrite!(
204    btrfs_ioc_ino_paths,
205    BTRFS_IOCTL_MAGIC,
206    35,
207    btrfs_ioctl_ino_path_args
208);
209
210ioctl_readwrite!(
211    btrfs_ioc_logical_ino,
212    BTRFS_IOCTL_MAGIC,
213    36,
214    btrfs_ioctl_logical_ino_args
215);
216
217ioctl_readwrite!(
218    btrfs_ioc_set_received_subvol,
219    BTRFS_IOCTL_MAGIC,
220    37,
221    btrfs_ioctl_received_subvol_args
222);
223ioctl_write_ptr!(btrfs_ioc_send, BTRFS_IOCTL_MAGIC, 38, btrfs_ioctl_send_args);
224
225ioctl_read!(
226    btrfs_ioc_devices_ready,
227    BTRFS_IOCTL_MAGIC,
228    39,
229    btrfs_ioctl_vol_args
230);
231
232ioctl_readwrite!(
233    btrfs_ioc_quota_ctl,
234    BTRFS_IOCTL_MAGIC,
235    40,
236    btrfs_ioctl_quota_ctl_args
237);
238
239ioctl_write_ptr!(
240    btrfs_ioc_qgroup_assign,
241    BTRFS_IOCTL_MAGIC,
242    41,
243    btrfs_ioctl_qgroup_assign_args
244);
245
246ioctl_write_ptr!(
247    btrfs_ioc_qgroup_create,
248    BTRFS_IOCTL_MAGIC,
249    42,
250    btrfs_ioctl_qgroup_create_args
251);
252
253ioctl_read!(
254    btrfs_ioc_qgroup_limit,
255    BTRFS_IOCTL_MAGIC,
256    43,
257    btrfs_ioctl_qgroup_limit_args
258);
259
260ioctl_write_ptr!(
261    btrfs_ioc_quota_rescan,
262    BTRFS_IOCTL_MAGIC,
263    44,
264    btrfs_ioctl_quota_rescan_args
265);
266
267ioctl_read!(
268    btrfs_ioc_quota_rescan_status,
269    BTRFS_IOCTL_MAGIC,
270    45,
271    btrfs_ioctl_quota_rescan_args
272);
273
274ioctl_none!(btrfs_ioc_quota_rescan_wait, BTRFS_IOCTL_MAGIC, 46);
275
276// NOTE: GET_FSLABEL/SET_FSLABEL may alias FS_IOC_GETFSLABEL/FS_IOC_SETFSLABEL
277// on kernels that define those; these are the btrfs-native variants.
278ioctl_read!(btrfs_ioc_get_fslabel, BTRFS_IOCTL_MAGIC, 49, [c_char; 256]);
279
280ioctl_write_ptr!(btrfs_ioc_set_fslabel, BTRFS_IOCTL_MAGIC, 50, [c_char; 256]);
281
282ioctl_readwrite!(
283    btrfs_ioc_get_dev_stats,
284    BTRFS_IOCTL_MAGIC,
285    52,
286    btrfs_ioctl_get_dev_stats
287);
288
289ioctl_readwrite!(
290    btrfs_ioc_dev_replace,
291    BTRFS_IOCTL_MAGIC,
292    53,
293    btrfs_ioctl_dev_replace_args
294);
295
296ioctl_readwrite!(
297    btrfs_ioc_file_extent_same,
298    BTRFS_IOCTL_MAGIC,
299    54,
300    btrfs_ioctl_same_args
301);
302
303// NOTE: number 57 is shared among GET_FEATURES (_IOR), SET_FEATURES (_IOW),
304// and GET_SUPPORTED_FEATURES (_IOR) with array types [1], [2], [3].
305ioctl_read!(
306    btrfs_ioc_get_features,
307    BTRFS_IOCTL_MAGIC,
308    57,
309    btrfs_ioctl_feature_flags
310);
311
312ioctl_write_ptr!(
313    btrfs_ioc_set_features,
314    BTRFS_IOCTL_MAGIC,
315    57,
316    [btrfs_ioctl_feature_flags; 2]
317);
318
319ioctl_read!(
320    btrfs_ioc_get_supported_features,
321    BTRFS_IOCTL_MAGIC,
322    57,
323    [btrfs_ioctl_feature_flags; 3]
324);
325
326ioctl_write_ptr!(
327    btrfs_ioc_rm_dev_v2,
328    BTRFS_IOCTL_MAGIC,
329    58,
330    btrfs_ioctl_vol_args_v2
331);
332
333ioctl_readwrite!(
334    btrfs_ioc_logical_ino_v2,
335    BTRFS_IOCTL_MAGIC,
336    59,
337    btrfs_ioctl_logical_ino_args
338);
339
340ioctl_read!(
341    btrfs_ioc_get_subvol_info,
342    BTRFS_IOCTL_MAGIC,
343    60,
344    btrfs_ioctl_get_subvol_info_args
345);
346
347ioctl_readwrite!(
348    btrfs_ioc_get_subvol_rootref,
349    BTRFS_IOCTL_MAGIC,
350    61,
351    btrfs_ioctl_get_subvol_rootref_args
352);
353
354ioctl_readwrite!(
355    btrfs_ioc_ino_lookup_user,
356    BTRFS_IOCTL_MAGIC,
357    62,
358    btrfs_ioctl_ino_lookup_user_args
359);
360
361ioctl_write_ptr!(
362    btrfs_ioc_snap_destroy_v2,
363    BTRFS_IOCTL_MAGIC,
364    63,
365    btrfs_ioctl_vol_args_v2
366);
367
368// NOTE: number 64 is shared between ENCODED_READ (_IOR) and ENCODED_WRITE (_IOW).
369ioctl_read!(
370    btrfs_ioc_encoded_read,
371    BTRFS_IOCTL_MAGIC,
372    64,
373    btrfs_ioctl_encoded_io_args
374);
375
376ioctl_write_ptr!(
377    btrfs_ioc_encoded_write,
378    BTRFS_IOCTL_MAGIC,
379    64,
380    btrfs_ioctl_encoded_io_args
381);
382
383ioctl_write_ptr!(
384    btrfs_ioc_subvol_sync_wait,
385    BTRFS_IOCTL_MAGIC,
386    65,
387    btrfs_ioctl_subvol_wait
388);
389
390#[cfg(test)]
391mod size_tests {
392    use super::*;
393    use std::mem::size_of;
394
395    #[test]
396    #[cfg(target_pointer_width = "64")]
397    fn assert_struct_sizes() {
398        // Sizes marked [H] are taken directly from _static_assert() in btrfs.h.
399        // Sizes marked [C] are computed from the field layout.
400        // Structs with flexible array members are tested without the array.
401
402        // [H] btrfs_ioctl_vol_args: s64 fd + char name[4087] = 4096
403        assert_eq!(size_of::<btrfs_ioctl_vol_args>(), 4096);
404        // [H] btrfs_qgroup_limit: 5 x u64 = 40
405        assert_eq!(size_of::<btrfs_qgroup_limit>(), 40);
406        // [H] btrfs_qgroup_inherit: base fields only (qgroups[] excluded) = 72
407        assert_eq!(size_of::<btrfs_qgroup_inherit>(), 72);
408        // [H] btrfs_ioctl_qgroup_limit_args: u64 + btrfs_qgroup_limit(40) = 48
409        assert_eq!(size_of::<btrfs_ioctl_qgroup_limit_args>(), 48);
410        // [H] btrfs_ioctl_vol_args_v2 = 4096
411        assert_eq!(size_of::<btrfs_ioctl_vol_args_v2>(), 4096);
412        // [H] btrfs_ioctl_scrub_args = 1024
413        assert_eq!(size_of::<btrfs_ioctl_scrub_args>(), 1024);
414        // [H] btrfs_ioctl_dev_replace_start_params = 2072
415        assert_eq!(size_of::<btrfs_ioctl_dev_replace_start_params>(), 2072);
416        // [H] btrfs_ioctl_dev_replace_status_params: 6 x u64 = 48
417        assert_eq!(size_of::<btrfs_ioctl_dev_replace_status_params>(), 48);
418        // [H] btrfs_ioctl_dev_replace_args = 2600
419        assert_eq!(size_of::<btrfs_ioctl_dev_replace_args>(), 2600);
420        // [H] btrfs_ioctl_dev_info_args = 4096
421        assert_eq!(size_of::<btrfs_ioctl_dev_info_args>(), 4096);
422        // [H] btrfs_ioctl_fs_info_args = 1024
423        assert_eq!(size_of::<btrfs_ioctl_fs_info_args>(), 1024);
424        // [H] btrfs_ioctl_feature_flags: 3 x u64 = 24
425        assert_eq!(size_of::<btrfs_ioctl_feature_flags>(), 24);
426        // [H] btrfs_ioctl_balance_args = 1024
427        assert_eq!(size_of::<btrfs_ioctl_balance_args>(), 1024);
428        // [H] btrfs_ioctl_ino_lookup_args = 4096
429        assert_eq!(size_of::<btrfs_ioctl_ino_lookup_args>(), 4096);
430        // [H] btrfs_ioctl_ino_lookup_user_args = 4096
431        assert_eq!(size_of::<btrfs_ioctl_ino_lookup_user_args>(), 4096);
432        // [H] btrfs_ioctl_search_args_v2: base fields only (buf[] excluded) = 112
433        assert_eq!(size_of::<btrfs_ioctl_search_args_v2>(), 112);
434        // [H] btrfs_ioctl_clone_range_args: s64 + 3 x u64 = 32
435        assert_eq!(size_of::<btrfs_ioctl_clone_range_args>(), 32);
436        // [H] btrfs_ioctl_defrag_range_args = 48
437        assert_eq!(size_of::<btrfs_ioctl_defrag_range_args>(), 48);
438        // [H] btrfs_ioctl_same_args: base fields only (info[] excluded) = 24
439        assert_eq!(size_of::<btrfs_ioctl_same_args>(), 24);
440        // [H] btrfs_ioctl_space_args: base fields only (spaces[] excluded) = 16
441        assert_eq!(size_of::<btrfs_ioctl_space_args>(), 16);
442        // [H] btrfs_ioctl_ino_path_args: inum + size + reserved[4] + fspath = 56
443        assert_eq!(size_of::<btrfs_ioctl_ino_path_args>(), 56);
444        // [H] btrfs_ioctl_get_dev_stats = 1032
445        assert_eq!(size_of::<btrfs_ioctl_get_dev_stats>(), 1032);
446        // [H] btrfs_ioctl_quota_ctl_args: 2 x u64 = 16
447        assert_eq!(size_of::<btrfs_ioctl_quota_ctl_args>(), 16);
448        // [H] btrfs_ioctl_quota_rescan_args: flags + progress + reserved[6] = 64
449        assert_eq!(size_of::<btrfs_ioctl_quota_rescan_args>(), 64);
450        // [H] btrfs_ioctl_qgroup_create_args: 2 x u64 = 16
451        assert_eq!(size_of::<btrfs_ioctl_qgroup_create_args>(), 16);
452        // [H] btrfs_ioctl_received_subvol_args = 200
453        assert_eq!(size_of::<btrfs_ioctl_received_subvol_args>(), 200);
454        // [H] btrfs_ioctl_received_subvol_args_32 (packed) = 192
455        assert_eq!(size_of::<btrfs_ioctl_received_subvol_args_32>(), 192);
456        // [H] btrfs_ioctl_send_args: 72 on 64-bit (sizeof(__u64 *) == 8)
457        assert_eq!(size_of::<btrfs_ioctl_send_args>(), 72);
458        // [H] btrfs_ioctl_send_args_64 (packed) = 72
459        assert_eq!(size_of::<btrfs_ioctl_send_args_64>(), 72);
460        // [H] btrfs_ioctl_get_subvol_rootref_args = 4096
461        assert_eq!(size_of::<btrfs_ioctl_get_subvol_rootref_args>(), 4096);
462
463        // [C] btrfs_scrub_progress: 15 x u64 = 120
464        assert_eq!(size_of::<btrfs_scrub_progress>(), 120);
465        // [C] btrfs_balance_args (packed): 10 x u64 + 2 x u32 + 6 x u64 = 136
466        assert_eq!(size_of::<btrfs_balance_args>(), 136);
467        // [C] btrfs_balance_progress: 3 x u64 = 24
468        assert_eq!(size_of::<btrfs_balance_progress>(), 24);
469        // [C] btrfs_ioctl_search_key: 7 x u64 + 4 x u32 + 4 x u64 = 104
470        assert_eq!(size_of::<btrfs_ioctl_search_key>(), 104);
471        // [C] btrfs_ioctl_search_header: 3 x u64 + 2 x u32 = 32
472        assert_eq!(size_of::<btrfs_ioctl_search_header>(), 32);
473        // [C] btrfs_ioctl_search_args: key(104) + buf[3992] = 4096
474        assert_eq!(size_of::<btrfs_ioctl_search_args>(), 4096);
475        // [C] btrfs_ioctl_same_extent_info: s64 + 2 x u64 + s32 + u32 = 32
476        assert_eq!(size_of::<btrfs_ioctl_same_extent_info>(), 32);
477        // [C] btrfs_ioctl_space_info: 3 x u64 = 24
478        assert_eq!(size_of::<btrfs_ioctl_space_info>(), 24);
479        // [C] btrfs_data_container: 4 x u32 = 16
480        assert_eq!(size_of::<btrfs_data_container>(), 16);
481        // [C] btrfs_ioctl_logical_ino_args: logical + size + reserved[3] + flags + inodes = 7 x u64 = 56
482        assert_eq!(size_of::<btrfs_ioctl_logical_ino_args>(), 56);
483        // [C] btrfs_ioctl_qgroup_assign_args: 3 x u64 = 24
484        assert_eq!(size_of::<btrfs_ioctl_qgroup_assign_args>(), 24);
485        // [C] btrfs_ioctl_timespec: u64 + u32 + 4 bytes padding = 16
486        assert_eq!(size_of::<btrfs_ioctl_timespec>(), 16);
487        // [C] btrfs_ioctl_get_subvol_info_args: treeid(8) + name[256] + 4 x u64
488        //     + 3 x uuid[16] + 4 x u64 + 4 x timespec(16) + reserved[8](64) = 504
489        assert_eq!(size_of::<btrfs_ioctl_get_subvol_info_args>(), 504);
490        // [C] btrfs_ioctl_encoded_io_args: *iov(8) + iovcnt(8) + offset(8) + flags(8)
491        //     + len(8) + unencoded_len(8) + unencoded_offset(8) + compression(4)
492        //     + encryption(4) + reserved[64] = 128
493        assert_eq!(size_of::<btrfs_ioctl_encoded_io_args>(), 128);
494        // [C] btrfs_ioctl_subvol_wait: u64 + u32 + u32 = 16
495        assert_eq!(size_of::<btrfs_ioctl_subvol_wait>(), 16);
496    }
497}