diff options
-rw-r--r-- | perl-install/any.pm | 2 | ||||
-rw-r--r-- | perl-install/fs.pm | 36 | ||||
-rw-r--r-- | perl-install/partition_table.pm | 47 |
3 files changed, 50 insertions, 35 deletions
diff --git a/perl-install/any.pm b/perl-install/any.pm index 86abdcb70..3b395e0f8 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -381,7 +381,7 @@ sub inspect { $dir = ''; } else { mkdir $dir, 0700; - eval { fs::mount($part->{device}, $dir, type2fs($part->{type}), !$rw) }; + eval { fs::mount($part->{device}, $dir, type2fs($part), !$rw) }; $@ and return; } my $h = before_leaving { diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 74c04a5f9..c6033dc15 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -79,7 +79,8 @@ sub mount_options { } sub mount_options_unpack { - my ($packed_options, $part) = @_; + my ($part) = @_; + my ($type, $packed_options) = ($part->{type}, $part->{options}); my ($non_defaults, $user_implies) = mount_options(); @@ -94,12 +95,17 @@ sub mount_options_unpack { $non_defaults->{$_} = 1 foreach @$l; } + $non_defaults->{autofs} = 1; # autofs proposed for any types?? + $non_defaults->{supermount} = 1 if member(type2fs($part), 'auto', @auto_fs); + my $defaults = { reverse %$non_defaults }; my %options = map { $_ => 0 } keys %$non_defaults; my @unknown; foreach (split(",", $packed_options)) { if ($_ eq 'user') { $options{$_} = 1 foreach ('user', @$user_implies); + } elsif (/fstype=(.*)/) { + $type = $1; } elsif (exists $non_defaults->{$_}) { $options{$_} = 1; } elsif ($defaults->{$_}) { @@ -108,15 +114,25 @@ sub mount_options_unpack { push @unknown, $_; } } + $options{autofs} = 1 if $part->{type} eq 'autofs'; + $options{supermount} = 1 if $part->{type} eq 'supermount'; + my $unknown = join(",", @unknown); - \%options, $unknown; + \%options, $unknown, $type; } sub mount_options_pack { - my ($options, $unknown) = @_; + my ($part, $options, $unknown, $type) = @_; my ($non_defaults, $user_implies) = mount_options(); my @l; + + if ($options->{autofs} || $options->{supermount}) { + $options->{"fstype=$type"} = 1; + delete $options->{$_} and $part->{type} = $_ foreach 'autofs', 'supermount'; + } else { + $part->{type} = $type; + } if (delete $options->{user}) { push @l, 'user'; foreach (@$user_implies) { @@ -129,7 +145,7 @@ sub mount_options_pack { push @l, grep { $options->{$_} } keys %$options; push @l, $unknown; - join(",", @l); + $part->{options} = join(",", grep { $_ } @l); } sub mount_options_help { @@ -172,8 +188,8 @@ sub get_mntpoints_from_fstab { foreach my $p (@$l) { $p->{device} eq $_->{device} or next; - $_->{type} ne 'auto' && $_->{type} ne type2fs($p->{type}) and - log::l("err, fstab and partition table do not agree for $_->{device} type: " . (type2fs($p->{type}) || type2name($p->{type})) . " vs $_->{type}"), next; + $_->{type} ne 'auto' && $_->{type} ne type2fs($p) and + log::l("err, fstab and partition table do not agree for $_->{device} type: " . (type2fs($p) || type2name($p->{type})) . " vs $_->{type}"), next; delete $p->{unsafeMntpoint} || !$p->{mntpoint} or next; $p->{type} ||= $_->{type}; $p->{mntpoint} = $_->{mntpoint}; @@ -392,7 +408,7 @@ sub mount_part { } elsif (loopback::carryRootLoopback($part)) { $mntpoint = "/initrd/loopfs"; } - mount(devices::make($dev), $mntpoint, type2fs($part->{type}), $rdonly); + mount(devices::make($dev), $mntpoint, type2fs($part), $rdonly); rmdir "$mntpoint/lost+found"; } } @@ -451,7 +467,7 @@ sub df { return; #- won't even try! } else { mkdir $dir; - eval { mount($part->{device}, $dir, type2fs($part->{type}), 'readonly') }; + eval { mount($part->{device}, $dir, type2fs($part), 'readonly') }; if ($@) { $part->{notFormatted} = 1; $part->{isFormatted} = 0; @@ -541,9 +557,9 @@ sub write_fstab($;$$@) { eval { devices::make("$prefix/$dev") } if $dir && !isLoopback($_); mkdir "$prefix/$_->{mntpoint}", 0755 if $_->{mntpoint} && !isSwap($_); - [ $dev, $_->{mntpoint}, type2fs($_->{type}), $options, $freq, $passno ]; + [ $dev, $_->{mntpoint}, type2fs($_), $options, $freq, $passno ]; - } grep { $_->{mntpoint} && type2fs($_->{type}) } @$fstab; + } grep { $_->{mntpoint} && type2fs($_) } @$fstab; push @to_add, map { [ split ] } cat_("$prefix/etc/fstab"); diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm index 6793b33a6..2e7388b9a 100644 --- a/perl-install/partition_table.pm +++ b/perl-install/partition_table.pm @@ -195,7 +195,6 @@ arch() !~ /sparc/ ? ( 0x483=> 'ext3', 0x401 => 'apple', 0x402 => 'hfs', - nfs => 'nfs', #- hack ); my %types_rev = reverse %types; @@ -209,35 +208,35 @@ sub important_types { difference2(\@l, \@bad_types); } -sub type2name($) { $types{$_[0]} || $_[0] } -sub type2fs($) { $type2fs{$_[0]} } -sub fs2type($) { $fs2type{$_[0]} } -sub name2type($) { +sub type2fs { $type2fs{$_[0]{type}} || $_[0]{type} } +sub fs2type { $fs2type{$_[0]} || $_[0] } +sub type2name { $types{$_[0]} || $_[0] } +sub name2type { local ($_) = @_; /0x(.*)/ ? hex $1 : $types_rev{$_} || $_; } -sub isWholedisk($) { arch() =~ /^sparc/ && $_[0]{type} == 5 } -sub isExtended($) { arch() !~ /^sparc/ && ($_[0]{type} == 5 || $_[0]{type} == 0xf || $_[0]{type} == 0x85) } -sub isRawLVM($) { $_[0]{type} == 0x8e } -sub isRawRAID($) { $_[0]{type} == 0xfd } -sub isSwap($) { $type2fs{$_[0]{type}} eq 'swap' } -sub isExt2($) { $type2fs{$_[0]{type}} eq 'ext2' } -sub isDos($) { arch() !~ /^sparc/ && $ {{ 1=>1, 4=>1, 6=>1 }}{$_[0]{type}} } -sub isWin($) { $ {{ 0xb=>1, 0xc=>1, 0xe=>1, 0x1b=>1, 0x1c=>1, 0x1e=>1 }}{$_[0]{type}} } -sub isFat($) { isDos($_[0]) || isWin($_[0]) } -sub isSunOS($) { arch() =~ /sparc/ && $ {{ 0x1=>1, 0x2=>1, 0x4=>1, 0x6=>1, 0x7=>1, 0x8=>1 }}{$_[0]{type}} } -sub isNfs($) { $_[0]{type} eq 'nfs' } #- small hack -sub isNT($) { arch() !~ /^sparc/ && $_[0]{type} == 0x7 } -sub isSupermount($) { $_[0]{type} eq 'supermount' } -sub isApple($) { $type2fs{$_[0]{type}} eq 'apple' && defined $_[0]{isDriver} } -sub isAppleBootstrap($) { $type2fs{$_[0]{type}} eq 'apple' && defined $_[0]{isBoot} } +sub isWholedisk { arch() =~ /^sparc/ && $_[0]{type} == 5 } +sub isExtended { arch() !~ /^sparc/ && ($_[0]{type} == 5 || $_[0]{type} == 0xf || $_[0]{type} == 0x85) } +sub isRawLVM { $_[0]{type} == 0x8e } +sub isRawRAID { $_[0]{type} == 0xfd } +sub isSwap { type2fs($_[0]) eq 'swap' } +sub isExt2 { type2fs($_[0]) eq 'ext2' } +sub isDos { arch() !~ /^sparc/ && $ {{ 1=>1, 4=>1, 6=>1 }}{$_[0]{type}} } +sub isWin { $ {{ 0xb=>1, 0xc=>1, 0xe=>1, 0x1b=>1, 0x1c=>1, 0x1e=>1 }}{$_[0]{type}} } +sub isFat { isDos($_[0]) || isWin($_[0]) } +sub isSunOS { arch() =~ /sparc/ && $ {{ 0x1=>1, 0x2=>1, 0x4=>1, 0x6=>1, 0x7=>1, 0x8=>1 }}{$_[0]{type}} } +sub isNfs { $_[0]{type} eq 'nfs' } #- small hack +sub isNT { arch() !~ /^sparc/ && $_[0]{type} == 0x7 } +sub isSupermount { $_[0]{type} eq 'supermount' } +sub isApple { type2fs($_[0]) eq 'apple' && defined $_[0]{isDriver} } +sub isAppleBootstrap { type2fs($_[0]) eq 'apple' && defined $_[0]{isBoot} } sub isHiddenMacPart { defined $_[0]{isMap} } -sub isThisFs { $type2fs{$_[1]{type}} eq $_[0] } -sub isTrueFS { member($type2fs{$_[0]{type}}, qw(ext2 reiserfs xfs jfs ext3)) } +sub isThisFs { type2fs($_[1]) eq $_[0] } +sub isTrueFS { member(type2fs($_[0]), qw(ext2 reiserfs xfs jfs ext3)) } -sub isOtherAvailableFS($) { isFat($_[0]) || isSunOS($_[0]) || isThisFs('hfs', $_[0]) } #- other OS that linux can access its filesystem +sub isOtherAvailableFS { isFat($_[0]) || isSunOS($_[0]) || isThisFs('hfs', $_[0]) } #- other OS that linux can access its filesystem sub isMountableRW { isTrueFS($_[0]) || isOtherAvailableFS($_[0]) } sub isNonMountable { isRawRAID($_[0]) || isRawLVM($_[0]) } @@ -512,7 +511,7 @@ sub read_extended { } # write the partition table -sub write($) { +sub write { my ($hd) = @_; $hd->{isDirty} or return; |