fix(tvix/castore/fs): use io::copy to fill kernel-provided buffer
The docs state we must fill all of the buffer, except on EOF. Change-Id: Id977ba99c0b15132422474ebbf82bb92b79d55ba Reviewed-on: https://cl.tvl.fyi/c/depot/+/11446 Tested-by: BuildkiteCI Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
parent
bfd342873c
commit
99bc926d1e
1 changed files with 12 additions and 3 deletions
|
@ -33,7 +33,6 @@ use fuse_backend_rs::api::filesystem::{
|
||||||
};
|
};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use std::ffi::CStr;
|
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
|
@ -42,11 +41,12 @@ use std::{
|
||||||
sync::{atomic::Ordering, Arc},
|
sync::{atomic::Ordering, Arc},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
use std::{ffi::CStr, io::Cursor};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
io::{AsyncReadExt, AsyncSeekExt},
|
io::{AsyncReadExt, AsyncSeekExt},
|
||||||
sync::mpsc,
|
sync::mpsc,
|
||||||
};
|
};
|
||||||
use tracing::{debug, instrument, warn, Span};
|
use tracing::{debug, error, instrument, warn, Span};
|
||||||
|
|
||||||
/// This implements a read-only FUSE filesystem for a tvix-store
|
/// This implements a read-only FUSE filesystem for a tvix-store
|
||||||
/// with the passed [BlobService], [DirectoryService] and [RootNodes].
|
/// with the passed [BlobService], [DirectoryService] and [RootNodes].
|
||||||
|
@ -767,7 +767,16 @@ where
|
||||||
Ok::<_, std::io::Error>(buf)
|
Ok::<_, std::io::Error>(buf)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
w.write(&buf)
|
// We cannot use w.write() here, we're required to call write multiple
|
||||||
|
// times until we wrote the entirety of the buffer (which is `size`, except on EOF).
|
||||||
|
let buf_len = buf.len();
|
||||||
|
let bytes_written = io::copy(&mut Cursor::new(buf), w)?;
|
||||||
|
if bytes_written != buf_len as u64 {
|
||||||
|
error!(bytes_written=%bytes_written, "unable to write all of buf to kernel");
|
||||||
|
return Err(io::Error::from_raw_os_error(libc::EIO));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(bytes_written as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip_all, fields(rq.inode = inode))]
|
#[tracing::instrument(skip_all, fields(rq.inode = inode))]
|
||||||
|
|
Loading…
Reference in a new issue