diff options
| author | Alejandro Soto <alejandro@34project.org> | 2022-01-06 21:45:43 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2022-01-06 21:45:43 -0600 |
| commit | 0f45ef90df6d036aec2077b702fdf465f61c16d6 (patch) | |
| tree | 0abaef4cf55aa8aecc3ae985858bf870f6836e01 | |
| parent | f0e7c0997553ab356d5aa683d5322ab2de575188 (diff) | |
Implement Bmap
| -rw-r--r-- | src/ops/inode.rs | 32 | ||||
| -rw-r--r-- | src/ops/mod.rs | 2 | ||||
| -rw-r--r-- | src/ops/traits.rs | 23 | ||||
| -rw-r--r-- | src/proto.rs | 6 | ||||
| -rw-r--r-- | src/session.rs | 3 |
5 files changed, 64 insertions, 2 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 }) + } +} diff --git a/src/ops/mod.rs b/src/ops/mod.rs index 010f488..d16a761 100644 --- a/src/ops/mod.rs +++ b/src/ops/mod.rs @@ -14,7 +14,7 @@ pub mod traits; pub use dir::{BufferedReaddir, Lookup, Readdir}; pub use entry::{Link, Mkdir, Rmdir, Symlink, Unlink}; pub use global::{Init, Statfs}; -pub use inode::{Forget, Getattr}; +pub use inode::{Bmap, Forget, Getattr}; pub use open::{Access, Create, Open, Opendir, Release, Releasedir}; pub use rw::{Flush, Fsync, Fsyncdir, Read, Readlink, Write}; pub use xattr::{Getxattr, Listxattr, Removexattr, Setxattr}; diff --git a/src/ops/traits.rs b/src/ops/traits.rs index 3a81e85..e8b8008 100644 --- a/src/ops/traits.rs +++ b/src/ops/traits.rs @@ -7,7 +7,7 @@ pub use super::{ dir::{ReplyEntries, ReplyFound}, entry::{RequestLink, RequestTarget}, global::ReplyFsInfo, - inode::{ReplyStat, RequestForget}, + inode::{ReplyBlock, ReplyStat, RequestBlock, RequestForget}, open::{ReplyOpen, ReplyPermissionDenied}, rw::ReplyAll, xattr::ReplyXattrRead, @@ -168,6 +168,20 @@ impl<'o, O: Operation<'o>> Request<'o, O> { { O::source_ino(self) } + + pub fn block(&self) -> u64 + where + O: RequestBlock<'o>, + { + O::block(self) + } + + pub fn block_size(&self) -> u32 + where + O: RequestBlock<'o>, + { + O::block_size(self) + } } impl<'o, O: Operation<'o>> Reply<'o, O> { @@ -304,4 +318,11 @@ impl<'o, O: Operation<'o>> Reply<'o, O> { { O::buffer_too_small(self) } + + pub fn block(self, block: u64) -> Done<'o> + where + O: ReplyBlock<'o>, + { + O::block(self, block) + } } diff --git a/src/proto.rs b/src/proto.rs index 7e81201..5587d89 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -520,6 +520,12 @@ pub struct BmapIn { #[derive(Pod, Zeroable, Copy, Clone)] #[repr(C)] +pub struct BmapOut { + pub block: u64, +} + +#[derive(Pod, Zeroable, Copy, Clone)] +#[repr(C)] pub struct IoctlIn { pub fh: u64, pub flags: u32, diff --git a/src/session.rs b/src/session.rs index 7fb1d16..80101cc 100644 --- a/src/session.rs +++ b/src/session.rs @@ -81,6 +81,7 @@ pub enum Dispatch<'o> { Fsyncdir(Incoming<'o, ops::Fsyncdir>), Access(Incoming<'o, ops::Access>), Create(Incoming<'o, ops::Create>), + Bmap(Incoming<'o, ops::Bmap>), } pub struct Incoming<'o, O: Operation<'o>> { @@ -282,6 +283,7 @@ impl<'o> Dispatch<'o> { Fsyncdir(incoming) => incoming.common, Access(incoming) => incoming.common, Create(incoming) => incoming.common, + Bmap(incoming) => incoming.common, }; common.into_generic_op() @@ -370,6 +372,7 @@ impl Endpoint<'_> { Fsyncdir => dispatch!(Fsyncdir), Access => dispatch!(Access), Create => dispatch!(Create), + Bmap => dispatch!(Bmap), BatchForget => dispatch!(Forget), ReaddirPlus => dispatch!(Readdir), |
