From 894b9ecc1e251facb2f05d74e41807a366eb45f0 Mon Sep 17 00:00:00 2001 From: Wolfgang Link Date: Thu, 19 Apr 2018 08:39:50 +0200 Subject: [PATCH] fix #1691: replace udev check `zfs create` add the creation job in a worker queue, which should normally execute instantly. But there are circumstances where the job will take a while to get processed. If this is the case udev settle will see no dev in the queue and the program will continue without an allocated dev. The busy waiting is not best practice but the only way to be sure, that the block device exists. --- PVE/Storage/ZFSPoolPlugin.pm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index e864a58..9680a94 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -211,9 +211,14 @@ sub alloc_image { $class->zfs_create_zvol($scfg, $volname, $size); my $devname = "/dev/zvol/$scfg->{pool}/$volname"; - run_command("udevadm trigger --subsystem-match block"); - system('udevadm', 'settle', '--timeout', '10', "--exit-if-exists=${devname}"); + my $timeout = 10; + for (my $i = 1; $i <= $timeout; $i++) { + last if -b $devname; + die "Timeout: no zvol after $timeout sec found.\n" + if $i == $timeout; + sleep(1); + } } elsif ( $fmt eq 'subvol') { die "illegal name '$volname' - sould be 'subvol-$vmid-*'\n"