summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2021-12-29 05:38:27 -0600
committerAlejandro Soto <alejandro@34project.org>2021-12-29 05:38:32 -0600
commit702924d18d1f8e875a24defa5738f11565d8b020 (patch)
tree44f33cd5f0d2abb6d441fa71e91d2d62c6a096e3
parent48efcd0ce8c8a9ac51dc80c6ec49c63f6694b031 (diff)
Implement Reply::all() for Write
-rw-r--r--src/fuse/ops.rs32
-rw-r--r--src/proto.rs7
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,