summaryrefslogtreecommitdiff
path: root/src/ops/inode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ops/inode.rs')
-rw-r--r--src/ops/inode.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/ops/inode.rs b/src/ops/inode.rs
index fa5d461..8f155e6 100644
--- a/src/ops/inode.rs
+++ b/src/ops/inode.rs
@@ -3,15 +3,25 @@ use crate::{io::Stat, private_trait::Sealed, proto, Done, Ino, Operation, Reply,
pub enum Forget {}
pub enum Getattr {}
+pub enum Bmap {}
pub trait RequestForget<'o>: Operation<'o> {
fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a>;
}
+pub trait RequestBlock<'o>: Operation<'o> {
+ fn block(request: &Request<'o, Self>) -> u64;
+ fn block_size(request: &Request<'o, Self>) -> u32;
+}
+
pub trait ReplyStat<'o>: Operation<'o> {
fn stat(reply: Reply<'o, Self>, inode: &impl Stat) -> Done<'o>;
}
+pub trait ReplyBlock<'o>: Operation<'o> {
+ fn block(reply: Reply<'o, Self>, block: u64) -> Done<'o>;
+}
+
pub enum ForgetList<'a> {
Single(Option<(Ino, u64)>),
Batch(std::slice::Iter<'a, proto::ForgetOne>),
@@ -19,6 +29,7 @@ pub enum ForgetList<'a> {
impl Sealed for Forget {}
impl Sealed for Getattr {}
+impl Sealed for Bmap {}
impl<'o> Operation<'o> for Forget {
type RequestBody = proto::OpcodeSelect<
@@ -35,6 +46,11 @@ impl<'o> Operation<'o> for Getattr {
type ReplyState = ();
}
+impl<'o> Operation<'o> for Bmap {
+ type RequestBody = &'o proto::BmapIn;
+ type ReplyState = ();
+}
+
impl<'o> RequestForget<'o> for Forget {
fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a> {
use {proto::OpcodeSelect::*, ForgetList::*};
@@ -86,3 +102,19 @@ impl<'o> ReplyStat<'o> for Getattr {
})
}
}
+
+impl<'o> RequestBlock<'o> for Bmap {
+ fn block(request: &Request<'o, Self>) -> u64 {
+ request.body.block
+ }
+
+ fn block_size(request: &Request<'o, Self>) -> u32 {
+ request.body.block_size
+ }
+}
+
+impl<'o> ReplyBlock<'o> for Bmap {
+ fn block(reply: Reply<'o, Self>, block: u64) -> Done<'o> {
+ reply.single(&proto::BmapOut { block })
+ }
+}