use strict;
use warnings;
+use Cwd qw(abs_path);
use IO::File;
use JSON;
use Net::IP;
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);
my $librados_connect = sub {
my ($scfg, $storeid, $options) = @_;
- my $librados_config = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
+ my $librados_config = PVE::CephConfig::ceph_connect_option($scfg, $storeid, $options->%*);
my $rados = PVE::RADOS->new(%$librados_config);
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;
}
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
$name .= '@'.$snapname if $snapname;
- my $rbd_dev_path = get_rbd_dev_path($scfg, $storeid, $name);
- return ($rbd_dev_path, $vmid, $vtype) if $scfg->{krbd};
+ if ($scfg->{krbd}) {
+ my $rbd_dev_path = get_rbd_dev_path($scfg, $storeid, $name);
+ return ($rbd_dev_path, $vmid, $vtype);
+ }
my $rbd_path = get_rbd_path($scfg, $name);
my $path = "rbd:${rbd_path}";