aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTruongSinh Tran-Nguyen <i@truongsinh.pro>2023-04-27 11:02:00 -0700
committerKent Overstreet <kent.overstreet@linux.dev>2023-04-27 19:23:17 -0400
commitc1a8e27a3fad202750a1b66a1fd1fa82a8a5bd92 (patch)
tree1bb2e1fbe3ceee13ae4b8a4257ef31e1c924a4a8
parent9ee211eacad51bce6858ca9b9755b6c9eb253f2e (diff)
downloadbcachefs-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.rs11
-rw-r--r--rust-src/bch_bindgen/src/libbcachefs_wrapper.h7
-rw-r--r--rust-src/bch_bindgen/src/opts.rs30
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
+ }
+ }
+ };
}