summaryrefslogtreecommitdiff
path: root/rust-src
diff options
context:
space:
mode:
Diffstat (limited to 'rust-src')
-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
-rw-r--r--rust-src/src/cmd_list.rs31
5 files changed, 71 insertions, 31 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"
diff --git a/rust-src/src/cmd_list.rs b/rust-src/src/cmd_list.rs
index fb7cb1b2..f04efa2c 100644
--- a/rust-src/src/cmd_list.rs
+++ b/rust-src/src/cmd_list.rs
@@ -3,6 +3,7 @@ use bch_bindgen::error;
use bch_bindgen::bcachefs;
use bch_bindgen::opt_set;
use bch_bindgen::fs::Fs;
+use bch_bindgen::bkey::BkeySC;
use bch_bindgen::btree::BtreeTrans;
use bch_bindgen::btree::BtreeIter;
use bch_bindgen::btree::BtreeNodeIter;
@@ -36,11 +37,12 @@ fn list_btree_formats(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", b.to_text(fs));
iter.advance();
}
@@ -53,11 +55,12 @@ fn list_btree_nodes(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", BkeySC::from(&b.key).to_text(fs));
iter.advance();
}
@@ -70,28 +73,12 @@ fn list_nodes_ondisk(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
0, opt.level,
BtreeIterFlags::PREFETCH);
- while let Some(b) = iter.peek()? {
- if b.key.k.p > opt.end {
- break;
- }
-
- iter.advance();
- }
-
- Ok(())
-}
-
-fn list_nodes_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
- let trans = BtreeTrans::new(fs);
- let mut iter = BtreeNodeIter::new(&trans, opt.btree, opt.start,
- 0, opt.level,
- BtreeIterFlags::PREFETCH);
-
- while let Some(b) = iter.peek()? {
+ while let Some(b) = iter.peek_and_restart()? {
if b.key.k.p > opt.end {
break;
}
+ println!("{}", b.ondisk_to_text(fs));
iter.advance();
}
@@ -104,7 +91,6 @@ enum Mode {
Formats,
Nodes,
NodesOndisk,
- NodesKeys,
}
#[derive(Parser)]
@@ -168,12 +154,11 @@ fn cmd_list_inner(opt: Cli) -> anyhow::Result<()> {
Mode::Formats => list_btree_formats(&fs, opt),
Mode::Nodes => list_btree_nodes(&fs, opt),
Mode::NodesOndisk => list_nodes_ondisk(&fs, opt),
- Mode::NodesKeys => list_nodes_keys(&fs, opt),
}
}
#[no_mangle]
-pub extern "C" fn cmd_rust_list(argc: c_int, argv: *const *const c_char) {
+pub extern "C" fn cmd_list(argc: c_int, argv: *const *const c_char) {
let argv: Vec<_> = (0..argc)
.map(|i| unsafe { CStr::from_ptr(*argv.add(i as usize)) })
.map(|i| OsStr::from_bytes(i.to_bytes()))