razor_libzfscore/
lib.rs

1#![cfg_attr(feature = "pedantic", warn(clippy::pedantic))]
2#![warn(clippy::use_self)]
3#![warn(clippy::map_flatten)]
4#![warn(clippy::map_unwrap_or)]
5#![warn(deprecated_in_future)]
6#![warn(future_incompatible)]
7#![warn(noop_method_call)]
8#![warn(unreachable_pub)]
9#![warn(missing_debug_implementations)]
10#![warn(rust_2018_compatibility)]
11#![warn(rust_2021_compatibility)]
12#![warn(rust_2018_idioms)]
13#![warn(unused)]
14#![allow(clippy::missing_safety_doc)]
15#![allow(clippy::too_many_arguments)]
16#![deny(warnings)]
17
18use std::ptr;
19
20use once_cell::sync::Lazy;
21
22use razor_libnvpair as libnvpair;
23use razor_libzfscore_sys as sys;
24
25pub use sys::dmu_replay_record;
26pub use sys::lzc_dataset_type;
27pub use sys::lzc_send_flags;
28pub use sys::pool_initialize_func_t;
29pub use sys::pool_trim_func_t;
30
31#[cfg(feature = "wait")]
32pub use sys::zfs_wait_activity_t;
33
34mod lzc;
35
36pub unsafe fn lzc_snapshot(
37    snaps: *mut libnvpair::nvlist_t,
38    props: *mut libnvpair::nvlist_t,
39    errlist: *mut *mut libnvpair::nvlist_t,
40) -> libc::c_int {
41    Lazy::force(&lzc::LIBZFS_CORE);
42    sys::lzc_snapshot(snaps, props, errlist)
43}
44
45pub unsafe fn lzc_create(
46    name: *const libc::c_char,
47    dataset_type: sys::lzc_dataset_type,
48    props: *mut libnvpair::nvlist_t,
49) -> libc::c_int {
50    Lazy::force(&lzc::LIBZFS_CORE);
51    let wkeydata = ptr::null_mut();
52    let wkeylen = 0;
53    sys::lzc_create(name, dataset_type, props, wkeydata, wkeylen)
54}
55
56pub unsafe fn lzc_clone(
57    fsname: *const libc::c_char,
58    origin: *const libc::c_char,
59    props: *mut libnvpair::nvlist_t,
60) -> libc::c_int {
61    Lazy::force(&lzc::LIBZFS_CORE);
62    sys::lzc_clone(fsname, origin, props)
63}
64
65pub unsafe fn lzc_promote(
66    fsname: *const libc::c_char,
67    snapnamebuf: *mut libc::c_char,
68    snapnamelen: libc::c_int,
69) -> libc::c_int {
70    Lazy::force(&lzc::LIBZFS_CORE);
71    sys::lzc_promote(fsname, snapnamebuf, snapnamelen)
72}
73
74pub unsafe fn lzc_destroy_snaps(
75    snaps: *mut libnvpair::nvlist_t,
76    defer: impl Into<libnvpair::boolean_t>,
77    errlist: *mut *mut libnvpair::nvlist_t,
78) -> libc::c_int {
79    Lazy::force(&lzc::LIBZFS_CORE);
80    let defer = defer.into();
81    sys::lzc_destroy_snaps(snaps, defer, errlist)
82}
83
84pub unsafe fn lzc_bookmark(
85    bookmarks: *mut libnvpair::nvlist_t,
86    errlist: *mut *mut libnvpair::nvlist_t,
87) -> libc::c_int {
88    Lazy::force(&lzc::LIBZFS_CORE);
89    sys::lzc_bookmark(bookmarks, errlist)
90}
91
92pub unsafe fn lzc_get_bookmarks(
93    fsname: *const libc::c_char,
94    props: *mut libnvpair::nvlist_t,
95    bookmarks: *mut *mut libnvpair::nvlist_t,
96) -> libc::c_int {
97    Lazy::force(&lzc::LIBZFS_CORE);
98    sys::lzc_get_bookmarks(fsname, props, bookmarks)
99}
100
101pub unsafe fn lzc_get_bookmark_props(
102    bookmark: *const libc::c_char,
103    props: *mut *mut libnvpair::nvlist_t,
104) -> libc::c_int {
105    Lazy::force(&lzc::LIBZFS_CORE);
106    sys::lzc_get_bookmark_props(bookmark, props)
107}
108
109pub unsafe fn lzc_destroy_bookmarks(
110    bookmarks: *mut libnvpair::nvlist_t,
111    errlist: *mut *mut libnvpair::nvlist_t,
112) -> libc::c_int {
113    Lazy::force(&lzc::LIBZFS_CORE);
114    sys::lzc_destroy_bookmarks(bookmarks, errlist)
115}
116
117pub unsafe fn lzc_load_key(
118    fsname: *const libc::c_char,
119    noop: impl Into<libnvpair::boolean_t>,
120    wkeydata: *mut u8,
121    wkeylen: libc::c_uint,
122) -> libc::c_int {
123    Lazy::force(&lzc::LIBZFS_CORE);
124    let noop = noop.into();
125    sys::lzc_load_key(fsname, noop, wkeydata, wkeylen)
126}
127
128pub unsafe fn lzc_unload_key(fsname: *const libc::c_char) -> libc::c_int {
129    Lazy::force(&lzc::LIBZFS_CORE);
130    sys::lzc_unload_key(fsname)
131}
132
133pub unsafe fn lzc_change_key(
134    fsname: *const libc::c_char,
135    cryptcmd: u64,
136    props: *mut libnvpair::nvlist_t,
137    wkeydata: *mut u8,
138    wkeylen: libc::c_uint,
139) -> libc::c_int {
140    Lazy::force(&lzc::LIBZFS_CORE);
141    sys::lzc_change_key(fsname, cryptcmd, props, wkeydata, wkeylen)
142}
143
144pub unsafe fn lzc_initialize(
145    poolname: *const libc::c_char,
146    cmd_type: pool_initialize_func_t,
147    vdevs: *mut libnvpair::nvlist_t,
148    errlist: *mut *mut libnvpair::nvlist_t,
149) -> libc::c_int {
150    Lazy::force(&lzc::LIBZFS_CORE);
151    sys::lzc_initialize(poolname, cmd_type, vdevs, errlist)
152}
153
154pub unsafe fn lzc_trim(
155    poolname: *const libc::c_char,
156    cmd_type: pool_trim_func_t,
157    rate: u64,
158    secure: impl Into<libnvpair::boolean_t>,
159    vdevs: *mut libnvpair::nvlist_t,
160    errlist: *mut *mut libnvpair::nvlist_t,
161) -> libc::c_int {
162    Lazy::force(&lzc::LIBZFS_CORE);
163    let secure = secure.into();
164    sys::lzc_trim(poolname, cmd_type, rate, secure, vdevs, errlist)
165}
166
167pub unsafe fn lzc_redact(
168    snapshot: *const libc::c_char,
169    bookname: *const libc::c_char,
170    snapnv: *mut libnvpair::nvlist_t,
171) -> libc::c_int {
172    Lazy::force(&lzc::LIBZFS_CORE);
173    sys::lzc_redact(snapshot, bookname, snapnv)
174}
175
176pub unsafe fn lzc_snaprange_space(
177    firstsnap: *const libc::c_char,
178    lastsnap: *const libc::c_char,
179    usedp: *mut u64,
180) -> libc::c_int {
181    Lazy::force(&lzc::LIBZFS_CORE);
182    sys::lzc_snaprange_space(firstsnap, lastsnap, usedp)
183}
184
185pub unsafe fn lzc_hold(
186    holds: *mut libnvpair::nvlist_t,
187    cleanup_fd: libc::c_int,
188    errlist: *mut *mut libnvpair::nvlist_t,
189) -> libc::c_int {
190    Lazy::force(&lzc::LIBZFS_CORE);
191    sys::lzc_hold(holds, cleanup_fd, errlist)
192}
193
194pub unsafe fn lzc_release(
195    holds: *mut libnvpair::nvlist_t,
196    errlist: *mut *mut libnvpair::nvlist_t,
197) -> libc::c_int {
198    Lazy::force(&lzc::LIBZFS_CORE);
199    sys::lzc_release(holds, errlist)
200}
201
202pub unsafe fn lzc_get_holds(
203    snapname: *const libc::c_char,
204    holdsp: *mut *mut libnvpair::nvlist_t,
205) -> libc::c_int {
206    Lazy::force(&lzc::LIBZFS_CORE);
207    sys::lzc_get_holds(snapname, holdsp)
208}
209
210pub unsafe fn lzc_destroy(name: *const libc::c_char) -> libc::c_int {
211    Lazy::force(&lzc::LIBZFS_CORE);
212    sys::lzc_destroy(name)
213}
214
215pub unsafe fn lzc_exists(name: *const libc::c_char) -> bool {
216    Lazy::force(&lzc::LIBZFS_CORE);
217    sys::lzc_exists(name).into()
218}
219
220pub unsafe fn lzc_send(
221    snapname: *const libc::c_char,
222    from: *const libc::c_char,
223    fd: libc::c_int,
224    flags: lzc_send_flags,
225) -> libc::c_int {
226    Lazy::force(&lzc::LIBZFS_CORE);
227    sys::lzc_send(snapname, from, fd, flags)
228}
229
230pub unsafe fn lzc_send_resume(
231    snapname: *const libc::c_char,
232    from: *const libc::c_char,
233    fd: libc::c_int,
234    flags: lzc_send_flags,
235    resumeobj: u64,
236    resumeoff: u64,
237) -> libc::c_int {
238    Lazy::force(&lzc::LIBZFS_CORE);
239    sys::lzc_send_resume(snapname, from, fd, flags, resumeobj, resumeoff)
240}
241
242pub unsafe fn lzc_send_space(
243    snapname: *const libc::c_char,
244    from: *const libc::c_char,
245    flags: lzc_send_flags,
246    spacep: *mut u64,
247) -> libc::c_int {
248    Lazy::force(&lzc::LIBZFS_CORE);
249    sys::lzc_send_space(snapname, from, flags, spacep)
250}
251
252pub unsafe fn lzc_send_redacted(
253    snapname: *const libc::c_char,
254    from: *const libc::c_char,
255    fd: libc::c_int,
256    flags: lzc_send_flags,
257    redactbook: *const libc::c_char,
258) -> libc::c_int {
259    Lazy::force(&lzc::LIBZFS_CORE);
260    sys::lzc_send_redacted(snapname, from, fd, flags, redactbook)
261}
262
263pub unsafe fn lzc_send_resume_redacted(
264    snapname: *const libc::c_char,
265    from: *const libc::c_char,
266    fd: libc::c_int,
267    flags: lzc_send_flags,
268    resumeobj: u64,
269    resumeoff: u64,
270    redactbook: *const libc::c_char,
271) -> libc::c_int {
272    Lazy::force(&lzc::LIBZFS_CORE);
273    sys::lzc_send_resume_redacted(snapname, from, fd, flags, resumeobj, resumeoff, redactbook)
274}
275
276pub unsafe fn lzc_receive(
277    snapname: *const libc::c_char,
278    props: *mut libnvpair::nvlist_t,
279    origin: *const libc::c_char,
280    force: impl Into<libnvpair::boolean_t>,
281    raw: impl Into<libnvpair::boolean_t>,
282    fd: libc::c_int,
283) -> libc::c_int {
284    Lazy::force(&lzc::LIBZFS_CORE);
285    sys::lzc_receive(snapname, props, origin, force.into(), raw.into(), fd)
286}
287
288pub unsafe fn lzc_receive_resumable(
289    snapname: *const libc::c_char,
290    props: *mut libnvpair::nvlist_t,
291    origin: *const libc::c_char,
292    force: impl Into<libnvpair::boolean_t>,
293    raw: impl Into<libnvpair::boolean_t>,
294    fd: libc::c_int,
295) -> libc::c_int {
296    Lazy::force(&lzc::LIBZFS_CORE);
297    sys::lzc_receive_resumable(snapname, props, origin, force.into(), raw.into(), fd)
298}
299
300pub unsafe fn lzc_receive_with_header(
301    snapname: *const libc::c_char,
302    props: *mut libnvpair::nvlist_t,
303    origin: *const libc::c_char,
304    force: impl Into<libnvpair::boolean_t>,
305    resumable: impl Into<libnvpair::boolean_t>,
306    raw: impl Into<libnvpair::boolean_t>,
307    fd: libc::c_int,
308    begin_record: *const dmu_replay_record,
309) -> libc::c_int {
310    Lazy::force(&lzc::LIBZFS_CORE);
311    let force = force.into();
312    let resumable = resumable.into();
313    let raw = raw.into();
314    sys::lzc_receive_with_header(
315        snapname,
316        props,
317        origin,
318        force,
319        resumable,
320        raw,
321        fd,
322        begin_record,
323    )
324}
325
326pub unsafe fn lzc_receive_one(
327    snapname: *const libc::c_char,
328    props: *mut libnvpair::nvlist_t,
329    origin: *const libc::c_char,
330    force: impl Into<libnvpair::boolean_t>,
331    resumable: impl Into<libnvpair::boolean_t>,
332    raw: impl Into<libnvpair::boolean_t>,
333    input_fd: libc::c_int,
334    begin_record: *const dmu_replay_record,
335    cleanup_fd: libc::c_int,
336    read_bytes: *mut u64,
337    errflags: *mut u64,
338    action_handle: *mut u64,
339    errors: *mut *mut libnvpair::nvlist_t,
340) -> libc::c_int {
341    Lazy::force(&lzc::LIBZFS_CORE);
342    let force = force.into();
343    let resumable = resumable.into();
344    let raw = raw.into();
345    sys::lzc_receive_one(
346        snapname,
347        props,
348        origin,
349        force,
350        resumable,
351        raw,
352        input_fd,
353        begin_record,
354        cleanup_fd,
355        read_bytes,
356        errflags,
357        action_handle,
358        errors,
359    )
360}
361
362pub unsafe fn lzc_receive_with_cmdprops(
363    snapname: *const libc::c_char,
364    props: *mut libnvpair::nvlist_t,
365    cmdprops: *mut libnvpair::nvlist_t,
366    wkeydata: *mut u8,
367    wkeylen: libc::c_uint,
368    origin: *const libc::c_char,
369    force: impl Into<libnvpair::boolean_t>,
370    resumable: impl Into<libnvpair::boolean_t>,
371    raw: impl Into<libnvpair::boolean_t>,
372    input_fd: libc::c_int,
373    begin_record: *const dmu_replay_record,
374    cleanup_fd: libc::c_int,
375    read_bytes: *mut u64,
376    errflags: *mut u64,
377    action_handle: *mut u64,
378    errors: *mut *mut libnvpair::nvlist_t,
379) -> libc::c_int {
380    Lazy::force(&lzc::LIBZFS_CORE);
381    let force = force.into();
382    let resumable = resumable.into();
383    let raw = raw.into();
384    sys::lzc_receive_with_cmdprops(
385        snapname,
386        props,
387        cmdprops,
388        wkeydata,
389        wkeylen,
390        origin,
391        force,
392        resumable,
393        raw,
394        input_fd,
395        begin_record,
396        cleanup_fd,
397        read_bytes,
398        errflags,
399        action_handle,
400        errors,
401    )
402}
403
404pub unsafe fn lzc_send_space_resume_redacted(
405    snapname: *const libc::c_char,
406    from: *const libc::c_char,
407    flags: lzc_send_flags,
408    resumeobj: u64,
409    resumeoff: u64,
410    resume_bytes: u64,
411    redactbook: *const libc::c_char,
412    fd: libc::c_int,
413    spacep: *mut u64,
414) -> libc::c_int {
415    Lazy::force(&lzc::LIBZFS_CORE);
416    sys::lzc_send_space_resume_redacted(
417        snapname,
418        from,
419        flags,
420        resumeobj,
421        resumeoff,
422        resume_bytes,
423        redactbook,
424        fd,
425        spacep,
426    )
427}
428
429pub unsafe fn lzc_rollback(
430    fsname: *const libc::c_char,
431    snapnamebuf: *mut libc::c_char,
432    snapnamelen: libc::c_int,
433) -> libc::c_int {
434    Lazy::force(&lzc::LIBZFS_CORE);
435    sys::lzc_rollback(fsname, snapnamebuf, snapnamelen)
436}
437
438pub unsafe fn lzc_rollback_to(
439    fsname: *const libc::c_char,
440    snapname: *const libc::c_char,
441) -> libc::c_int {
442    Lazy::force(&lzc::LIBZFS_CORE);
443    sys::lzc_rollback_to(fsname, snapname)
444}
445
446pub unsafe fn lzc_rename(source: *const libc::c_char, target: *const libc::c_char) -> libc::c_int {
447    Lazy::force(&lzc::LIBZFS_CORE);
448    sys::lzc_rename(source, target)
449}
450
451pub unsafe fn lzc_sync(
452    pool_name: *const libc::c_char,
453    params: *mut libnvpair::nvlist_t,
454) -> libc::c_int {
455    Lazy::force(&lzc::LIBZFS_CORE);
456    sys::lzc_sync(pool_name, params, ptr::null_mut())
457}
458
459pub unsafe fn lzc_reopen(
460    pool_name: *const libc::c_char,
461    scrub_restart: impl Into<libnvpair::boolean_t>,
462) -> libc::c_int {
463    Lazy::force(&lzc::LIBZFS_CORE);
464    let scrub_restart = scrub_restart.into();
465    sys::lzc_reopen(pool_name, scrub_restart)
466}
467
468pub unsafe fn lzc_pool_checkpoint(pool: *const libc::c_char) -> libc::c_int {
469    Lazy::force(&lzc::LIBZFS_CORE);
470    sys::lzc_pool_checkpoint(pool)
471}
472
473pub unsafe fn lzc_pool_checkpoint_discard(pool: *const libc::c_char) -> libc::c_int {
474    Lazy::force(&lzc::LIBZFS_CORE);
475    sys::lzc_pool_checkpoint_discard(pool)
476}
477
478#[cfg(feature = "wait")]
479pub unsafe fn lzc_wait_fs(
480    name: *const libc::c_char,
481    activity: zfs_wait_activity_t,
482    waited: *mut libnvpair::boolean_t,
483) -> libc::c_int {
484    Lazy::force(&lzc::LIBZFS_CORE);
485    sys::lzc_wait_fs(name, activity, waited)
486}