* [PATCH proxmox-fuse-rs v1] Add statfs support to proxmox-fuse
@ 2026-02-12 7:05 Kefu Chai
2026-02-12 7:05 ` Kefu Chai
0 siblings, 1 reply; 2+ messages in thread
From: Kefu Chai @ 2026-02-12 7:05 UTC (permalink / raw)
To: pve-devel
Hello,
This patch adds statfs operation support to proxmox-fuse to maintain
feature parity with the C implementation of pmxcfs.
The current C implementation of pmxcfs includes statfs support, which
is needed for the Rust rewrite to be functionally equivalent. This
patch implements the missing statfs operation in the proxmox-fuse
crate.
Regards,
Kefu
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH proxmox-fuse-rs v1] Add statfs support to proxmox-fuse
2026-02-12 7:05 [PATCH proxmox-fuse-rs v1] Add statfs support to proxmox-fuse Kefu Chai
@ 2026-02-12 7:05 ` Kefu Chai
0 siblings, 0 replies; 2+ messages in thread
From: Kefu Chai @ 2026-02-12 7:05 UTC (permalink / raw)
To: pve-devel
- Add fuse_reply_statfs FFI binding in sys.rs
- Add Statfs request struct in requests.rs
- Add Statfs variant to Request enum
- Add statfs callback to FuseData
- Add enable_statfs() method to FuseSessionBuilder
This enables filesystems to handle statfs requests and return filesystem statistics.
Signed-off-by: Kefu Chai <k.chai@proxmox.com>
---
examples/tmpfs/main.rs | 4 ++--
src/requests.rs | 24 ++++++++++++++++++++++++
src/session.rs | 17 +++++++++++++++++
src/sys.rs | 1 +
4 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/examples/tmpfs/main.rs b/examples/tmpfs/main.rs
index f3f7d26..36db9e8 100644
--- a/examples/tmpfs/main.rs
+++ b/examples/tmpfs/main.rs
@@ -3,11 +3,11 @@ use std::ffi::OsStr;
use std::path::Path;
use std::{io, mem};
-use anyhow::{bail, format_err, Error};
+use anyhow::{Error, bail, format_err};
use futures::future::FutureExt;
use futures::select;
use futures::stream::TryStreamExt;
-use tokio::signal::unix::{signal, SignalKind};
+use tokio::signal::unix::{SignalKind, signal};
use proxmox_fuse::requests::{self, FuseRequest, SetTime};
use proxmox_fuse::{EntryParam, Fuse, ReplyBufState, Request};
diff --git a/src/requests.rs b/src/requests.rs
index d1846cc..458b956 100644
--- a/src/requests.rs
+++ b/src/requests.rs
@@ -106,6 +106,7 @@ pub enum Request {
Forget(Forget),
Getattr(Getattr),
Setattr(Setattr),
+ Statfs(Statfs),
Readdir(Readdir),
ReaddirPlus(ReaddirPlus),
Mkdir(Mkdir),
@@ -144,6 +145,7 @@ impl FuseRequest for Request {
Request::Lookup(r) => r.fail(errno),
Request::Getattr(r) => r.fail(errno),
Request::Setattr(r) => r.fail(errno),
+ Request::Statfs(r) => r.fail(errno),
Request::Readdir(r) => r.fail(errno),
Request::ReaddirPlus(r) => r.fail(errno),
Request::Mkdir(r) => r.fail(errno),
@@ -239,6 +241,28 @@ impl Getattr {
}
}
+/// Get filesystem statistics.
+///
+/// This is the equivalent of a `statfs` call.
+#[derive(Debug)]
+pub struct Statfs {
+ pub(crate) request: RequestGuard,
+ pub inode: u64,
+}
+
+impl FuseRequest for Statfs {
+ fn fail(self, errno: libc::c_int) -> io::Result<()> {
+ reply_err(self.request, errno)
+ }
+}
+
+impl Statfs {
+ /// Send a reply for a `Statfs` request.
+ pub fn reply(self, stbuf: &libc::statvfs) -> io::Result<()> {
+ reply_result!(self: sys::fuse_reply_statfs(self.request.raw, stbuf as *const _))
+ }
+}
+
/// Get the contents of a directory without changing any lookup counts. (Contrary to
/// `ReaddirPlus`).
#[derive(Debug)]
diff --git a/src/session.rs b/src/session.rs
index 62a8a9e..3e4841c 100644
--- a/src/session.rs
+++ b/src/session.rs
@@ -94,6 +94,17 @@ impl FuseData {
}));
}
+ extern "C" fn statfs(request: sys::Request, inode: u64) {
+ let fuse_data = unsafe { &*(sys::fuse_req_userdata(request) as *mut FuseData) };
+ fuse_data
+ .pending_requests
+ .borrow_mut()
+ .push_back(Request::Statfs(requests::Statfs {
+ request: RequestGuard::from_raw(request),
+ inode,
+ }));
+ }
+
extern "C" fn readdir(
request: sys::Request,
inode: u64,
@@ -547,6 +558,12 @@ impl FuseSessionBuilder {
self
}
+ /// Enable `Statfs` requests.
+ pub fn enable_statfs(mut self) -> Self {
+ self.operations.statfs = Some(FuseData::statfs);
+ self
+ }
+
/// Enable `Unlink` requests.
pub fn enable_unlink(mut self) -> Self {
self.operations.unlink = Some(FuseData::unlink);
diff --git a/src/sys.rs b/src/sys.rs
index 17a01de..186b0ec 100644
--- a/src/sys.rs
+++ b/src/sys.rs
@@ -77,6 +77,7 @@ unsafe extern "C" {
pub fn fuse_reply_readlink(req: Request, link: StrPtr) -> c_int;
pub fn fuse_reply_none(req: Request);
pub fn fuse_reply_write(req: Request, count: libc::size_t) -> c_int;
+ pub fn fuse_reply_statfs(req: Request, stbuf: *const libc::statvfs) -> c_int;
pub fn fuse_req_userdata(req: Request) -> MutPtr;
pub fn fuse_add_direntry_plus(req: Request, buf: MutStrPtr, bufsize: size_t, name: StrPtr, stbuf: Option<&EntryParam>, off: c_int) -> size_t;
pub fn fuse_add_direntry(req: Request, buf: MutStrPtr, bufsize: size_t, name: StrPtr, stbuf: Option<&libc::stat>, off: c_int) -> size_t;
--
2.47.3
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-02-12 7:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-12 7:05 [PATCH proxmox-fuse-rs v1] Add statfs support to proxmox-fuse Kefu Chai
2026-02-12 7:05 ` Kefu Chai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.