use PVE::ProcFSTools;
use Data::Dumper;
use Cwd qw(abs_path);
+use Fcntl ':mode';
use PVE::Tools qw(extract_param run_command file_get_contents file_read_firstline dir_glob_regex dir_glob_foreach trim);
my $journalhash = {};
my $journal_uuid = '45b0969e-9b03-4f30-b4c6-b4b80ceff106';
+ my $db_uuid = '30cd0809-c2b2-499c-8879-2d6b78529876';
+ my $wal_uuid = '5ce17fce-4087-4169-b7ff-056cc58473f9';
+ my $block_uuid = 'cafecafe-9b03-4f30-b4c6-b4b80ceff106';
- dir_glob_foreach('/dev/disk/by-parttypeuuid', "$journal_uuid\..+", sub {
- my ($entry) = @_;
+ dir_glob_foreach('/dev/disk/by-parttypeuuid', "($journal_uuid|$db_uuid|$wal_uuid|$block_uuid)\..+", sub {
+ my ($entry, $type) = @_;
my $real_dev = abs_path("/dev/disk/by-parttypeuuid/$entry");
- $journalhash->{$real_dev} = 1;
+ if ($type eq $journal_uuid) {
+ $journalhash->{$real_dev} = 1;
+ } elsif ($type eq $db_uuid) {
+ $journalhash->{$real_dev} = 2;
+ } elsif ($type eq $wal_uuid) {
+ $journalhash->{$real_dev} = 3;
+ } elsif ($type eq $block_uuid) {
+ $journalhash->{$real_dev} = 4;
+ }
});
return $journalhash;
'samsung' => 177,
'intel' => 233,
'sandisk' => 233,
+ 'crucial' => 202,
'default' => 233,
};
my $lvmlist = get_lvm_devices();
+ # we get cciss/c0d0 but need cciss!c0d0
+ if (defined($disk) && $disk =~ m|^cciss/|) {
+ $disk =~ s|cciss/|cciss!|;
+ }
+
dir_glob_foreach('/sys/block', '.*', sub {
my ($dev) = @_;
return if defined($disk) && $disk ne $dev;
$used = 'ZFS' if $zfslist->{$devpath};
+ # we replaced cciss/ with cciss! above
+ # but in the result we need cciss/ again
+ # because the caller might want to check the
+ # result again with the original parameter
+ if ($dev =~ m|^cciss!|) {
+ $dev =~ s|^cciss!|cciss/|;
+ }
+
$disklist->{$dev} = {
vendor => $sysdata->{vendor},
model => $data->{model} || $sysdata->{model},
};
my $osdid = -1;
+ my $bluestore = 0;
my $journal_count = 0;
+ my $db_count = 0;
+ my $wal_count = 0;
my $found_partitions;
my $found_lvm;
$found_zfs = 1;
}
- $journal_count++ if $journalhash->{"$partpath/$part"};
+ if ($journalhash->{"$partpath/$part"}) {
+ $journal_count++ if $journalhash->{"$partpath/$part"} == 1;
+ $db_count++ if $journalhash->{"$partpath/$part"} == 2;
+ $wal_count++ if $journalhash->{"$partpath/$part"} == 3;
+ $bluestore = 1 if $journalhash->{"$partpath/$part"} == 4;
+ }
if (!dir_is_empty("$sysdir/$part/holders") && !$found_lvm) {
$found_dm = 1;
$disklist->{$dev}->{used} = $used if $used;
$disklist->{$dev}->{osdid} = $osdid;
- $disklist->{$dev}->{journals} = $journal_count;
+ $disklist->{$dev}->{journals} = $journal_count if $journal_count;
+ $disklist->{$dev}->{bluestore} = $bluestore if $osdid != -1;
+ $disklist->{$dev}->{db} = $db_count if $db_count;
+ $disklist->{$dev}->{wal} = $wal_count if $wal_count;
});
return $disklist;
}
+sub get_partnum {
+ my ($part_path) = @_;
+
+ my ($mode, $rdev) = (stat($part_path))[2,6];
+
+ next if !$mode || !S_ISBLK($mode) || !$rdev;
+ my $major = int($rdev / 0x100);
+ my $minor = $rdev % 0x100;
+ my $partnum_path = "/sys/dev/block/$major:$minor/";
+
+ my $partnum;
+
+ $partnum = file_read_firstline("${partnum_path}partition");
+
+ die "Partition does not exists\n" if !defined($partnum);
+
+ #untaint and ensure it is a int
+ if ($partnum =~ m/(\d+)/) {
+ $partnum = $1;
+ die "Partition number $partnum is invalid\n" if $partnum > 128;
+ } else {
+ die "Failed to get partition number\n";
+ }
+
+ return $partnum;
+}
+
+sub get_blockdev {
+ my ($part_path) = @_;
+
+ my $dev = $1 if $part_path =~ m|^/dev/(.*)$|;
+ my $link = readlink "/sys/class/block/$dev";
+ my $block_dev = $1 if $link =~ m|([^/]*)/$dev$|;
+
+ die "Can't parse parent device\n" if !defined($block_dev);
+ die "No valid block device\n" if index($dev, $block_dev) == -1;
+
+ $block_dev = "/dev/$block_dev";
+ die "Block device does not exsists\n" if !(-b $block_dev);
+
+ return $block_dev;
+}
+
+sub locked_disk_action {
+ my ($sub) = @_;
+ my $res = PVE::Tools::lock_file('/run/lock/pve-diskmanage.lck', undef, $sub);
+ die $@ if $@;
+ return $res;
+}
+
+sub check_unused {
+ my ($dev) = @_;
+
+ die "device $dev is already in use\n" if disk_is_used($dev);
+
+ return undef;
+}
+
1;