diff options
author | TruongSinh Tran-Nguyen <i@truongsinh.pro> | 2023-04-27 11:02:00 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-04-27 19:23:17 -0400 |
commit | c1a8e27a3fad202750a1b66a1fd1fa82a8a5bd92 (patch) | |
tree | 1bb2e1fbe3ceee13ae4b8a4257ef31e1c924a4a8 | |
parent | 9ee211eacad51bce6858ca9b9755b6c9eb253f2e (diff) | |
download | bcachefs-tools-c1a8e27a3fad202750a1b66a1fd1fa82a8a5bd92.tar.gz |
chore(rust): add opt_get! and expose some FMODE_* as Rust const
In an effort to rewrite `bch2_read_super` from C to Rust,
it is neccessary to have `opt_get!` macro defined, and some
FMODE_* consts (defined as macro in `include/linux/blkdev.h`)
defined as Rust const.
Bindgen is currently unable to exapnd C functional macro [1],
this this commit use the workaround as introduced in [2].
[1] https://github.com/rust-lang/rust-bindgen/issues/753
[2] https://github.com/rust-lang/rust-bindgen/issues/753#issuecomment-608546390
Signed-off-by: TruongSinh Tran-Nguyen <i@truongsinh.pro>
-rw-r--r-- | rust-src/bch_bindgen/build.rs | 11 | ||||
-rw-r--r-- | rust-src/bch_bindgen/src/libbcachefs_wrapper.h | 7 | ||||
-rw-r--r-- | rust-src/bch_bindgen/src/opts.rs | 30 |
3 files changed, 46 insertions, 2 deletions
diff --git a/rust-src/bch_bindgen/build.rs b/rust-src/bch_bindgen/build.rs index f426316f..92ec3cef 100644 --- a/rust-src/bch_bindgen/build.rs +++ b/rust-src/bch_bindgen/build.rs @@ -1,3 +1,12 @@ + +#[derive(Debug)] +pub struct Fix753 {} +impl bindgen::callbacks::ParseCallbacks for Fix753 { + fn item_name(&self, original_item_name: &str) -> Option<String> { + Some(original_item_name.trim_start_matches("Fix753_").to_owned()) + } +} + fn main() { use std::path::PathBuf; @@ -49,6 +58,7 @@ fn main() { .blocklist_type("srcu_struct") .allowlist_var("BCH_.*") .allowlist_var("KEY_SPEC_.*") + .allowlist_var("Fix753_FMODE_.*") .allowlist_var("bch.*") .allowlist_var("__BTREE_ITER.*") .allowlist_var("BTREE_ITER.*") @@ -69,6 +79,7 @@ fn main() { .no_partialeq("bkey") .no_partialeq("bpos") .generate_inline_functions(true) + .parse_callbacks(Box::new(Fix753 {})) .generate() .expect("BindGen Generation Failiure: [libbcachefs_wrapper]"); bindings diff --git a/rust-src/bch_bindgen/src/libbcachefs_wrapper.h b/rust-src/bch_bindgen/src/libbcachefs_wrapper.h index d1ebf4b6..e7bcfcfb 100644 --- a/rust-src/bch_bindgen/src/libbcachefs_wrapper.h +++ b/rust-src/bch_bindgen/src/libbcachefs_wrapper.h @@ -10,4 +10,11 @@ #include "../libbcachefs.h" #include "../crypto.h" #include "../include/linux/bio.h" +#include "../include/linux/blkdev.h" + +#define MARK_FIX_753(req_name) const fmode_t Fix753_##req_name = req_name; + +MARK_FIX_753(FMODE_READ); +MARK_FIX_753(FMODE_WRITE); +MARK_FIX_753(FMODE_EXCL);
\ No newline at end of file diff --git a/rust-src/bch_bindgen/src/opts.rs b/rust-src/bch_bindgen/src/opts.rs index e2261993..d38d469c 100644 --- a/rust-src/bch_bindgen/src/opts.rs +++ b/rust-src/bch_bindgen/src/opts.rs @@ -3,7 +3,33 @@ macro_rules! opt_set { ($opts:ident, $n:ident, $v:expr) => { bch_bindgen::paste! { $opts.$n = $v; - $opts.[<set_ $n _defined>](1); + $opts.[<set_ $n _defined>](1) } - } + }; +} + +#[macro_export] +macro_rules! opt_defined { + ($opts:ident, $n:ident) => { + bch_bindgen::paste! { + $opts.[< $n _defined>]() + } + }; +} + +#[macro_export] +macro_rules! opt_get { + ($opts:ident, $n:ident) => { + if bch_bindgen::opt_defined!($opts, $n) == 0 { + bch_bindgen::paste! { + unsafe { + bch_bindgen::bcachefs::bch2_opts_default.$n + } + } + } else { + bch_bindgen::paste! { + $opts.$n + } + } + }; } |