[pve-devel] [PATCH] add scsi-block detection

Derumier Alexandre aderumier at odiso.com
Fri Mar 16 08:56:42 CET 2012


Signed-off-by: Derumier Alexandre <aderumier at odiso.com>
---
 PVE/QemuServer.pm |   48 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 3991606..13a7852 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -25,6 +25,7 @@ use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file
 use PVE::INotify;
 use PVE::ProcFSTools;
 use Time::HiRes qw(gettimeofday);
+use Unix::Mknod qw(:all);
 
 my $cpuinfo = PVE::ProcFSTools::read_cpuinfo();
 
@@ -904,9 +905,8 @@ sub print_drivedevice_full {
               } else {
                   $path = PVE::Storage::path($storecfg, $drive->{file});
               }
-              if ($path =~ m|^/dev/| ) {
-                  $devicetype = 'block';
-              }
+
+	      $devicetype = 'block' if path_is_scsi($path);
          }
 
 	$device = "scsi-$devicetype,bus=lsi$controller.0,scsi-id=$unit,drive=drive-$drive->{interface}$drive->{index},id=$drive->{interface}$drive->{index}";
@@ -2904,6 +2904,48 @@ sub vm_stopall {
     print $msg;
 }
 
+sub path_is_scsi {
+    my ($path) = @_;
+
+    return if ($path !~ m|^/dev/|);
+
+    my $bdev = undef;
+    #if path is /dev/xxx
+    if($path =~ m|^/dev/[^/]+/?$|) {
+        $bdev = $path;
+    }
+    #if path is /dev/disk/
+    elsif ($path =~ m|^/dev/disk/|) {
+        $bdev = readlink($path);
+        #if multipath, we need to find real device
+        if($bdev =~ m/(dm-(\d+))$/) {
+            my $dir="/sys/block/$1/slaves/";
+            my $dh = IO::Dir->new ($dir);
+            if (defined $dh) {
+                while (defined(my $tmp = $dh->read)) {
+                    if ($tmp =~ m/([0-9A-Za-z])$/) {
+                        $bdev="/dev/$tmp";
+                    }
+                }
+            }
+        }
+        elsif ($bdev =~ m/(\w+)/) {
+            $bdev="/dev/$1";
+        }
+    }
+
+    return if !$bdev;
+
+    my $st=stat($bdev);
+    my $major=Unix::Mknod::major($st->rdev);
+
+    if ($major =~ m/^(\d+)$/) {
+        $major = $1;
+        my @scsimajors = (8,65,66,67,68,69,70,71,128,129,130,131,132,133,134,135);
+        return 1 if (grep /^$major$/, @scsimajors)
+    }
+}
+
 # pci helpers
 
 sub file_write {
-- 
1.7.2.5



More information about the pve-devel mailing list