diff options
Diffstat (limited to 'perl-install')
-rw-r--r-- | perl-install/fs.pm | 20 | ||||
-rw-r--r-- | perl-install/install_steps_interactive.pm | 19 |
2 files changed, 27 insertions, 12 deletions
diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 2cb5c280d..c684bf7be 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -700,10 +700,21 @@ sub mount { #- without knowing it, / is forced to be mounted with notail # if $where =~ m|/(boot)?$|; $mount_opt = 'notail'; #- notail in any case + } elsif ($fs eq 'jfs' && !$rdonly) { + #- needed if the system is dirty otherwise mounting read-write simply fails + run_program::run("fsck.jfs", $dev) or die "fsck.jfs failed"; } elsif ($fs eq 'ext2') { - run_program::run("fsck.ext2", "-a", $dev); - $? & 0x0100 and log::l("fsck corrected partition $dev"); - $? & 0xfeff and die _("fsck failed with exit code %d or signal %d", $? >> 8, $? & 255); + foreach ('-a', '-y') { + run_program::run("fsck.ext2", $_, $dev); + my $err = $?; + if ($err & 0x0100) { log::l("fsck corrected partition $dev") } + if ($err & 0xfeff) { + my $txt = sprintf("fsck failed on %s with exit code %d or signal %d", $dev, $err >> 8, $err & 255); + $_ eq '-y' ? die($txt) : cdie($txt); + } else { + last; + } + } } if (member($fs, @fs_modules)) { eval { modules::load($fs) }; @@ -803,10 +814,9 @@ sub umount_part { sub mount_all($;$$) { my ($fstab, $prefix) = @_; - #- TODO fsck, create check_mount_all ? log::l("mounting all filesystems"); - #- order mount by alphabetical ordre, that way / < /home < /home/httpd... + #- order mount by alphabetical order, that way / < /home < /home/httpd... foreach (sort { $a->{mntpoint} cmp $b->{mntpoint} } grep { isSwap($_) || $_->{mntpoint} && isTrueFS($_) } @$fstab) { mount_part($_, $prefix); } diff --git a/perl-install/install_steps_interactive.pm b/perl-install/install_steps_interactive.pm index 68e986898..ffbc9ad82 100644 --- a/perl-install/install_steps_interactive.pm +++ b/perl-install/install_steps_interactive.pm @@ -468,13 +468,18 @@ sub choosePartitionsToFormat { sub formatMountPartitions { my ($o, $fstab) = @_; my $w; - fs::formatMount_all($o->{all_hds}{raids}, $o->{fstab}, $o->{prefix}, sub { - my ($part) = @_; - $w ||= $o->wait_message('', _("Formatting partitions")); - $w->set(isLoopback($part) ? - _("Creating and formatting file %s", $part->{loopback_file}) : - _("Formatting partition %s", $part->{device})); - }); + catch_cdie { + fs::formatMount_all($o->{all_hds}{raids}, $o->{fstab}, $o->{prefix}, sub { + my ($part) = @_; + $w ||= $o->wait_message('', _("Formatting partitions")); + $w->set(isLoopback($part) ? + _("Creating and formatting file %s", $part->{loopback_file}) : + _("Formatting partition %s", $part->{device})); + }); + } sub { + $@ =~ /fsck failed on (\S+)/ or return; + $o->ask_yesorno('', _("Failed to check filesystem %s. Do you want to repair the errors? (beware, you can loose data)", $1), 1); + }; die _("Not enough swap space to fulfill installation, please add some") if availableMemory < 40 * 1024; } |