From: Wolfgang Bumiller <w.bumiller@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox] fs: link fallback for atomic create
Date: Thu, 22 Jul 2021 09:33:19 +0200 [thread overview]
Message-ID: <20210722073319.55913-1-w.bumiller@proxmox.com> (raw)
Some file systems don't support renameat2's RENAME_NOREPLACE
flag (eg. ZFS), at the some time, some other file systems
don't support hardlinks via link (eg. vfat, cifs), so we now
try both: first the rename (since it's more efficient), then
link+unlink for the rest.
If both fail, the file system is simply not supported for
our purposes anyway...
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
---
proxmox/src/tools/fs.rs | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/proxmox/src/tools/fs.rs b/proxmox/src/tools/fs.rs
index 8087cc8..1a2a51f 100644
--- a/proxmox/src/tools/fs.rs
+++ b/proxmox/src/tools/fs.rs
@@ -236,14 +236,22 @@ pub fn atomic_open_or_create_file<P: AsRef<Path>>(
// the initialization, the first one wins!
let rename_result = temp_file_name.with_nix_path(|c_file_name| {
path.with_nix_path(|new_path| unsafe {
- let rc = libc::renameat2(
+ // This also works on file systems which don't support hardlinks (eg. vfat)
+ match Errno::result(libc::renameat2(
libc::AT_FDCWD,
c_file_name.as_ptr(),
libc::AT_FDCWD,
new_path.as_ptr(),
libc::RENAME_NOREPLACE,
- );
- nix::errno::Errno::result(rc)
+ )) {
+ Err(nix::Error::Sys(Errno::EINVAL)) => (), // dumb file system, try `link`+`unlink`
+ other => return other,
+ };
+ // but some file systems don't support `RENAME_NOREPLACE`
+ // so we just use `link` + `unlink` instead
+ let result = Errno::result(libc::link(c_file_name.as_ptr(), new_path.as_ptr()));
+ let _ = libc::unlink(c_file_name.as_ptr());
+ result
})
});
--
2.30.2
next reply other threads:[~2021-07-22 7:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-22 7:33 Wolfgang Bumiller [this message]
2021-07-22 7:44 ` [pbs-devel] applied: " Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210722073319.55913-1-w.bumiller@proxmox.com \
--to=w.bumiller@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.