]> git.sesse.net Git - bcachefs-tools-debian/blob - rust-src/bch_bindgen/src/bkey.rs
64697ea65863c8f8d804b4c5dfbc6c2c1f49850a
[bcachefs-tools-debian] / rust-src / bch_bindgen / src / bkey.rs
1 #![allow(non_camel_case_types)]
2
3 use crate::c;
4 use crate::fs::Fs;
5 use crate::btree::BtreeIter;
6 use crate::printbuf_to_formatter;
7 use std::fmt;
8 use std::marker::PhantomData;
9 use std::mem::transmute;
10
11 pub struct BkeySC<'a> {
12     pub k:              &'a c::bkey,
13     pub v:              &'a c::bch_val,
14     pub(crate) iter:    PhantomData<&'a mut BtreeIter<'a>>
15 }
16
17 pub enum BkeyValC<'a> {
18     deleted,
19     whiteout,
20     error,
21     cookie(&'a c::bch_cookie),
22     hash_whiteout(&'a c::bch_hash_whiteout),
23     btree_ptr(&'a c::bch_btree_ptr),
24     extent(&'a c::bch_extent),
25     reservation(&'a c::bch_reservation),
26     inode(&'a c::bch_inode),
27     inode_generation(&'a c::bch_inode_generation),
28     dirent(&'a c::bch_dirent),
29     xattr(&'a c::bch_xattr),
30     alloc(&'a c::bch_alloc),
31     quota(&'a c::bch_quota),
32     stripe(&'a c::bch_stripe),
33     reflink_p(&'a c::bch_reflink_p),
34     reflink_v(&'a c::bch_reflink_v),
35     inline_data(&'a c::bch_inline_data),
36     btree_ptr_v2(&'a c::bch_btree_ptr_v2),
37     indirect_inline_data(&'a c::bch_indirect_inline_data),
38     alloc_v2(&'a c::bch_alloc_v2),
39     subvolume(&'a c::bch_subvolume),
40     snapshot(&'a c::bch_snapshot),
41     inode_v2(&'a c::bch_inode_v2),
42     alloc_v3(&'a c::bch_alloc_v3),
43     set,
44     lru(&'a c::bch_lru),
45     alloc_v4(&'a c::bch_alloc_v4),
46     backpointer(&'a c::bch_backpointer),
47     inode_v3(&'a c::bch_inode_v3),
48     bucket_gens(&'a c::bch_bucket_gens),
49     snapshot_tree(&'a c::bch_snapshot_tree),
50 }
51
52 impl<'a, 'b> BkeySC<'a> {
53     unsafe fn to_raw(&self) -> c::bkey_s_c {
54         c::bkey_s_c { k: self.k, v: self.v }
55     }
56
57     pub fn to_text(&'a self, fs: &'b Fs) -> BkeySCToText<'a, 'b> {
58         BkeySCToText { k: self, fs }
59     }
60
61     pub fn v(&'a self) -> BkeyValC {
62         let ty: c::bch_bkey_type = unsafe { transmute(self.k.type_ as u32) };
63
64         use c::bch_bkey_type::*;
65         use BkeyValC::*;
66         match ty {
67             KEY_TYPE_deleted                => deleted,
68             KEY_TYPE_whiteout               => whiteout,
69             KEY_TYPE_error                  => error,
70             KEY_TYPE_cookie                 => cookie(unsafe { transmute(self.v) }),
71             KEY_TYPE_hash_whiteout          => hash_whiteout(unsafe { transmute(self.v) }),
72             KEY_TYPE_btree_ptr              => btree_ptr(unsafe { transmute(self.v) }),
73             KEY_TYPE_extent                 => extent(unsafe { transmute(self.v) }),
74             KEY_TYPE_reservation            => reservation(unsafe { transmute(self.v) }),
75             KEY_TYPE_inode                  => inode(unsafe { transmute(self.v) }),
76             KEY_TYPE_inode_generation       => inode_generation(unsafe { transmute(self.v) }),
77             KEY_TYPE_dirent                 => dirent(unsafe { transmute(self.v) }),
78             KEY_TYPE_xattr                  => xattr(unsafe { transmute(self.v) }),
79             KEY_TYPE_alloc                  => alloc(unsafe { transmute(self.v) }),
80             KEY_TYPE_quota                  => quota(unsafe { transmute(self.v) }),
81             KEY_TYPE_stripe                 => stripe(unsafe { transmute(self.v) }),
82             KEY_TYPE_reflink_p              => reflink_p(unsafe { transmute(self.v) }),
83             KEY_TYPE_reflink_v              => reflink_v(unsafe { transmute(self.v) }),
84             KEY_TYPE_inline_data            => inline_data(unsafe { transmute(self.v) }),
85             KEY_TYPE_btree_ptr_v2           => btree_ptr_v2(unsafe { transmute(self.v) }),
86             KEY_TYPE_indirect_inline_data   => indirect_inline_data(unsafe { transmute(self.v) }),
87             KEY_TYPE_alloc_v2               => alloc_v2(unsafe { transmute(self.v) }),
88             KEY_TYPE_subvolume              => subvolume(unsafe { transmute(self.v) }),
89             KEY_TYPE_snapshot               => snapshot(unsafe { transmute(self.v) }),
90             KEY_TYPE_inode_v2               => inode_v2(unsafe { transmute(self.v) }),
91             KEY_TYPE_alloc_v3               => inode_v3(unsafe { transmute(self.v) }),
92             KEY_TYPE_set                    => set,
93             KEY_TYPE_lru                    => lru(unsafe { transmute(self.v) }),
94             KEY_TYPE_alloc_v4               => alloc_v4(unsafe { transmute(self.v) }),
95             KEY_TYPE_backpointer            => backpointer(unsafe { transmute(self.v) }),
96             KEY_TYPE_inode_v3               => inode_v3(unsafe { transmute(self.v) }),
97             KEY_TYPE_bucket_gens            => bucket_gens(unsafe { transmute(self.v) }),
98             KEY_TYPE_snapshot_tree          => snapshot_tree(unsafe { transmute(self.v) }),
99             KEY_TYPE_MAX                    => unreachable!(),
100         }
101     }
102 }
103
104 impl<'a> From<&'a c::bkey_i> for BkeySC<'a> {
105     fn from(k: &'a c::bkey_i) -> Self {
106         BkeySC { k: &k.k, v: &k.v, iter: PhantomData }
107     }
108 }
109
110 pub struct BkeySCToText<'a, 'b> {
111     k:  &'a BkeySC<'a>,
112     fs: &'b Fs,
113 }
114
115 impl<'a, 'b> fmt::Display for BkeySCToText<'a, 'b> {
116     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
117         unsafe {
118             printbuf_to_formatter(f, |buf| c::bch2_bkey_val_to_text(buf, self.fs.raw, self.k.to_raw())) 
119         }
120     }
121 }