mirror of
https://git.proxmox.com/git/qemu-server
synced 2026-01-24 15:35:07 +00:00
Move path_is_scsi to QemuServer/Drive.pm
Prepare for introduction of new helper Signed-off-by: Hannes Duerr <h.duerr@proxmox.com>
This commit is contained in:
parent
498d7da470
commit
ad464e0b87
@ -53,7 +53,7 @@ use PVE::QemuServer::Helpers qw(config_aware_timeout min_version windows_version
|
||||
use PVE::QemuServer::Cloudinit;
|
||||
use PVE::QemuServer::CGroup;
|
||||
use PVE::QemuServer::CPUConfig qw(print_cpu_device get_cpu_options);
|
||||
use PVE::QemuServer::Drive qw(is_valid_drivename drive_is_cloudinit drive_is_cdrom drive_is_read_only parse_drive print_drive);
|
||||
use PVE::QemuServer::Drive qw(is_valid_drivename drive_is_cloudinit drive_is_cdrom drive_is_read_only parse_drive print_drive path_is_scsi);
|
||||
use PVE::QemuServer::Machine;
|
||||
use PVE::QemuServer::Memory qw(get_current_memory);
|
||||
use PVE::QemuServer::Monitor qw(mon_cmd);
|
||||
@ -1365,66 +1365,6 @@ sub assert_clipboard_config {
|
||||
}
|
||||
}
|
||||
|
||||
sub scsi_inquiry {
|
||||
my($fh, $noerr) = @_;
|
||||
|
||||
my $SG_IO = 0x2285;
|
||||
my $SG_GET_VERSION_NUM = 0x2282;
|
||||
|
||||
my $versionbuf = "\x00" x 8;
|
||||
my $ret = ioctl($fh, $SG_GET_VERSION_NUM, $versionbuf);
|
||||
if (!$ret) {
|
||||
die "scsi ioctl SG_GET_VERSION_NUM failoed - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
my $version = unpack("I", $versionbuf);
|
||||
if ($version < 30000) {
|
||||
die "scsi generic interface too old\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my $buf = "\x00" x 36;
|
||||
my $sensebuf = "\x00" x 8;
|
||||
my $cmd = pack("C x3 C x1", 0x12, 36);
|
||||
|
||||
# see /usr/include/scsi/sg.h
|
||||
my $sg_io_hdr_t = "i i C C s I P P P I I i P C C C C S S i I I";
|
||||
|
||||
my $packet = pack(
|
||||
$sg_io_hdr_t, ord('S'), -3, length($cmd), length($sensebuf), 0, length($buf), $buf, $cmd, $sensebuf, 6000
|
||||
);
|
||||
|
||||
$ret = ioctl($fh, $SG_IO, $packet);
|
||||
if (!$ret) {
|
||||
die "scsi ioctl SG_IO failed - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my @res = unpack($sg_io_hdr_t, $packet);
|
||||
if ($res[17] || $res[18]) {
|
||||
die "scsi ioctl SG_IO status error - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my $res = {};
|
||||
$res->@{qw(type removable vendor product revision)} = unpack("C C x6 A8 A16 A4", $buf);
|
||||
|
||||
$res->{removable} = $res->{removable} & 128 ? 1 : 0;
|
||||
$res->{type} &= 0x1F;
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
sub path_is_scsi {
|
||||
my ($path) = @_;
|
||||
|
||||
my $fh = IO::File->new("+<$path") || return;
|
||||
my $res = scsi_inquiry($fh, 1);
|
||||
close($fh);
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
sub print_tabletdevice_full {
|
||||
my ($conf, $arch) = @_;
|
||||
|
||||
|
||||
@ -5,6 +5,8 @@ use warnings;
|
||||
|
||||
use Storable qw(dclone);
|
||||
|
||||
use IO::File;
|
||||
|
||||
use PVE::Storage;
|
||||
use PVE::JSONSchema qw(get_standard_option);
|
||||
|
||||
@ -17,6 +19,7 @@ drive_is_cdrom
|
||||
drive_is_read_only
|
||||
parse_drive
|
||||
print_drive
|
||||
path_is_scsi
|
||||
);
|
||||
|
||||
our $QEMU_FORMAT_RE = qr/raw|cow|qcow|qcow2|qed|vmdk|cloop/;
|
||||
@ -760,4 +763,64 @@ sub resolve_first_disk {
|
||||
return;
|
||||
}
|
||||
|
||||
sub scsi_inquiry {
|
||||
my($fh, $noerr) = @_;
|
||||
|
||||
my $SG_IO = 0x2285;
|
||||
my $SG_GET_VERSION_NUM = 0x2282;
|
||||
|
||||
my $versionbuf = "\x00" x 8;
|
||||
my $ret = ioctl($fh, $SG_GET_VERSION_NUM, $versionbuf);
|
||||
if (!$ret) {
|
||||
die "scsi ioctl SG_GET_VERSION_NUM failoed - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
my $version = unpack("I", $versionbuf);
|
||||
if ($version < 30000) {
|
||||
die "scsi generic interface too old\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my $buf = "\x00" x 36;
|
||||
my $sensebuf = "\x00" x 8;
|
||||
my $cmd = pack("C x3 C x1", 0x12, 36);
|
||||
|
||||
# see /usr/include/scsi/sg.h
|
||||
my $sg_io_hdr_t = "i i C C s I P P P I I i P C C C C S S i I I";
|
||||
|
||||
my $packet = pack(
|
||||
$sg_io_hdr_t, ord('S'), -3, length($cmd), length($sensebuf), 0, length($buf), $buf, $cmd, $sensebuf, 6000
|
||||
);
|
||||
|
||||
$ret = ioctl($fh, $SG_IO, $packet);
|
||||
if (!$ret) {
|
||||
die "scsi ioctl SG_IO failed - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my @res = unpack($sg_io_hdr_t, $packet);
|
||||
if ($res[17] || $res[18]) {
|
||||
die "scsi ioctl SG_IO status error - $!\n" if !$noerr;
|
||||
return;
|
||||
}
|
||||
|
||||
my $res = {};
|
||||
$res->@{qw(type removable vendor product revision)} = unpack("C C x6 A8 A16 A4", $buf);
|
||||
|
||||
$res->{removable} = $res->{removable} & 128 ? 1 : 0;
|
||||
$res->{type} &= 0x1F;
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
sub path_is_scsi {
|
||||
my ($path) = @_;
|
||||
|
||||
my $fh = IO::File->new("+<$path") || return;
|
||||
my $res = scsi_inquiry($fh, 1);
|
||||
close($fh);
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user