sub check_bin {
my ($path) = @_;
-
return -x $path;
}
return $partition;
}
+my sub strip_dev :prototype($) {
+ my ($devpath) = @_;
+ $devpath =~ s|^/dev/||;
+ return $devpath;
+}
+
+# Check if a disk or any of its partitions has a holder.
+# Can also be called with a partition.
+# Expected to be called with a result of verify_blockdev_path().
+sub has_holder {
+ my ($devpath) = @_;
+
+ my $dev = strip_dev($devpath);
+
+ return $devpath if !dir_is_empty("/sys/class/block/${dev}/holders");
+
+ my $found;
+ dir_glob_foreach("/sys/block/${dev}", "${dev}.+", sub {
+ my ($part) = @_;
+ $found = "/dev/${part}" if !dir_is_empty("/sys/class/block/${part}/holders");
+ });
+
+ return $found;
+}
+
# Basic check if a disk or any of its partitions is mounted.
# Can also be called with a partition.
# Expected to be called with a result of verify_blockdev_path().
return $devpath if $mounted->{$devpath};
- my $dev = $devpath;
- $dev =~ s|^/dev/||;
+ my $dev = strip_dev($devpath);
my $found;
-
dir_glob_foreach("/sys/block/${dev}", "${dev}.+", sub {
my ($part) = @_;
-
my $partpath = "/dev/${part}";
$found = $partpath if $mounted->{$partpath};
sub wipe_blockdev {
my ($devpath) = @_;
- my $wipefs_cmd = ['wipefs', '--all', $devpath];
-
- my $dd_cmd = ['dd', 'if=/dev/zero', "of=${devpath}", 'bs=1M', 'conv=fdatasync'];
-
my $devname = basename($devpath);
my $dev_size = PVE::Tools::file_get_contents("/sys/class/block/$devname/size");
my $size = ($dev_size * 512 / 1024 / 1024);
my $count = ($size < 200) ? $size : 200;
- push @{$dd_cmd}, "count=${count}";
-
print "wiping disk/partition: ${devpath}\n";
- run_command($wipefs_cmd, errmsg => "error wiping labels for '${devpath}'");
- run_command($dd_cmd, errmsg => "error wiping '${devpath}'");
+ run_command(['wipefs', '--all', $devpath], errmsg => "error wiping '${devpath}'");
+
+ run_command(
+ ['dd', 'if=/dev/zero', "of=${devpath}", 'bs=1M', 'conv=fdatasync', "count=${count}"],
+ errmsg => "error wiping '${devpath}'",
+ );
}
1;