summaryrefslogtreecommitdiff
path: root/src/ops/rw.rs
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-06 08:18:58 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-06 08:18:58 -0600
commitb3a9082a8b81c28ef81dbaaffe171f646b1f2777 (patch)
treed878ad0185657eff76426888d46420b48e47725b /src/ops/rw.rs
parenta65325e15844f880132a69b447e4aec983cb30ab (diff)
Implement Fsync/Fsyncdir
Diffstat (limited to 'src/ops/rw.rs')
-rw-r--r--src/ops/rw.rs52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/ops/rw.rs b/src/ops/rw.rs
index cf2e286..4f5bad4 100644
--- a/src/ops/rw.rs
+++ b/src/ops/rw.rs
@@ -1,14 +1,18 @@
use super::{
- traits::{ReplyGather, ReplyOk, RequestData, RequestHandle, RequestOffset, RequestSize},
+ traits::{
+ ReplyGather, ReplyOk, RequestData, RequestFlags, RequestHandle, RequestOffset, RequestSize,
+ },
FromRequest,
};
-use crate::{private_trait::Sealed, proto, Done, Operation, Reply, Request};
+use crate::{io::FsyncFlags, private_trait::Sealed, proto, Done, Operation, Reply, Request};
pub enum Readlink {}
pub enum Read {}
pub enum Write {}
+pub enum Fsync {}
pub enum Flush {}
+pub enum Fsyncdir {}
pub struct WriteState {
size: u32,
@@ -21,7 +25,9 @@ pub trait ReplyAll<'o>: Operation<'o> {
impl Sealed for Readlink {}
impl Sealed for Read {}
impl Sealed for Write {}
+impl Sealed for Fsync {}
impl Sealed for Flush {}
+impl Sealed for Fsyncdir {}
impl<'o> Operation<'o> for Readlink {
type RequestBody = ();
@@ -38,11 +44,21 @@ impl<'o> Operation<'o> for Write {
type ReplyState = WriteState;
}
+impl<'o> Operation<'o> for Fsync {
+ type RequestBody = &'o proto::FsyncIn;
+ type ReplyState = ();
+}
+
impl<'o> Operation<'o> for Flush {
type RequestBody = &'o proto::FlushIn;
type ReplyState = ();
}
+impl<'o> Operation<'o> for Fsyncdir {
+ type RequestBody = &'o proto::FsyncdirIn;
+ type ReplyState = ();
+}
+
impl<'o> ReplyGather<'o> for Readlink {}
impl<'o> RequestHandle<'o> for Read {
@@ -93,6 +109,22 @@ impl<'o> ReplyAll<'o> for Write {
}
}
+impl<'o> RequestHandle<'o> for Fsync {
+ fn handle(request: &Request<'o, Self>) -> u64 {
+ request.body.fh
+ }
+}
+
+impl<'o> RequestFlags<'o> for Fsync {
+ type Flags = FsyncFlags;
+
+ fn flags(request: &Request<'o, Self>) -> Self::Flags {
+ FsyncFlags::from_bits_truncate(request.body.fsync_flags)
+ }
+}
+
+impl<'o> ReplyOk<'o> for Fsync {}
+
impl<'o> RequestHandle<'o> for Flush {
fn handle(request: &Request<'o, Self>) -> u64 {
request.body.fh
@@ -101,6 +133,22 @@ impl<'o> RequestHandle<'o> for Flush {
impl<'o> ReplyOk<'o> for Flush {}
+impl<'o> RequestHandle<'o> for Fsyncdir {
+ fn handle(request: &Request<'o, Self>) -> u64 {
+ request.body.fsync_in.fh
+ }
+}
+
+impl<'o> RequestFlags<'o> for Fsyncdir {
+ type Flags = FsyncFlags;
+
+ fn flags(request: &Request<'o, Self>) -> Self::Flags {
+ FsyncFlags::from_bits_truncate(request.body.fsync_in.fsync_flags)
+ }
+}
+
+impl<'o> ReplyOk<'o> for Fsyncdir {}
+
impl<'o> FromRequest<'o, Write> for WriteState {
fn from_request(request: &Request<'o, Write>) -> Self {
let (body, data) = request.body;