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>
This commit is contained in:
TruongSinh Tran-Nguyen 2023-04-27 11:02:00 -07:00 committed by Kent Overstreet
parent 9ee211eaca
commit c1a8e27a3f
3 changed files with 46 additions and 2 deletions

View File

@ -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() { fn main() {
use std::path::PathBuf; use std::path::PathBuf;
@ -49,6 +58,7 @@ fn main() {
.blocklist_type("srcu_struct") .blocklist_type("srcu_struct")
.allowlist_var("BCH_.*") .allowlist_var("BCH_.*")
.allowlist_var("KEY_SPEC_.*") .allowlist_var("KEY_SPEC_.*")
.allowlist_var("Fix753_FMODE_.*")
.allowlist_var("bch.*") .allowlist_var("bch.*")
.allowlist_var("__BTREE_ITER.*") .allowlist_var("__BTREE_ITER.*")
.allowlist_var("BTREE_ITER.*") .allowlist_var("BTREE_ITER.*")
@ -69,6 +79,7 @@ fn main() {
.no_partialeq("bkey") .no_partialeq("bkey")
.no_partialeq("bpos") .no_partialeq("bpos")
.generate_inline_functions(true) .generate_inline_functions(true)
.parse_callbacks(Box::new(Fix753 {}))
.generate() .generate()
.expect("BindGen Generation Failiure: [libbcachefs_wrapper]"); .expect("BindGen Generation Failiure: [libbcachefs_wrapper]");
bindings bindings

View File

@ -10,4 +10,11 @@
#include "../libbcachefs.h" #include "../libbcachefs.h"
#include "../crypto.h" #include "../crypto.h"
#include "../include/linux/bio.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);

View File

@ -3,7 +3,33 @@ macro_rules! opt_set {
($opts:ident, $n:ident, $v:expr) => { ($opts:ident, $n:ident, $v:expr) => {
bch_bindgen::paste! { bch_bindgen::paste! {
$opts.$n = $v; $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
}
}
};
} }