summaryrefslogtreecommitdiff
path: root/rust-src/bch_bindgen
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-03-06 02:21:52 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-03-06 04:13:45 -0500
commitea1b618203d7dfa9a24aa2b5a80085f860594b9c (patch)
tree63ceac6de2f723ba545809eb575037cbc0a334c2 /rust-src/bch_bindgen
parent0206d42daf4c4bd3bbcfa15a2bef34319524db49 (diff)
cmd_list.rs: Finish list modes, delete cmd_list.c
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'rust-src/bch_bindgen')
-rw-r--r--rust-src/bch_bindgen/src/bkey.rs18
-rw-r--r--rust-src/bch_bindgen/src/btree.rs41
-rw-r--r--rust-src/bch_bindgen/src/lib.rs10
-rw-r--r--rust-src/bch_bindgen/src/libbcachefs_wrapper.h2
4 files changed, 63 insertions, 8 deletions
diff --git a/rust-src/bch_bindgen/src/bkey.rs b/rust-src/bch_bindgen/src/bkey.rs
index c7910c76..36106b5e 100644
--- a/rust-src/bch_bindgen/src/bkey.rs
+++ b/rust-src/bch_bindgen/src/bkey.rs
@@ -3,7 +3,7 @@
use crate::c;
use crate::fs::Fs;
use crate::btree::BtreeIter;
-use std::ffi::CStr;
+use crate::printbuf_to_formatter;
use std::fmt;
use std::marker::PhantomData;
use std::mem::transmute;
@@ -99,6 +99,12 @@ impl<'a, 'b> BkeySC<'a> {
}
}
+impl<'a> From<&'a c::bkey_i> for BkeySC<'a> {
+ fn from(k: &'a c::bkey_i) -> Self {
+ BkeySC { k: &k.k, v: &k.v, iter: PhantomData }
+ }
+}
+
pub struct BkeySCToText<'a, 'b> {
k: &'a BkeySC<'a>,
fs: &'b Fs,
@@ -106,12 +112,8 @@ pub struct BkeySCToText<'a, 'b> {
impl<'a, 'b> fmt::Display for BkeySCToText<'a, 'b> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- let mut buf = c::printbuf::new();
-
- unsafe { c::bch2_bkey_val_to_text(&mut buf, self.fs.raw, self.k.to_raw()) };
-
- let s = unsafe { CStr::from_ptr(buf.buf) };
- let s = s.to_str().unwrap();
- write!(f, "{}", s)
+ unsafe {
+ printbuf_to_formatter(f, |buf| c::bch2_bkey_val_to_text(buf, self.fs.raw, self.k.to_raw()))
+ }
}
}
diff --git a/rust-src/bch_bindgen/src/btree.rs b/rust-src/bch_bindgen/src/btree.rs
index 7e748f9f..32b4e743 100644
--- a/rust-src/bch_bindgen/src/btree.rs
+++ b/rust-src/bch_bindgen/src/btree.rs
@@ -3,6 +3,8 @@ use crate::c;
use crate::bkey::BkeySC;
use crate::fs::Fs;
use crate::errcode::{bch_errcode, errptr_to_result_c};
+use crate::printbuf_to_formatter;
+use std::fmt;
use std::marker::PhantomData;
use std::mem::MaybeUninit;
use std::ptr;
@@ -140,6 +142,13 @@ impl<'t> BtreeNodeIter<'t> {
}
}
+ 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(&mut self.raw);
+ errptr_to_result_c(b).map(|b| if !b.is_null() { Some(&*b) } else { None })
+ }
+ }
+
pub fn advance<'i>(&'i mut self) {
unsafe {
c::bch2_btree_iter_next_node(&mut self.raw);
@@ -159,3 +168,35 @@ impl<'t> Drop for BtreeNodeIter<'t> {
unsafe { c::bch2_trans_iter_exit(self.raw.trans, &mut self.raw) }
}
}
+
+impl<'b, 'f> c::btree {
+ pub fn to_text(&'b self, fs: &'f Fs) -> BtreeNodeToText<'b, 'f> {
+ BtreeNodeToText { b: &self, fs }
+ }
+
+ pub fn ondisk_to_text(&'b self, fs: &'f Fs) -> BtreeNodeOndiskToText<'b, 'f> {
+ BtreeNodeOndiskToText { b: &self, fs }
+ }
+}
+
+pub struct BtreeNodeToText<'b, 'f> {
+ b: &'b c::btree,
+ fs: &'f Fs,
+}
+
+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) })
+ }
+}
+
+pub struct BtreeNodeOndiskToText<'b, 'f> {
+ b: &'b c::btree,
+ fs: &'f Fs,
+}
+
+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) })
+ }
+}
diff --git a/rust-src/bch_bindgen/src/lib.rs b/rust-src/bch_bindgen/src/lib.rs
index d2b58511..86592c6b 100644
--- a/rust-src/bch_bindgen/src/lib.rs
+++ b/rust-src/bch_bindgen/src/lib.rs
@@ -157,3 +157,13 @@ impl FromStr for c::bpos {
Ok(c::bpos { inode: ino, offset: off, snapshot: snp })
}
}
+
+pub fn printbuf_to_formatter<F>(f: &mut fmt::Formatter<'_>, func: F) -> fmt::Result
+ where F: Fn(*mut c::printbuf) {
+ let mut buf = c::printbuf::new();
+
+ func(&mut buf);
+
+ let s = unsafe { CStr::from_ptr(buf.buf) };
+ f.write_str(s.to_str().unwrap())
+}
diff --git a/rust-src/bch_bindgen/src/libbcachefs_wrapper.h b/rust-src/bch_bindgen/src/libbcachefs_wrapper.h
index c8990dcc..d1ebf4b6 100644
--- a/rust-src/bch_bindgen/src/libbcachefs_wrapper.h
+++ b/rust-src/bch_bindgen/src/libbcachefs_wrapper.h
@@ -1,7 +1,9 @@
#include "../libbcachefs/super-io.h"
#include "../libbcachefs/checksum.h"
#include "../libbcachefs/bcachefs_format.h"
+#include "../libbcachefs/btree_cache.h"
#include "../libbcachefs/btree_iter.h"
+#include "../libbcachefs/debug.h"
#include "../libbcachefs/errcode.h"
#include "../libbcachefs/error.h"
#include "../libbcachefs/opts.h"