From a3eb6ad8ef34368cbe2da8a39d9749ed6e7cb4e0 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 27 Feb 2023 22:15:10 -0500 Subject: rust: BtreeIterFlags This adds a new wrapper type for btree iterator flags. Signed-off-by: Kent Overstreet --- rust-src/Cargo.lock | 1 + rust-src/bch_bindgen/Cargo.lock | 3 ++- rust-src/bch_bindgen/Cargo.toml | 2 +- rust-src/bch_bindgen/build.rs | 3 ++- rust-src/bch_bindgen/src/btree.rs | 27 ++++++++++++++++++++++++--- rust-src/src/cmd_list.rs | 5 ++++- 6 files changed, 34 insertions(+), 7 deletions(-) (limited to 'rust-src') diff --git a/rust-src/Cargo.lock b/rust-src/Cargo.lock index 754b1da8..46653733 100644 --- a/rust-src/Cargo.lock +++ b/rust-src/Cargo.lock @@ -74,6 +74,7 @@ dependencies = [ "anyhow", "bindgen", "bitfield", + "bitflags", "byteorder", "chrono", "colored", diff --git a/rust-src/bch_bindgen/Cargo.lock b/rust-src/bch_bindgen/Cargo.lock index 3d17e2f4..82d211b5 100644 --- a/rust-src/bch_bindgen/Cargo.lock +++ b/rust-src/bch_bindgen/Cargo.lock @@ -41,6 +41,7 @@ dependencies = [ "anyhow", "bindgen", "bitfield", + "bitflags", "byteorder", "chrono", "colored", @@ -55,7 +56,7 @@ dependencies = [ [[package]] name = "bindgen" version = "0.64.0" -source = "git+file:///home/kent/rust-src/rust-bindgen#f773267b090bf16b9e8375fcbdcd8ba5e88806a8" +source = "git+https://evilpiepirate.org/git/rust-bindgen.git#f773267b090bf16b9e8375fcbdcd8ba5e88806a8" dependencies = [ "bitflags", "cexpr", diff --git a/rust-src/bch_bindgen/Cargo.toml b/rust-src/bch_bindgen/Cargo.toml index 0590c61a..9a9b7a98 100644 --- a/rust-src/bch_bindgen/Cargo.toml +++ b/rust-src/bch_bindgen/Cargo.toml @@ -19,7 +19,7 @@ memoffset = "0.8.0" byteorder = "1.3" libc = "0.2.69" gag = "1.0.0" - +bitflags = "1.3.2" [build-dependencies] pkg-config = "0.3" diff --git a/rust-src/bch_bindgen/build.rs b/rust-src/bch_bindgen/build.rs index 22c9777a..74497b81 100644 --- a/rust-src/bch_bindgen/build.rs +++ b/rust-src/bch_bindgen/build.rs @@ -30,7 +30,6 @@ fn main() { .clang_arg("-fkeep-inline-functions") .derive_debug(true) .derive_default(true) - .derive_eq(true) .layout_tests(true) .default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: true, @@ -51,6 +50,8 @@ fn main() { .allowlist_var("BCH_.*") .allowlist_var("KEY_SPEC_.*") .allowlist_var("bch.*") + .allowlist_var("__BTREE_ITER.*") + .allowlist_var("BTREE_ITER.*") .allowlist_var("POS_MIN") .allowlist_var("POS_MAX") .allowlist_var("SPOS_MAX") diff --git a/rust-src/bch_bindgen/src/btree.rs b/rust-src/bch_bindgen/src/btree.rs index da9dbca6..405b7527 100644 --- a/rust-src/bch_bindgen/src/btree.rs +++ b/rust-src/bch_bindgen/src/btree.rs @@ -4,6 +4,7 @@ use crate::fs::Fs; use crate::errcode::{bch_errcode, errptr_to_result_c}; use std::mem::MaybeUninit; use std::ptr; +use bitflags::bitflags; pub struct BtreeTrans { raw: c::btree_trans, @@ -26,12 +27,33 @@ impl Drop for BtreeTrans { } } +bitflags! { + pub struct BtreeIterFlags: u16 { + const SLOTS = c::BTREE_ITER_SLOTS as u16; + const ALL_LEVELS = c::BTREE_ITER_ALL_LEVELS as u16; + const INTENT = c::BTREE_ITER_INTENT as u16; + const PREFETCH = c::BTREE_ITER_PREFETCH as u16; + const IS_EXTENTS = c::BTREE_ITER_IS_EXTENTS as u16; + const NOT_EXTENTS = c::BTREE_ITER_NOT_EXTENTS as u16; + const CACHED = c::BTREE_ITER_CACHED as u16; + const KEY_CACHED = c::BTREE_ITER_WITH_KEY_CACHE as u16; + const WITH_UPDATES = c::BTREE_ITER_WITH_UPDATES as u16; + const WITH_JOURNAL = c::BTREE_ITER_WITH_JOURNAL as u16; + const __ALL_SNAPSHOTS = c::__BTREE_ITER_ALL_SNAPSHOTS as u16; + const ALL_SNAPSHOTS = c::BTREE_ITER_ALL_SNAPSHOTS as u16; + const FILTER_SNAPSHOTS = c::BTREE_ITER_FILTER_SNAPSHOTS as u16; + const NOPRESERVE = c::BTREE_ITER_NOPRESERVE as u16; + const CACHED_NOFILL = c::BTREE_ITER_CACHED_NOFILL as u16; + const KEY_CACHE_FILL = c::BTREE_ITER_KEY_CACHE_FILL as u16; + } +} + pub struct BtreeIter { raw: c::btree_iter, } impl BtreeIter { - pub fn new<'a>(trans: &'a BtreeTrans, btree: c::btree_id, pos: c::bpos, flags: u32) -> BtreeIter { + pub fn new<'a>(trans: &'a BtreeTrans, btree: c::btree_id, pos: c::bpos, flags: BtreeIterFlags) -> BtreeIter { unsafe { let mut iter: MaybeUninit = MaybeUninit::uninit(); @@ -40,7 +62,7 @@ impl BtreeIter { &mut (*iter.as_mut_ptr()).raw, btree as u32, pos, - flags); + flags.bits as u32); iter.assume_init() } } @@ -69,7 +91,6 @@ impl BtreeIter { unsafe { c::bch2_btree_iter_advance(&mut self.raw); } - } } diff --git a/rust-src/src/cmd_list.rs b/rust-src/src/cmd_list.rs index ea4c93fa..1d71bf9e 100644 --- a/rust-src/src/cmd_list.rs +++ b/rust-src/src/cmd_list.rs @@ -4,6 +4,7 @@ use bch_bindgen::bcachefs; use bch_bindgen::fs::Fs; use bch_bindgen::btree::BtreeTrans; use bch_bindgen::btree::BtreeIter; +use bch_bindgen::btree::BtreeIterFlags; use clap::Parser; use colored::Colorize; use std::ffi::{CStr, OsStr, c_int, c_char}; @@ -11,7 +12,9 @@ use std::os::unix::ffi::OsStrExt; fn list_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> { let trans = BtreeTrans::new(fs); - let mut iter = BtreeIter::new(&trans, opt.btree, opt.start, 1 << 11); + let mut iter = BtreeIter::new(&trans, opt.btree, opt.start, + BtreeIterFlags::ALL_SNAPSHOTS| + BtreeIterFlags::PREFETCH); while let Some(k) = iter.peek_and_restart()? { unsafe { -- cgit v1.2.3