From d8f1a9f189f0d74887cbb896caacaf7f1f256607 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 9 Dec 2021 11:50:51 +0900 Subject: syscall: fallback to rename on renameat2 EINVAL ZFS appears to incorrectly return EINVAL on renameat2 when the operation is not supported: renameat2(AT_FDCWD, "...", AT_FDCWD, "...", RENAME_NOREPLACE) = -1 EINVAL Fall back to the racy rename in this case as well: --- lib/PublicInbox/Syscall.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm index bcfae2cb..2e3d9cb3 100644 --- a/lib/PublicInbox/Syscall.pm +++ b/lib/PublicInbox/Syscall.pm @@ -15,7 +15,7 @@ package PublicInbox::Syscall; use strict; use v5.10.1; use parent qw(Exporter); -use POSIX qw(ENOENT EEXIST ENOSYS O_NONBLOCK); +use POSIX qw(ENOENT EEXIST ENOSYS EINVAL O_NONBLOCK); use Config; # $VERSION = '0.25'; # Sys::Syscall version @@ -324,7 +324,7 @@ sub rename_noreplace ($$) { my $ret = syscall($SYS_renameat2, -100, $old, -100, $new, 1); if ($ret == 0) { 1; # like rename() perlop - } elsif ($! == ENOSYS) { + } elsif ($! == ENOSYS || $! == EINVAL) { undef $SYS_renameat2; _rename_noreplace_racy($old, $new); } else { -- cgit v1.2.3-24-ge0c7