diff options
Diffstat (limited to 'bch_bindgen')
-rw-r--r-- | bch_bindgen/build.rs | 1 | ||||
-rw-r--r-- | bch_bindgen/src/btree.rs | 94 |
2 files changed, 51 insertions, 44 deletions
diff --git a/bch_bindgen/build.rs b/bch_bindgen/build.rs index 2abbe581..22d702b2 100644 --- a/bch_bindgen/build.rs +++ b/bch_bindgen/build.rs @@ -47,6 +47,7 @@ fn main() { .default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: true, }) + .bitfield_enum("btree_iter_update_trigger_flags") .allowlist_function("bcachefs_usage") .allowlist_function("raid_init") .allowlist_function("cmd_.*") diff --git a/bch_bindgen/src/btree.rs b/bch_bindgen/src/btree.rs index c55cab00..4eaebd98 100644 --- a/bch_bindgen/src/btree.rs +++ b/bch_bindgen/src/btree.rs @@ -25,35 +25,35 @@ impl<'f> BtreeTrans<'f> { } } -impl Drop for BtreeTrans<'_> { +impl<'f> Drop for BtreeTrans<'f> { fn drop(&mut self) { unsafe { c::bch2_trans_put(&mut *self.raw) } } } bitflags! { - pub struct BtreeIterFlags: u16 { - const SLOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_slots as u16; - const INTENT = c::btree_iter_update_trigger_flags::BTREE_ITER_intent as u16; - const PREFETCH = c::btree_iter_update_trigger_flags::BTREE_ITER_prefetch as u16; - const IS_EXTENTS = c::btree_iter_update_trigger_flags::BTREE_ITER_is_extents as u16; - const NOT_EXTENTS = c::btree_iter_update_trigger_flags::BTREE_ITER_not_extents as u16; - const CACHED = c::btree_iter_update_trigger_flags::BTREE_ITER_cached as u16; - const KEY_CACHED = c::btree_iter_update_trigger_flags::BTREE_ITER_with_key_cache as u16; - const WITH_UPDATES = c::btree_iter_update_trigger_flags::BTREE_ITER_with_updates as u16; - const WITH_JOURNAL = c::btree_iter_update_trigger_flags::BTREE_ITER_with_journal as u16; - const SNAPSHOT_FIELD = c::btree_iter_update_trigger_flags::BTREE_ITER_snapshot_field as u16; - const ALL_SNAPSHOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_all_snapshots as u16; - const FILTER_SNAPSHOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_filter_snapshots as u16; - const NOPRESERVE = c::btree_iter_update_trigger_flags::BTREE_ITER_nopreserve as u16; - const CACHED_NOFILL = c::btree_iter_update_trigger_flags::BTREE_ITER_cached_nofill as u16; - const KEY_CACHE_FILL = c::btree_iter_update_trigger_flags::BTREE_ITER_key_cache_fill as u16; + pub struct BtreeIterFlags: u32 { + const SLOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_slots.0; + const INTENT = c::btree_iter_update_trigger_flags::BTREE_ITER_intent.0; + const PREFETCH = c::btree_iter_update_trigger_flags::BTREE_ITER_prefetch.0; + const IS_EXTENTS = c::btree_iter_update_trigger_flags::BTREE_ITER_is_extents.0; + const NOT_EXTENTS = c::btree_iter_update_trigger_flags::BTREE_ITER_not_extents.0; + const CACHED = c::btree_iter_update_trigger_flags::BTREE_ITER_cached.0; + const KEY_CACHED = c::btree_iter_update_trigger_flags::BTREE_ITER_with_key_cache.0; + const WITH_UPDATES = c::btree_iter_update_trigger_flags::BTREE_ITER_with_updates.0; + const WITH_JOURNAL = c::btree_iter_update_trigger_flags::BTREE_ITER_with_journal.0; + const SNAPSHOT_FIELD = c::btree_iter_update_trigger_flags::BTREE_ITER_snapshot_field.0; + const ALL_SNAPSHOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_all_snapshots.0; + const FILTER_SNAPSHOTS = c::btree_iter_update_trigger_flags::BTREE_ITER_filter_snapshots.0; + const NOPRESERVE = c::btree_iter_update_trigger_flags::BTREE_ITER_nopreserve.0; + const CACHED_NOFILL = c::btree_iter_update_trigger_flags::BTREE_ITER_cached_nofill.0; + const KEY_CACHE_FILL = c::btree_iter_update_trigger_flags::BTREE_ITER_key_cache_fill.0; } } pub struct BtreeIter<'t> { raw: c::btree_iter, - trans: &'t BtreeTrans<'t>, + trans: PhantomData<&'t BtreeTrans<'t>>, } impl<'t> BtreeIter<'t> { @@ -71,16 +71,20 @@ impl<'t> BtreeIter<'t> { iter.as_mut_ptr(), btree, pos, - flags.bits as u32, + c::btree_iter_update_trigger_flags(flags.bits), + 0 ); - BtreeIter { raw: iter.assume_init(), trans } + BtreeIter { + raw: iter.assume_init(), + trans: PhantomData, + } } } - pub fn peek_max(&mut self, end: c::bpos) -> Result<Option<BkeySC<'_>>, bch_errcode> { + pub fn peek_max<'i>(&'i mut self, end: c::bpos) -> Result<Option<BkeySC<'i>>, bch_errcode> { unsafe { - let k = c::bch2_btree_iter_peek_max(self.trans.raw, &mut self.raw, end); + let k = c::bch2_btree_iter_peek_max(&mut self.raw, end); errptr_to_result_c(k.k).map(|_| { if !k.k.is_null() { Some(BkeySC { @@ -101,7 +105,7 @@ impl<'t> BtreeIter<'t> { pub fn peek_and_restart(&mut self) -> Result<Option<BkeySC>, bch_errcode> { unsafe { - let k = c::bch2_btree_iter_peek_and_restart_outlined(self.trans.raw, &mut self.raw); + let k = c::bch2_btree_iter_peek_and_restart_outlined(&mut self.raw); errptr_to_result_c(k.k).map(|_| { if !k.k.is_null() { @@ -119,20 +123,20 @@ impl<'t> BtreeIter<'t> { pub fn advance(&mut self) { unsafe { - c::bch2_btree_iter_advance(self.trans.raw, &mut self.raw); + c::bch2_btree_iter_advance(&mut self.raw); } } } -impl Drop for BtreeIter<'_> { +impl<'t> Drop for BtreeIter<'t> { fn drop(&mut self) { - unsafe { c::bch2_trans_iter_exit(self.trans.raw, &mut self.raw) } + unsafe { c::bch2_trans_iter_exit(&mut self.raw) } } } pub struct BtreeNodeIter<'t> { raw: c::btree_iter, - trans: &'t BtreeTrans<'t>, + trans: PhantomData<&'t BtreeTrans<'t>>, } impl<'t> BtreeNodeIter<'t> { @@ -153,55 +157,57 @@ impl<'t> BtreeNodeIter<'t> { pos, locks_want, depth, - flags.bits as u32, + c::btree_iter_update_trigger_flags(flags.bits), ); - BtreeNodeIter { raw: iter.assume_init(), trans } + BtreeNodeIter { + raw: iter.assume_init(), + trans: PhantomData, + } } } - pub fn peek(&mut self) -> Result<Option<&c::btree>, bch_errcode> { + pub fn peek<'i>(&'i mut self) -> Result<Option<&'i c::btree>, bch_errcode> { unsafe { - let b = c::bch2_btree_iter_peek_node(self.trans.raw, &mut self.raw); + let b = c::bch2_btree_iter_peek_node(&mut self.raw); errptr_to_result_c(b).map(|b| if !b.is_null() { Some(&*b) } else { None }) } } - pub fn peek_and_restart(&mut self) -> Result<Option<&c::btree>, bch_errcode> { + pub fn peek_and_restart<'i>(&'i mut self) -> Result<Option<&'i c::btree>, bch_errcode> { unsafe { - let b = c::bch2_btree_iter_peek_node_and_restart(self.trans.raw, &mut self.raw); + let b = c::bch2_btree_iter_peek_node_and_restart(&mut self.raw); errptr_to_result_c(b).map(|b| if !b.is_null() { Some(&*b) } else { None }) } } - pub fn advance(&mut self) { + pub fn advance<'i>(&'i mut self) { unsafe { - c::bch2_btree_iter_next_node(self.trans.raw, &mut self.raw); + c::bch2_btree_iter_next_node(&mut self.raw); } } - #[allow(clippy::should_implement_trait)] - pub fn next(&mut self) -> Result<Option<&c::btree>, bch_errcode> { + pub fn next<'i>(&'i mut self) -> Result<Option<&'i c::btree>, bch_errcode> { unsafe { - let b = c::bch2_btree_iter_next_node(self.trans.raw, &mut self.raw); + let b = c::bch2_btree_iter_next_node(&mut self.raw); errptr_to_result_c(b).map(|b| if !b.is_null() { Some(&*b) } else { None }) } } } -impl Drop for BtreeNodeIter<'_> { +impl<'t> Drop for BtreeNodeIter<'t> { fn drop(&mut self) { - unsafe { c::bch2_trans_iter_exit(self.trans.raw, &mut self.raw) } + unsafe { c::bch2_trans_iter_exit(&mut self.raw) } } } impl<'b, 'f> c::btree { pub fn to_text(&'b self, fs: &'f Fs) -> BtreeNodeToText<'b, 'f> { - BtreeNodeToText { b: self, fs } + BtreeNodeToText { b: &self, fs } } pub fn ondisk_to_text(&'b self, fs: &'f Fs) -> BtreeNodeOndiskToText<'b, 'f> { - BtreeNodeOndiskToText { b: self, fs } + BtreeNodeOndiskToText { b: &self, fs } } } @@ -210,7 +216,7 @@ pub struct BtreeNodeToText<'b, 'f> { fs: &'f Fs, } -impl fmt::Display for BtreeNodeToText<'_, '_> { +impl<'b, 'f> fmt::Display for BtreeNodeToText<'b, 'f> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { printbuf_to_formatter(f, |buf| unsafe { c::bch2_btree_node_to_text(buf, self.fs.raw, self.b) @@ -223,7 +229,7 @@ pub struct BtreeNodeOndiskToText<'b, 'f> { fs: &'f Fs, } -impl fmt::Display for BtreeNodeOndiskToText<'_, '_> { +impl<'b, 'f> fmt::Display for BtreeNodeOndiskToText<'b, 'f> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { printbuf_to_formatter(f, |buf| unsafe { c::bch2_btree_node_ondisk_to_text(buf, self.fs.raw, self.b) |