From: Wolfgang Bumiller Date: Wed, 2 Nov 2016 11:25:50 +0000 (+0100) Subject: tempfile: unliked-file fallback X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=commitdiff_plain;h=7e1ee743f49add696a0a1f6773a9a847f737d9fd tempfile: unliked-file fallback some file systems (eg. ZFS) don't support O_TMPFILE --- diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 305e1bf..0be2efe 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -2,7 +2,7 @@ package PVE::Tools; use strict; use warnings; -use POSIX qw(EINTR EEXIST); +use POSIX qw(EINTR EEXIST EOPNOTSUPP); use IO::Socket::IP; use Socket qw(AF_INET AF_INET6 AI_ALL AI_V4MAPPED); use IO::Select; @@ -1308,8 +1308,13 @@ sub tempfile { my $mode = $opts{mode} // O_RDWR; $mode |= O_EXCL if !$opts{allow_links}; - my $fh = IO::File->new($dir, $mode | O_TMPFILE, $perm) - or die "failed to create tempfile: $!\n"; + my $fh = IO::File->new($dir, $mode | O_TMPFILE, $perm); + if (!$fh && $! == EOPNOTSUPP) { + $dir .= "/.tmpfile.$$"; + $fh = IO::File->new($dir, $mode | O_CREAT | O_EXCL, $perm); + unlink($dir) if $fh; + } + die "failed to create tempfile: $!\n" if !$fh; return $fh; }