add "bkey-type" option to list command

Only bkeys of the specified type will be printed.

Signed-off-by: Thomas Bertschinger <tahbertschinger@gmail.com>
This commit is contained in:
Thomas Bertschinger 2024-05-04 23:07:04 -04:00
parent ba0c99ecd9
commit 0671ddadd8
2 changed files with 43 additions and 0 deletions

View File

@ -106,6 +106,34 @@ impl FromStr for c::btree_id {
} }
} }
#[derive(Debug)]
pub struct InvalidBkeyType;
impl fmt::Display for InvalidBkeyType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "invalid bkey type")
}
}
impl Error for InvalidBkeyType {
}
impl FromStr for c::bch_bkey_type {
type Err = InvalidBkeyType;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let s = CString::new(s).unwrap();
let p = s.as_ptr();
let v = unsafe {c::match_string(c::bch2_bkey_types[..].as_ptr(), (-(1 as isize)) as usize, p)};
if v >= 0 {
Ok(unsafe { std::mem::transmute(v) })
} else {
Err(InvalidBkeyType)
}
}
}
impl c::printbuf { impl c::printbuf {
fn new() -> c::printbuf { fn new() -> c::printbuf {
let mut buf: c::printbuf = Default::default(); let mut buf: c::printbuf = Default::default();

View File

@ -21,7 +21,18 @@ fn list_keys(fs: &Fs, opt: Cli) -> anyhow::Result<()> {
break; break;
} }
match opt.bkey_type {
Some(ty) => {
if k.k.type_ != ty as u8 {
iter.advance();
continue;
}
}
_ => {}
};
println!("{}", k.to_text(fs)); println!("{}", k.to_text(fs));
iter.advance(); iter.advance();
} }
@ -97,6 +108,10 @@ pub struct Cli {
#[arg(short, long, default_value_t=bcachefs::btree_id::BTREE_ID_extents)] #[arg(short, long, default_value_t=bcachefs::btree_id::BTREE_ID_extents)]
btree: bcachefs::btree_id, btree: bcachefs::btree_id,
/// Bkey type to list
#[arg(short='k', long)]
bkey_type: Option<bcachefs::bch_bkey_type>,
/// Btree depth to descend to (0 == leaves) /// Btree depth to descend to (0 == leaves)
#[arg(short, long, default_value_t=0)] #[arg(short, long, default_value_t=0)]
level: u32, level: u32,