* [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support @ 2025-11-11 14:37 Kefu Chai 2025-11-11 14:38 ` [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation Kefu Chai 0 siblings, 1 reply; 3+ messages in thread From: Kefu Chai @ 2025-11-11 14:37 UTC (permalink / raw) To: pve-devel This patch implements the rename operation in proxmox-fuse-rs, which was previously unimplemented due to lack of use cases. The rust rewrite of pve-cluster uses proxmox-fuse-rs for its FUSE integration and requires rename support for files exposed by plugins. This implementation ensures feature parity with the C version of pve-cluster. Kefu Chai (1): add rename operation src/requests.rs | 25 +++++++++++++++++++++++++ src/session.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel ^ permalink raw reply [flat|nested] 3+ messages in thread
* [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation 2025-11-11 14:37 [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support Kefu Chai @ 2025-11-11 14:38 ` Kefu Chai 0 siblings, 0 replies; 3+ messages in thread From: Kefu Chai @ 2025-11-11 14:38 UTC (permalink / raw) To: pve-devel rename operation is required when implementing the rust rewrite of pmxcfs, which delegates the rename operations to the underlying plugin which exposes the renamed file. Signed-off-by: Kefu Chai <k.chai@proxmox.com> --- src/requests.rs | 25 +++++++++++++++++++++++++ src/session.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/requests.rs b/src/requests.rs index 9bdab30..6799496 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -118,6 +118,7 @@ pub enum Request { Rmdir(Rmdir), Write(Write), Readlink(Readlink), + Rename(Rename), ListXAttrSize(ListXAttrSize), ListXAttr(ListXAttr), GetXAttrSize(GetXAttrSize), @@ -155,6 +156,7 @@ impl FuseRequest for Request { Request::Rmdir(r) => r.fail(errno), Request::Write(r) => r.fail(errno), Request::Readlink(r) => r.fail(errno), + Request::Rename(r) => r.fail(errno), Request::ListXAttrSize(r) => r.fail(errno), Request::ListXAttr(r) => r.fail(errno), Request::GetXAttrSize(r) => r.fail(errno), @@ -681,6 +683,29 @@ impl Rmdir { } } +/// Rename a file or directory. +#[derive(Debug)] +pub struct Rename { + pub(crate) request: RequestGuard, + pub parent: u64, + pub name: OsString, + pub new_parent: u64, + pub new_name: OsString, + pub flags: libc::c_int, +} + +impl FuseRequest for Rename { + fn fail(self, errno: libc::c_int) -> io::Result<()> { + reply_err(self.request, errno) + } +} + +impl Rename { + pub fn reply(self) -> io::Result<()> { + reply_err(self.request, 0) + } +} + /// Write to a file. #[derive(Debug)] pub struct Write { diff --git a/src/session.rs b/src/session.rs index 427ce46..a38593e 100644 --- a/src/session.rs +++ b/src/session.rs @@ -328,6 +328,32 @@ impl FuseData { })); } + extern "C" fn rename( + request: sys::Request, + parent: u64, + name: sys::StrPtr, + new_parent: u64, + new_name: sys::StrPtr, + flags: libc::c_int, + ) { + let fuse_data = unsafe { &*(sys::fuse_req_userdata(request) as *mut FuseData) }; + let name = unsafe { CStr::from_ptr(name) }; + let name = OsStr::from_bytes(name.to_bytes()).to_owned(); + let new_name = unsafe { CStr::from_ptr(new_name) }; + let new_name = OsStr::from_bytes(new_name.to_bytes()).to_owned(); + fuse_data + .pending_requests + .borrow_mut() + .push_back(Request::Rename(requests::Rename { + request: RequestGuard::from_raw(request), + parent, + name, + new_parent, + new_name, + flags, + })); + } + extern "C" fn write( request: sys::Request, inode: u64, @@ -533,6 +559,12 @@ impl FuseSessionBuilder { self } + /// Enable `Rename` requests. + pub fn enable_rename(mut self) -> Self { + self.operations.rename = Some(FuseData::rename); + self + } + /// Enable `Read` requests. pub fn enable_read(mut self) -> Self { self.operations.read = Some(FuseData::read); -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel ^ permalink raw reply [flat|nested] 3+ messages in thread
* [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support @ 2025-11-11 13:53 Kefu Chai 2025-11-11 13:53 ` [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation Kefu Chai 0 siblings, 1 reply; 3+ messages in thread From: Kefu Chai @ 2025-11-11 13:53 UTC (permalink / raw) To: pve-devel This patch implements the rename operation in proxmox-fuse-rs, which was previously unimplemented due to lack of use cases. The rust rewrite of pve-cluster uses proxmox-fuse-rs for its FUSE integration and requires rename support for files exposed by plugins. This implementation ensures feature parity with the C version of pve-cluster. Kefu Chai (1): add rename operation src/requests.rs | 25 +++++++++++++++++++++++++ src/session.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel ^ permalink raw reply [flat|nested] 3+ messages in thread
* [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation 2025-11-11 13:53 [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support Kefu Chai @ 2025-11-11 13:53 ` Kefu Chai 0 siblings, 0 replies; 3+ messages in thread From: Kefu Chai @ 2025-11-11 13:53 UTC (permalink / raw) To: pve-devel rename operation is required when implementing the rust rewrite of pmxcfs, which delegates the rename operations to the underlying plugin which exposes the renamed file. Signed-off-by: Kefu Chai <k.chai@proxmox.com> --- src/requests.rs | 25 +++++++++++++++++++++++++ src/session.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/requests.rs b/src/requests.rs index 9bdab30..6799496 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -118,6 +118,7 @@ pub enum Request { Rmdir(Rmdir), Write(Write), Readlink(Readlink), + Rename(Rename), ListXAttrSize(ListXAttrSize), ListXAttr(ListXAttr), GetXAttrSize(GetXAttrSize), @@ -155,6 +156,7 @@ impl FuseRequest for Request { Request::Rmdir(r) => r.fail(errno), Request::Write(r) => r.fail(errno), Request::Readlink(r) => r.fail(errno), + Request::Rename(r) => r.fail(errno), Request::ListXAttrSize(r) => r.fail(errno), Request::ListXAttr(r) => r.fail(errno), Request::GetXAttrSize(r) => r.fail(errno), @@ -681,6 +683,29 @@ impl Rmdir { } } +/// Rename a file or directory. +#[derive(Debug)] +pub struct Rename { + pub(crate) request: RequestGuard, + pub parent: u64, + pub name: OsString, + pub new_parent: u64, + pub new_name: OsString, + pub flags: libc::c_int, +} + +impl FuseRequest for Rename { + fn fail(self, errno: libc::c_int) -> io::Result<()> { + reply_err(self.request, errno) + } +} + +impl Rename { + pub fn reply(self) -> io::Result<()> { + reply_err(self.request, 0) + } +} + /// Write to a file. #[derive(Debug)] pub struct Write { diff --git a/src/session.rs b/src/session.rs index 427ce46..a38593e 100644 --- a/src/session.rs +++ b/src/session.rs @@ -328,6 +328,32 @@ impl FuseData { })); } + extern "C" fn rename( + request: sys::Request, + parent: u64, + name: sys::StrPtr, + new_parent: u64, + new_name: sys::StrPtr, + flags: libc::c_int, + ) { + let fuse_data = unsafe { &*(sys::fuse_req_userdata(request) as *mut FuseData) }; + let name = unsafe { CStr::from_ptr(name) }; + let name = OsStr::from_bytes(name.to_bytes()).to_owned(); + let new_name = unsafe { CStr::from_ptr(new_name) }; + let new_name = OsStr::from_bytes(new_name.to_bytes()).to_owned(); + fuse_data + .pending_requests + .borrow_mut() + .push_back(Request::Rename(requests::Rename { + request: RequestGuard::from_raw(request), + parent, + name, + new_parent, + new_name, + flags, + })); + } + extern "C" fn write( request: sys::Request, inode: u64, @@ -533,6 +559,12 @@ impl FuseSessionBuilder { self } + /// Enable `Rename` requests. + pub fn enable_rename(mut self) -> Self { + self.operations.rename = Some(FuseData::rename); + self + } + /// Enable `Read` requests. pub fn enable_read(mut self) -> Self { self.operations.read = Some(FuseData::read); -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-11-14 14:24 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-11-11 14:37 [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support Kefu Chai 2025-11-11 14:38 ` [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation Kefu Chai -- strict thread matches above, loose matches on Subject: below -- 2025-11-11 13:53 [pve-devel] [PATCH proxmox-fuse-rs 0/1] Add rename operation support Kefu Chai 2025-11-11 13:53 ` [pve-devel] [PATCH proxmox-fuse-rs 1/1] add rename operation Kefu Chai
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox