From: Dominique Martinet Date: Thu, 9 Dec 2021 02:50:51 +0000 (+0900) Subject: syscall: fallback to rename on renameat2 EINVAL X-Git-Tag: v1.8.0~33 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=d8f1a9f189f0d74887cbb896caacaf7f1f256607 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: --- 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 {