diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/fuse/ops.rs | 32 | ||||
| -rw-r--r-- | src/proto.rs | 7 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/fuse/ops.rs b/src/fuse/ops.rs index 21458c2..e27e900 100644 --- a/src/fuse/ops.rs +++ b/src/fuse/ops.rs @@ -226,7 +226,7 @@ op! { op! { Write { type RequestBody = (&'o proto::WriteIn, &'o [u8]); - type ReplyTail = (); + type ReplyTail = state::Write; } impl Request { @@ -242,6 +242,16 @@ op! { self.body.1 } } + + impl Reply { + pub fn all(self) -> Done<'o> { + let size = self.tail.size; + self.single(&proto::WriteOut { + size, + padding: Default::default(), + }) + } + } } op! { @@ -511,6 +521,10 @@ pub(crate) mod state { pub is_plus: bool, pub buffer: B, } + + pub struct Write { + pub size: u32, + } } impl<'o, O: Operation<'o>> FromRequest<'o, O> for () { @@ -525,6 +539,22 @@ impl<'o> FromRequest<'o, Open> for proto::OpenOutFlags { } } +impl<'o> FromRequest<'o, Write> for state::Write { + fn from_request(request: &Request<'o, Write>) -> Self { + let (body, data) = request.body; + + if body.size as usize != data.len() { + log::warn!( + "Write size={} differs from data.len={}", + body.size, + data.len() + ); + } + + state::Write { size: body.size } + } +} + impl<'o> FromRequest<'o, Readdir> for state::Readdir<()> { fn from_request(request: &Request<'o, Readdir>) -> Self { state::Readdir { diff --git a/src/proto.rs b/src/proto.rs index 1ef33a5..128112d 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -295,6 +295,13 @@ pub struct WriteIn { #[derive(Pod, Zeroable, Copy, Clone)] #[repr(C)] +pub struct WriteOut { + pub size: u32, + pub padding: u32, +} + +#[derive(Pod, Zeroable, Copy, Clone)] +#[repr(C)] pub struct StatfsOut { pub blocks: u64, pub bfree: u64, |
