X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=PVE%2FDiskmanage.pm;h=ca6f0b7bc5dc9cd5172bd3ba8de0bd967f852f8d;hb=6a4545601b874ff3d003855ecbad8f5315ae812e;hp=70677ea3b12eafc8cb8802fe65d307dab8c4bcb6;hpb=3bf7f8891bd2c5f89cd520df5c7947525e06dcb0;p=pve-storage.git diff --git a/PVE/Diskmanage.pm b/PVE/Diskmanage.pm index 70677ea..ca6f0b7 100644 --- a/PVE/Diskmanage.pm +++ b/PVE/Diskmanage.pm @@ -22,7 +22,6 @@ my $LSBLK = "/bin/lsblk"; sub check_bin { my ($path) = @_; - return -x $path; } @@ -848,6 +847,31 @@ sub append_partition { 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(). @@ -858,14 +882,11 @@ sub is_mounted { 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}; @@ -879,10 +900,6 @@ sub is_mounted { 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"); @@ -892,12 +909,25 @@ sub wipe_blockdev { my $size = ($dev_size * 512 / 1024 / 1024); my $count = ($size < 200) ? $size : 200; - push @{$dd_cmd}, "count=${count}"; + my $to_wipe = []; + dir_glob_foreach("/sys/class/block/${devname}", "${devname}.+", sub { + my ($part) = @_; + push $to_wipe->@*, "/dev/${part}" if -b "/dev/${part}"; + }); - print "wiping disk/partition: ${devpath}\n"; + if (scalar($to_wipe->@*) > 0) { + print "found child partitions to wipe: ". join(', ', $to_wipe->@*) ."\n"; + } + push $to_wipe->@*, $devpath; # put actual device last - run_command($wipefs_cmd, errmsg => "error wiping labels for '${devpath}'"); - run_command($dd_cmd, errmsg => "error wiping '${devpath}'"); + print "wiping block device ${devpath}\n"; + + run_command(['wipefs', '--all', $to_wipe->@*], errmsg => "error wiping '${devpath}'"); + + run_command( + ['dd', 'if=/dev/zero', "of=${devpath}", 'bs=1M', 'conv=fdatasync', "count=${count}"], + errmsg => "error wiping '${devpath}'", + ); } 1;