all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [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
  2026-03-09  9:40 ` Kefu Chai
  0 siblings, 2 replies; 4+ 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] 4+ 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
  2026-03-12  8:55   ` applied: " Wolfgang Bumiller
  2026-03-09  9:40 ` Kefu Chai
  1 sibling, 1 reply; 4+ 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] 4+ messages in thread

* Re: [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
@ 2026-03-09  9:40 ` Kefu Chai
  1 sibling, 0 replies; 4+ messages in thread
From: Kefu Chai @ 2026-03-09  9:40 UTC (permalink / raw)
  To: Wolfgang Bumiller, Kefu Chai, pve-devel

Hi Wolfgang,

Could you please help review this change?

On Thu Feb 12, 2026 at 3:09 PM CST, Kefu Chai wrote:
> 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] 4+ messages in thread

* applied: [PATCH proxmox-fuse-rs v1] Add statfs support to proxmox-fuse
  2026-02-12  7:05 ` Kefu Chai
@ 2026-03-12  8:55   ` Wolfgang Bumiller
  0 siblings, 0 replies; 4+ messages in thread
From: Wolfgang Bumiller @ 2026-03-12  8:55 UTC (permalink / raw)
  To: Kefu Chai; +Cc: pve-devel

applied

I added a small follow-up commit, see the comment below inline.

I also added `#[non_exhaustive]` to `Request` so we can add entries
without major version bumps.

Bumped to v3 so it can be used right away.

On Thu, Feb 12, 2026 at 03:05:47PM +0800, Kefu Chai wrote:
> - 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 _))

The cast here is actually not necessary. Initially I just replaced it
with `&raw const *stbuf` (since `&raw {const,mut}` is a thing now in
rust) - only after pushing out the change did I realize that the cast is
actually completely unnecessary, since references are automatically
converted to pointers in this case anyway...

> +    }
> +}
> +
>  /// 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] 4+ messages in thread

end of thread, other threads:[~2026-03-12  8:55 UTC | newest]

Thread overview: 4+ 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
2026-03-12  8:55   ` applied: " Wolfgang Bumiller
2026-03-09  9:40 ` 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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal