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.
This commit is contained in:
Wolfgang Link
2018-04-19 08:39:50 +02:00
committed by Thomas Lamprecht
parent 32ad421e34
commit 894b9ecc1e

View File

@ -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"