rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches
The changes in cfe46e2d4a git not catch
all situations.
In the case of a guest having 2 disk images with the same name on a pool
with the same name but in two different ceph clusters we still had
issues when starting it. The first disk got mapped as expected. The
second disk did not get mapped because we returned the old $path to
"/dev/rbd/<pool>/<image>" because it already existed from the first
disk.
In the case that only the "old" /dev/rbd path exists and we do not have
the /dev/rbd-pve/<cluster>/... path available, we now check if the
cluster fsid used by that rbd device matches the one we expect. If it
does, then we are in the situation that the image has been mapped before
the new rbd-pve udev rule was introduced. If it does not, then we have
the situation of an ambiguous mapping in /dev/rbd and return the
$pve_path.
Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
This commit is contained in:
committed by
Fabian Grünbichler
parent
e4671f734b
commit
a1528ffe8f
@ -3,6 +3,7 @@ package PVE::Storage::RBDPlugin;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Cwd qw(abs_path);
|
||||
use IO::File;
|
||||
use JSON;
|
||||
use Net::IP;
|
||||
@ -13,7 +14,7 @@ use PVE::JSONSchema qw(get_standard_option);
|
||||
use PVE::ProcFSTools;
|
||||
use PVE::RADOS;
|
||||
use PVE::Storage::Plugin;
|
||||
use PVE::Tools qw(run_command trim);
|
||||
use PVE::Tools qw(run_command trim file_read_firstline);
|
||||
|
||||
use base qw(PVE::Storage::Plugin);
|
||||
|
||||
@ -66,7 +67,13 @@ my sub get_rbd_dev_path {
|
||||
my $pve_path = "/dev/rbd-pve/${cluster_id}/${rbd_path}";
|
||||
my $path = "/dev/rbd/${rbd_path}";
|
||||
|
||||
return $path if !-e $pve_path && -e $path; # mapped before rbd-pve udev rule existed
|
||||
if (!-e $pve_path && -e $path) {
|
||||
# possibly mapped before rbd-pve rule existed
|
||||
my $real_dev = abs_path($path);
|
||||
my ($rbd_id) = ($real_dev =~ m|/dev/rbd([0-9]+)$|);
|
||||
my $dev_cluster_id = file_read_firstline("/sys/devices/rbd/${rbd_id}/cluster_fsid");
|
||||
return $path if $cluster_id eq $dev_cluster_id;
|
||||
}
|
||||
return $pve_path;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user