[pve-devel] [PATCH storage 3/5] Diskmanage: add append_partition sub
Dominik Csapak
d.csapak at proxmox.com
Tue Jun 4 10:29:29 CEST 2019
On 6/4/19 10:25 AM, Thomas Lamprecht wrote:
> On 6/4/19 9:21 AM, Dominik Csapak wrote:
>> we will use this for adding a partition to a disk when using a device
>> for ceph osd db/wal which already has partitions on it
>>
>> first we search for the highest partition number, then add the partition
>> and search for the resulting device (we cannot assume to simply
>> append the number, e.g. from /dev/nvme0n1 we get /dev/nvme0n1pX)
>>
>> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
>> ---
>> PVE/Diskmanage.pm | 36 ++++++++++++++++++++++++++++++++++++
>> 1 file changed, 36 insertions(+)
>>
>> diff --git a/PVE/Diskmanage.pm b/PVE/Diskmanage.pm
>> index daad6df..645d67b 100644
>> --- a/PVE/Diskmanage.pm
>> +++ b/PVE/Diskmanage.pm
>> @@ -683,4 +683,40 @@ sub assert_disk_unused {
>> return undef;
>> }
>>
>> +sub append_partition {
>> + my ($dev, $size) = @_;
>> +
>> + my $devname;
>> + if ($dev =~ m|^/dev/(.*)$|) {
>> + $devname = $1;
>> + }
>
> else ?? $devname can be undef and is used in string and regex below..
> either fallback or die?
oops, yes this should be handled...
>
>> +
>> + my $newpartid = 1;
>> + dir_glob_foreach("/sys/block/$devname", qr/\Q$devname\E.+/, sub {
>> + my ($part) = @_;
>> +
>> + my ($partid) = $part =~ m/(\d+)$/;
>> + $partid = int($partid);
>
> could be undef, if no parition is present, not sure if you then can hit
> this code path at all, but maybe still worth dealing with that..
> And yes, I know that int(undef) == 0, but it produces also a warning
> and is a bit to subtle for my taste..
mhmm, right, better would be to include the (\d+) in the glob regex
directly, so that we have it already extracted as parameter
e.g. qr/\Q$devname\E.*?(\d+)/
?
>
>> +
>> + if ($partid >= $newpartid) {
>> + $newpartid = $partid + 1;
>> + }
>> + });
>> +
>> + $size = PVE::Tools::convert_size($size, 'b' => 'mb');
>> +
>> + run_command([ $SGDISK, '-n', "$newpartid:0:+${size}M", $dev ],
>> + errmsg => "error creating partition '$newpartid' on '$dev'");
>> +
>> + my $partition;
>> +
>> + dir_glob_foreach("/sys/block/$devname", qr/\Q$devname\E.*$newpartid/, sub {
>> + my ($part) = @_;
>> +
>> + $partition = "/dev/$part";
>
> this is a, in a certain way, elegant solution, maybe adding a small
> comment could be good, something like:
> # new part name is dependent of underlying device type, "autocomplete" it
sure will do
>
>> + });
>> +
>> + return $partition;
>> +}
>> +
>> 1;
>>
>
More information about the pve-devel
mailing list