| | 436 | |
|---|
| | 437 | if (lc($^O) eq 'linux') { |
|---|
| | 438 | my %name_to_number; |
|---|
| | 439 | my %number_to_name; |
|---|
| | 440 | |
|---|
| | 441 | if (open my $partitions, '<', '/proc/partitions') { |
|---|
| | 442 | <$partitions>; <$partitions>; # First two lines are for humans |
|---|
| | 443 | while (my $line = <$partitions>) { |
|---|
| | 444 | my ($major, $minor, undef, $devname) = split /\s+/, $line; |
|---|
| | 445 | my $devno = ($major << 8) + $minor; |
|---|
| | 446 | $name_to_number{$devname} = $devno; |
|---|
| | 447 | $number_to_name{$devno} = $devname; |
|---|
| | 448 | } |
|---|
| | 449 | } else { |
|---|
| | 450 | warn "Unable to open /proc/partitions: $!"; |
|---|
| | 451 | } |
|---|
| | 452 | |
|---|
| | 453 | foreach my $mogdevid (keys %$map) { |
|---|
| | 454 | my $original = $map->{$mogdevid}; |
|---|
| | 455 | my $devname = $number_to_name{$original} or next; |
|---|
| | 456 | if (my ($new) = $devname =~ m/^([hs]d\w)\d+$/) { |
|---|
| | 457 | next unless $name_to_number{$new}; |
|---|
| | 458 | $map->{$mogdevid} = $name_to_number{$new}; |
|---|
| | 459 | } |
|---|
| | 460 | } |
|---|
| | 461 | } |
|---|