diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-03-06 02:21:52 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-03-06 04:13:45 -0500 |
commit | ea1b618203d7dfa9a24aa2b5a80085f860594b9c (patch) | |
tree | 63ceac6de2f723ba545809eb575037cbc0a334c2 /rust-src/bch_bindgen | |
parent | 0206d42daf4c4bd3bbcfa15a2bef34319524db49 (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.rs | 18 | ||||
-rw-r--r-- | rust-src/bch_bindgen/src/btree.rs | 41 | ||||
-rw-r--r-- | rust-src/bch_bindgen/src/lib.rs | 10 | ||||
-rw-r--r-- | rust-src/bch_bindgen/src/libbcachefs_wrapper.h | 2 |
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" |