Syscalls/Tools: add renameat2

Mostly for the ability to atomically swap files.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2021-06-09 15:18:45 +02:00 committed by Thomas Lamprecht
parent 2531c455e8
commit bd9eb367a0
2 changed files with 11 additions and 0 deletions

View File

@ -17,6 +17,7 @@ BEGIN {
setresuid => &SYS_setresuid,
fchownat => &SYS_fchownat,
mount => &SYS_mount,
renameat2 => &SYS_renameat2,
# These use asm-generic, so they're the same across (sane) architectures. We use numbers
# since they're not in perl's syscall.ph yet...

View File

@ -105,6 +105,11 @@ use constant {O_PATH => 0x00200000,
use constant {AT_EMPTY_PATH => 0x1000,
AT_FDCWD => -100};
# from <linux/fs.h>
use constant {RENAME_NOREPLACE => (1 << 0),
RENAME_EXCHANGE => (1 << 1),
RENAME_WHITEOUT => (1 << 2)};
sub run_with_timeout {
my ($timeout, $code, @param) = @_;
@ -1462,6 +1467,11 @@ sub fsync($) {
return 0 == syscall(PVE::Syscall::fsync, $fileno);
}
sub renameat2($$$$$) {
my ($olddirfd, $oldpath, $newdirfd, $newpath, $flags) = @_;
return 0 == syscall(PVE::Syscall::renameat2, $olddirfd, $oldpath, $newdirfd, $newpath, $flags);
}
sub sync_mountpoint {
my ($path) = @_;
sysopen my $fd, $path, O_RDONLY|O_CLOEXEC or die "failed to open $path: $!\n";