1use nix::{
13 ioctl_none, ioctl_read, ioctl_readwrite, ioctl_write_int, ioctl_write_ptr,
14 libc::{c_char, c_int},
15};
16
17mod 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
142ioctl_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
276ioctl_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
303ioctl_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
368ioctl_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 assert_eq!(size_of::<btrfs_ioctl_vol_args>(), 4096);
404 assert_eq!(size_of::<btrfs_qgroup_limit>(), 40);
406 assert_eq!(size_of::<btrfs_qgroup_inherit>(), 72);
408 assert_eq!(size_of::<btrfs_ioctl_qgroup_limit_args>(), 48);
410 assert_eq!(size_of::<btrfs_ioctl_vol_args_v2>(), 4096);
412 assert_eq!(size_of::<btrfs_ioctl_scrub_args>(), 1024);
414 assert_eq!(size_of::<btrfs_ioctl_dev_replace_start_params>(), 2072);
416 assert_eq!(size_of::<btrfs_ioctl_dev_replace_status_params>(), 48);
418 assert_eq!(size_of::<btrfs_ioctl_dev_replace_args>(), 2600);
420 assert_eq!(size_of::<btrfs_ioctl_dev_info_args>(), 4096);
422 assert_eq!(size_of::<btrfs_ioctl_fs_info_args>(), 1024);
424 assert_eq!(size_of::<btrfs_ioctl_feature_flags>(), 24);
426 assert_eq!(size_of::<btrfs_ioctl_balance_args>(), 1024);
428 assert_eq!(size_of::<btrfs_ioctl_ino_lookup_args>(), 4096);
430 assert_eq!(size_of::<btrfs_ioctl_ino_lookup_user_args>(), 4096);
432 assert_eq!(size_of::<btrfs_ioctl_search_args_v2>(), 112);
434 assert_eq!(size_of::<btrfs_ioctl_clone_range_args>(), 32);
436 assert_eq!(size_of::<btrfs_ioctl_defrag_range_args>(), 48);
438 assert_eq!(size_of::<btrfs_ioctl_same_args>(), 24);
440 assert_eq!(size_of::<btrfs_ioctl_space_args>(), 16);
442 assert_eq!(size_of::<btrfs_ioctl_ino_path_args>(), 56);
444 assert_eq!(size_of::<btrfs_ioctl_get_dev_stats>(), 1032);
446 assert_eq!(size_of::<btrfs_ioctl_quota_ctl_args>(), 16);
448 assert_eq!(size_of::<btrfs_ioctl_quota_rescan_args>(), 64);
450 assert_eq!(size_of::<btrfs_ioctl_qgroup_create_args>(), 16);
452 assert_eq!(size_of::<btrfs_ioctl_received_subvol_args>(), 200);
454 assert_eq!(size_of::<btrfs_ioctl_received_subvol_args_32>(), 192);
456 assert_eq!(size_of::<btrfs_ioctl_send_args>(), 72);
458 assert_eq!(size_of::<btrfs_ioctl_send_args_64>(), 72);
460 assert_eq!(size_of::<btrfs_ioctl_get_subvol_rootref_args>(), 4096);
462
463 assert_eq!(size_of::<btrfs_scrub_progress>(), 120);
465 assert_eq!(size_of::<btrfs_balance_args>(), 136);
467 assert_eq!(size_of::<btrfs_balance_progress>(), 24);
469 assert_eq!(size_of::<btrfs_ioctl_search_key>(), 104);
471 assert_eq!(size_of::<btrfs_ioctl_search_header>(), 32);
473 assert_eq!(size_of::<btrfs_ioctl_search_args>(), 4096);
475 assert_eq!(size_of::<btrfs_ioctl_same_extent_info>(), 32);
477 assert_eq!(size_of::<btrfs_ioctl_space_info>(), 24);
479 assert_eq!(size_of::<btrfs_data_container>(), 16);
481 assert_eq!(size_of::<btrfs_ioctl_logical_ino_args>(), 56);
483 assert_eq!(size_of::<btrfs_ioctl_qgroup_assign_args>(), 24);
485 assert_eq!(size_of::<btrfs_ioctl_timespec>(), 16);
487 assert_eq!(size_of::<btrfs_ioctl_get_subvol_info_args>(), 504);
490 assert_eq!(size_of::<btrfs_ioctl_encoded_io_args>(), 128);
494 assert_eq!(size_of::<btrfs_ioctl_subvol_wait>(), 16);
496 }
497}