Skip to content

Commit 1aa38b2

Browse files
xujihui1985imeoer
authored andcommitted
refactor: extract with_writer on FuseSession for notify api
1 parent 353b0ee commit 1aa38b2

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

src/api/server/mod.rs

-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ pub const MAX_REQ_PAGES: u16 = 256; // 1MB
5151
pub struct Server<F: FileSystem + Sync> {
5252
fs: F,
5353
vers: ArcSwap<ServerVersion>,
54-
enabled: Option<FsOptions>,
5554
}
5655

5756
impl<F: FileSystem + Sync> Server<F> {
@@ -63,7 +62,6 @@ impl<F: FileSystem + Sync> Server<F> {
6362
major: KERNEL_VERSION,
6463
minor: KERNEL_MINOR_VERSION,
6564
})),
66-
enabled: None,
6765
}
6866
}
6967
}

src/api/server/sync_io.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,15 @@ impl<F: FileSystem + Sync> Server<F> {
6363
&self,
6464
mut w: FuseDevWriter<'_, S>,
6565
) -> Result<()> {
66-
if !self.enabled.map_or(false,|enabled| {
67-
enabled.contains(FsOptions::HAS_RESEND)
68-
}) {
69-
return Ok(0)
70-
}
7166
let mut buffer_writer = w.split_at(0).map_err(Error::FailedToSplitWriter)?;
7267
let mut header = OutHeader::default();
7368
header.unique = 0;
7469
header.error = NotifyOpcode::Resend as i32;
7570
buffer_writer
7671
.write_obj(header)
7772
.map_err(Error::FailedToWrite)?;
78-
buffer_writer.commit(None).map_err(Error::InvalidMessage)
73+
buffer_writer.commit(None).map_err(Error::InvalidMessage)?;
74+
Ok(())
7975
}
8076

8177
/// Main entrance to handle requests from the transport layer.
@@ -765,7 +761,6 @@ impl<F: FileSystem + Sync> Server<F> {
765761
}
766762
let vers = ServerVersion { major, minor };
767763
self.vers.store(Arc::new(vers));
768-
self.enabled = Some(enabled);
769764
if minor < KERNEL_MINOR_VERSION_INIT_OUT_SIZE {
770765
ctx.reply_ok(
771766
Some(

src/transport/fusedev/linux_session.rs

+13
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,19 @@ impl FuseSession {
238238
}
239239
}
240240

241+
/// Create a new fuse message channel with a specific buffer size.
242+
pub fn with_writer<F>(&mut self, f: F)
243+
where
244+
F: FnOnce(FuseDevWriter),
245+
{
246+
if let Some(file) = &self.file {
247+
let fd = file.as_raw_fd();
248+
let mut buf = vec![0x0u8; self.bufsize];
249+
let writer = FuseDevWriter::new(fd, &mut buf).unwrap();
250+
f(writer);
251+
}
252+
}
253+
241254
/// Wake channel loop and exit
242255
pub fn wake(&self) -> Result<()> {
243256
let wakers = self

tests/passthrough/src/main.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use fuse_backend_rs::transport::FuseDevWriter;
2+
use fuse_backend_rs::transport::Writer;
13
use log::{error, info, warn, LevelFilter};
24
use std::env;
35
use std::fs;
@@ -11,6 +13,7 @@ use signal_hook::{consts::TERM_SIGNALS, iterator::Signals};
1113
use fuse_backend_rs::api::{server::Server, Vfs, VfsOptions};
1214
use fuse_backend_rs::passthrough::{Config, PassthroughFs};
1315
use fuse_backend_rs::transport::{FuseChannel, FuseSession};
16+
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
1417

1518
use simple_logger::SimpleLogger;
1619

@@ -58,6 +61,11 @@ impl Daemon {
5861
let mut se =
5962
FuseSession::new(Path::new(&self.mountpoint), "testpassthrough", "", false).unwrap();
6063
se.mount().unwrap();
64+
65+
se.with_writer(|writer| {
66+
self.server.notify_resend(writer).unwrap();
67+
});
68+
6169
for _ in 0..self.thread_cnt {
6270
let mut server = FuseServer {
6371
server: self.server.clone(),

0 commit comments

Comments
 (0)