diff options
Diffstat (limited to 'perl-install/fs')
-rw-r--r-- | perl-install/fs/format.pm | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/perl-install/fs/format.pm b/perl-install/fs/format.pm new file mode 100644 index 000000000..6f5dff294 --- /dev/null +++ b/perl-install/fs/format.pm @@ -0,0 +1,77 @@ +package fs::format; + +use run_program; +use common; +use log; +use partition_table qw(:types); + +my %cmds = ( + ext2 => 'mke2fs -F', + ext3 => 'mke2fs -F -j', + reiserfs => 'mkreiserfs -ff', + xfs => 'mkfs.xfs -f -q', + jfs => 'mkfs.jfs -f', + hfs => 'hformat', + dos => 'mkdosfs', + vfat => 'mkdosfs -F 32', + swap => 'mkswap', +); + +sub part { + my ($raids, $part, $prefix, $wait_message) = @_; + if (isRAID($part)) { + $wait_message->(N("Formatting partition %s", $part->{device})) if $wait_message; + require raid; + raid::format_part($raids, $part); + } elsif (isLoopback($part)) { + $wait_message->(N("Creating and formatting file %s", $part->{loopback_file})) if $wait_message; + loopback::format_part($part, $prefix); + } else { + $wait_message->(N("Formatting partition %s", $part->{device})) if $wait_message; + part_raw($part); + } +} + +sub part_raw { + my ($part) = @_; + + $part->{isFormatted} and return; + + if ($part->{encrypt_key}) { + fs::set_loop($part); + } + + my $dev = $part->{real_device} || $part->{device}; + + my @options = if_($part->{toFormatCheck}, "-c"); + log::l("formatting device $dev (type ", pt_type2name($part->{pt_type}), ")"); + + my $fs_type = type2fs($part); + + if ($fs_type eq 'ext2' || $fs_type eq 'ext3') { + push @options, "-m", "0" if $part->{mntpoint} =~ m|^/home|; + } elsif (isDos($part)) { + $fs_type = 'dos'; + } elsif ($fs_type eq 'hfs') { + push @options, '-l', "Untitled"; + } elsif (isAppleBootstrap($part)) { + push @options, '-l', 'bootstrap'; + } + + my $cmd = $cmds{$fs_type} or die N("I don't know how to format %s in type %s", $part->{device}, pt_type2name($part->{pt_type})); + + run_program::raw({ timeout => 60 * 60 }, $cmd, @options, devices::make($dev)) or die N("%s formatting of %s failed", $fs_type, $dev); + + if ($fs_type eq 'ext3') { + disable_forced_fsck($dev); + } + + $part->{isFormatted} = 1; +} + +sub disable_forced_fsck { + my ($dev) = @_; + run_program::run("tune2fs", "-c0", "-i0", devices::make($dev)); +} + +1; |