migration: check_local_resources for virtiofs

add dir mapping checks to check_local_resources

Since the VM needs to be powered off for migration, migration should
work with a directory on shared storage with all caching settings.

Signed-off-by: Markus Frank <m.frank@proxmox.com>
Link: https://lore.proxmox.com/20250407134950.265270-5-m.frank@proxmox.com
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Markus Frank 2025-04-07 15:49:44 +02:00 committed by Thomas Lamprecht
parent 87b22e3839
commit 7bfffaee5f
2 changed files with 16 additions and 1 deletions

View File

@ -2496,6 +2496,7 @@ sub check_local_resources {
my $nodelist = PVE::Cluster::get_nodelist();
my $pci_map = PVE::Mapping::PCI::config();
my $usb_map = PVE::Mapping::USB::config();
my $dir_map = PVE::Mapping::Dir::config();
my $missing_mappings_by_node = { map { $_ => [] } @$nodelist };
@ -2507,6 +2508,8 @@ sub check_local_resources {
$entry = PVE::Mapping::PCI::get_node_mapping($pci_map, $id, $node);
} elsif ($type eq 'usb') {
$entry = PVE::Mapping::USB::get_node_mapping($usb_map, $id, $node);
} elsif ($type eq 'dir') {
$entry = PVE::Mapping::Dir::get_node_mapping($dir_map, $id, $node);
}
if (!scalar($entry->@*)) {
push @{$missing_mappings_by_node->{$node}}, $key;
@ -2546,9 +2549,14 @@ sub check_local_resources {
next if !$state;
}
}
if ($k =~ m/^virtiofs/) {
my $entry = parse_property_string('pve-qm-virtiofs', $conf->{$k});
$add_missing_mapping->('dir', $k, $entry->{dirid});
$mapped_res->{$k} = { name => $entry->{dirid} };
}
# sockets are safe: they will recreated be on the target side post-migrate
next if $k =~ m/^serial/ && ($conf->{$k} eq 'socket');
push @loc_res, $k if $k =~ m/^(usb|hostpci|serial|parallel)\d+$/;
push @loc_res, $k if $k =~ m/^(usb|hostpci|serial|parallel|virtiofs)\d+$/;
}
die "VM uses local resources\n" if scalar @loc_res && !$noerr;

View File

@ -90,6 +90,13 @@ $mapping_pci_module->mock(
},
);
our $mapping_dir_module = Test::MockModule->new("PVE::Mapping::Dir");
$mapping_dir_module->mock(
config => sub {
return {};
},
);
our $ha_config_module = Test::MockModule->new("PVE::HA::Config");
$ha_config_module->mock(
vm_is_ha_managed => sub {