summaryrefslogtreecommitdiff
path: root/src/fuse
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse')
-rw-r--r--src/fuse/ops.rs32
1 files changed, 31 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 {