From 0f45ef90df6d036aec2077b702fdf465f61c16d6 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Thu, 6 Jan 2022 21:45:43 -0600 Subject: Implement Bmap --- src/ops/inode.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/ops/inode.rs') 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 }) + } +} -- cgit v1.2.3