From b3a9082a8b81c28ef81dbaaffe171f646b1f2777 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Thu, 6 Jan 2022 08:18:58 -0600 Subject: Implement Fsync/Fsyncdir --- src/ops/rw.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'src/ops/rw.rs') 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; -- cgit v1.2.3