summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-06 21:45:43 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-06 21:45:43 -0600
commit0f45ef90df6d036aec2077b702fdf465f61c16d6 (patch)
tree0abaef4cf55aa8aecc3ae985858bf870f6836e01 /src
parentf0e7c0997553ab356d5aa683d5322ab2de575188 (diff)
Implement Bmap
Diffstat (limited to 'src')
-rw-r--r--src/ops/inode.rs32
-rw-r--r--src/ops/mod.rs2
-rw-r--r--src/ops/traits.rs23
-rw-r--r--src/proto.rs6
-rw-r--r--src/session.rs3
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),