diff options
-rw-r--r-- | perl-install/diskdrake/interactive.pm | 12 | ||||
-rw-r--r-- | perl-install/fs.pm | 245 | ||||
-rw-r--r-- | perl-install/fs/mount_options.pm | 248 | ||||
-rw-r--r-- | perl-install/fsedit.pm | 2 | ||||
-rw-r--r-- | perl-install/install_steps.pm | 2 | ||||
-rw-r--r-- | perl-install/install_steps_interactive.pm | 2 | ||||
-rw-r--r-- | perl-install/network/smb.pm | 8 | ||||
-rw-r--r-- | perl-install/network/smbnfs.pm | 2 | ||||
-rwxr-xr-x | perl-install/standalone/diskdrake | 2 | ||||
-rwxr-xr-x | perl-install/standalone/drakupdate_fstab | 6 |
10 files changed, 269 insertions, 260 deletions
diff --git a/perl-install/diskdrake/interactive.pm b/perl-install/diskdrake/interactive.pm index 5bf3e436c..0a0e5cd6b 100644 --- a/perl-install/diskdrake/interactive.pm +++ b/perl-install/diskdrake/interactive.pm @@ -496,7 +496,7 @@ sub Create { put_in_hash($part, fs::type::type_name2subpart($type_name)); $part->{mntpoint} = '' if isNonMountable($part); $part->{mntpoint} = 'swap' if isSwap($part); - fs::set_default_options($part); + fs::mount_options::set_default($part); check($in, $hd, $part, $all_hds) or return 1; $migrate_files = need_migration($in, $part->{mntpoint}) or return 1; @@ -904,9 +904,9 @@ sub Options { my @simple_options = qw(user noauto supermount username= password=); - my (undef, $user_implies) = fs::mount_options(); - my ($options, $unknown) = fs::mount_options_unpack($part); - my %help = fs::mount_options_help(); + my (undef, $user_implies) = fs::mount_options::list(); + my ($options, $unknown) = fs::mount_options::unpack($part); + my %help = fs::mount_options::help(); my $prev_user = $options->{user}; $in->ask_from(N("Mount options"), @@ -926,7 +926,7 @@ sub Options { if ($options->{encrypted}) { # modify $part->{options} for the check local $part->{options}; - fs::mount_options_pack($part, $options, $unknown); + fs::mount_options::pack($part, $options, $unknown); if (!check($in, $hd, $part, $all_hds)) { $options->{encrypted} = 0; } elsif (!$part->{encrypt_key} && !isSwap($part)) { @@ -944,7 +944,7 @@ sub Options { }, ) or return; - fs::mount_options_pack($part, $options, $unknown); + fs::mount_options::pack($part, $options, $unknown); 1; } diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 391981307..e84c9d938 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -11,6 +11,7 @@ use devices; use fs::type; use fs::get; use fs::format; +use fs::mount_options; use run_program; use detect_devices; use modules; @@ -87,12 +88,12 @@ sub read_fstab { require network::smb; #- remove credentials=file with username=foo,password=bar,domain=zoo #- the other way is done in fstab_to_string - my ($options, $unknown) = mount_options_unpack($h); + my ($options, $unknown) = fs::mount_options::unpack($h); my $file = delete $options->{'credentials='}; my $credentials = network::smb::read_credentials_raw($file); if ($credentials->{username}) { $options->{"$_="} = $credentials->{$_} foreach qw(username password domain); - mount_options_pack($h, $options, $unknown); + fs::mount_options::pack($h, $options, $unknown); } } @@ -337,246 +338,6 @@ sub auto_fs() { grep { chop; $_ && !/nodev/ } cat_("/etc/filesystems"); } -sub mount_options() { - my %non_defaults = ( - sync => 'async', noatime => 'atime', noauto => 'auto', ro => 'rw', - user => 'nouser', nodev => 'dev', noexec => 'exec', nosuid => 'suid', - ); - my @user_implies = qw(noexec nodev nosuid); - \%non_defaults, \@user_implies; -} - -sub mount_options_unpack { - my ($part) = @_; - my $packed_options = $part->{options}; - - my ($non_defaults, $user_implies) = mount_options(); - - my @auto_fs = auto_fs(); - my %per_fs = ( - iso9660 => [ qw(unhide) ], - vfat => [ qw(umask=0 umask=0022) ], - ntfs => [ qw(umask=0 umask=0022) ], - nfs => [ qw(rsize=8192 wsize=8192) ], - smbfs => [ qw(username= password=) ], - davfs => [ qw(username= password= uid= gid=) ], - reiserfs => [ 'notail' ], - ); - push @{$per_fs{$_}}, 'usrquota', 'grpquota' foreach 'ext2', 'ext3', 'xfs'; - - while (my ($fs, $l) = each %per_fs) { - $part->{fs_type} eq $fs || $part->{fs_type} eq 'auto' && member($fs, @auto_fs) or next; - $non_defaults->{$_} = 1 foreach @$l; - } - - $non_defaults->{encrypted} = 1 if !$part->{isFormatted} || isSwap($part); - - $non_defaults->{supermount} = 1 if $part->{fs_type} =~ /:/ || member($part->{fs_type}, 'auto', @auto_fs); - - my $defaults = { reverse %$non_defaults }; - my %options = map { $_ => '' } keys %$non_defaults; - my @unknown; - foreach (split(",", $packed_options)) { - if ($_ eq 'user') { - $options{$_} = 1 foreach 'user', @$user_implies; - } elsif (exists $non_defaults->{$_}) { - $options{$_} = 1; - } elsif ($defaults->{$_}) { - $options{$defaults->{$_}} = 0; - } elsif (/(.*?=)(.*)/) { - $options{$1} = $2; - } else { - push @unknown, $_; - } - } - # merge those, for cleaner help - $options{'rsize=8192,wsize=8192'} = delete $options{'rsize=8192'} && delete $options{'wsize=8192'} - if exists $options{'rsize=8192'}; - - my $unknown = join(",", @unknown); - \%options, $unknown; -} - -sub mount_options_pack_ { - my ($_part, $options, $unknown) = @_; - - my ($non_defaults, $user_implies) = mount_options(); - my @l; - - my @umasks = map { - if (/^umask=/) { - my $v = delete $options->{$_}; - /^umask=(.+)/ ? if_($v, $1) : $v; - } else { () } - } keys %$options; - if (@umasks) { - push @l, 'umask=' . min(@umasks); - } - - if (delete $options->{user}) { - push @l, 'user'; - foreach (@$user_implies) { - if (!delete $options->{$_}) { - # overriding - $options->{$non_defaults->{$_}} = 1; - } - } - } - push @l, map_each { if_($::b, $::a =~ /=$/ ? "$::a$::b" : $::a) } %$options; - push @l, $unknown; - - join(",", uniq(grep { $_ } @l)); -} -sub mount_options_pack { - my ($part, $options, $unknown) = @_; - $part->{options} = mount_options_pack_($part, $options, $unknown); - noreturn(); -} - -# update me on each util-linux new release: -sub mount_options_help() { - ( - - 'grpquota' => '', - - 'noatime' => N("Do not update inode access times on this file system -(e.g, for faster access on the news spool to speed up news servers)."), - - 'noauto' => N("Can only be mounted explicitly (i.e., -the -a option will not cause the file system to be mounted)."), - - 'nodev' => N("Do not interpret character or block special devices on the file system."), - - 'noexec' => N("Do not allow execution of any binaries on the mounted -file system. This option might be useful for a server that has file systems -containing binaries for architectures other than its own."), - - 'nosuid' => N("Do not allow set-user-identifier or set-group-identifier -bits to take effect. (This seems safe, but is in fact rather unsafe if you -have suidperl(1) installed.)"), - - 'ro' => N("Mount the file system read-only."), - - 'sync' => N("All I/O to the file system should be done synchronously."), - - 'supermount' => '', - - 'user' => N("Allow an ordinary user to mount the file system. The -name of the mounting user is written to mtab so that he can unmount the file -system again. This option implies the options noexec, nosuid, and nodev -(unless overridden by subsequent options, as in the option line -user,exec,dev,suid )."), - - 'usrquota' => '', - - 'umask=0' => N("Give write access to ordinary users"), - - 'umask=0022' => N("Give read-only access to ordinary users"), - ); -} - - -sub rationalize_options { - my ($part) = @_; - - my ($options, $unknown) = mount_options_unpack($part); - - if ($part->{fs_type} ne 'reiserfs') { - $options->{notail} = 0; - } - - mount_options_pack($part, $options, $unknown); -} - -sub set_default_options { - my ($part, %opts) = @_; - #- opts are: useSupermount security iocharset codepage - - my ($options, $unknown) = mount_options_unpack($part); - - if ($part->{is_removable} && !member($part->{mntpoint}, qw(/ /usr /var /boot))) { - $options->{supermount} = $opts{useSupermount} && !($opts{useSupermount} eq 'magicdev' && $part->{media_type} eq 'cdrom'); - $part->{fs_type} = !$options->{supermount} ? 'auto' : - $part->{media_type} eq 'cdrom' ? 'udf:iso9660' : 'ext2:vfat'; - } - - if ($part->{media_type} eq 'cdrom') { - $options->{ro} = 1; - } - - if ($part->{media_type} eq 'fd') { - # slow device so don't loose time, write now! - $options->{sync} = 1; - } - - if (isTrueFS($part)) { - #- noatime on laptops (do not wake up the hd) - #- Do not update inode access times on this - #- file system (e.g, for faster access on the - #- news spool to speed up news servers). - $options->{noatime} = detect_devices::isLaptop(); - } - if ($part->{fs_type} eq 'nfs') { - put_in_hash($options, { - nosuid => 1, 'rsize=8192,wsize=8192' => 1, soft => 1, - }); - } - if ($part->{fs_type} eq 'smbfs') { - add2hash($options, { 'username=' => '%' }) if !$options->{'credentials='}; - } - if (member('vfat', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') { - - put_in_hash($options, { - user => 1, noexec => 0, - }) if $part->{is_removable}; - - put_in_hash($options, { - 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, - 'iocharset=' => $opts{iocharset}, 'codepage=' => $opts{codepage}, - }); - } - if ($part->{fs_type} eq 'ntfs') { - put_in_hash($options, { ro => 1, 'nls=' => $opts{iocharset}, - 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, - }); - } - if (member('iso9660', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') { - put_in_hash($options, { user => 1, noexec => 0, 'iocharset=' => $opts{iocharset} }); - } - if ($part->{fs_type} eq 'reiserfs') { - $options->{notail} = 1; - } - if (isLoopback($part) && !isSwap($part)) { #- no need for loop option for swap files - $options->{loop} = 1; - } - - # rationalize: no need for user - if ($options->{autofs} || $options->{supermount}) { - $options->{user} = 0; - } - - # have noauto when we have user - $options->{noauto} = 1 if $options->{user}; - - if ($options->{user}) { - # ensure security (user_implies - noexec as noexec is not a security matter) - $options->{$_} = 1 foreach 'nodev', 'nosuid'; - } - - mount_options_pack($part, $options, $unknown); - - rationalize_options($part); -} - -sub set_all_default_options { - my ($all_hds, %opts) = @_; - #- opts are: useSupermount security iocharset codepage - - foreach my $part (fs::get::really_all_fstab($all_hds)) { - set_default_options($part, %opts); - } -} - sub set_removable_mntpoints { my ($all_hds) = @_; diff --git a/perl-install/fs/mount_options.pm b/perl-install/fs/mount_options.pm new file mode 100644 index 000000000..0e5d2519f --- /dev/null +++ b/perl-install/fs/mount_options.pm @@ -0,0 +1,248 @@ +package fs::mount_options; # $Id$ + +use diagnostics; +use strict; + +use common; +use fs::type; +use log; + +sub list() { + my %non_defaults = ( + sync => 'async', noatime => 'atime', noauto => 'auto', ro => 'rw', + user => 'nouser', nodev => 'dev', noexec => 'exec', nosuid => 'suid', + ); + my @user_implies = qw(noexec nodev nosuid); + \%non_defaults, \@user_implies; +} + +sub unpack { + my ($part) = @_; + my $packed_options = $part->{options}; + + my ($non_defaults, $user_implies) = list(); + + my @auto_fs = fs::auto_fs(); + my %per_fs = ( + iso9660 => [ qw(unhide) ], + vfat => [ qw(umask=0 umask=0022) ], + ntfs => [ qw(umask=0 umask=0022) ], + nfs => [ qw(rsize=8192 wsize=8192) ], + smbfs => [ qw(username= password=) ], + davfs => [ qw(username= password= uid= gid=) ], + reiserfs => [ 'notail' ], + ); + push @{$per_fs{$_}}, 'usrquota', 'grpquota' foreach 'ext2', 'ext3', 'xfs'; + + while (my ($fs, $l) = each %per_fs) { + $part->{fs_type} eq $fs || $part->{fs_type} eq 'auto' && member($fs, @auto_fs) or next; + $non_defaults->{$_} = 1 foreach @$l; + } + + $non_defaults->{encrypted} = 1 if !$part->{isFormatted} || isSwap($part); + + $non_defaults->{supermount} = 1 if $part->{fs_type} =~ /:/ || member($part->{fs_type}, 'auto', @auto_fs); + + my $defaults = { reverse %$non_defaults }; + my %options = map { $_ => '' } keys %$non_defaults; + my @unknown; + foreach (split(",", $packed_options)) { + if ($_ eq 'user') { + $options{$_} = 1 foreach 'user', @$user_implies; + } elsif (exists $non_defaults->{$_}) { + $options{$_} = 1; + } elsif ($defaults->{$_}) { + $options{$defaults->{$_}} = 0; + } elsif (/(.*?=)(.*)/) { + $options{$1} = $2; + } else { + push @unknown, $_; + } + } + # merge those, for cleaner help + $options{'rsize=8192,wsize=8192'} = delete $options{'rsize=8192'} && delete $options{'wsize=8192'} + if exists $options{'rsize=8192'}; + + my $unknown = join(",", @unknown); + \%options, $unknown; +} + +sub pack_ { + my ($_part, $options, $unknown) = @_; + + my ($non_defaults, $user_implies) = list(); + my @l; + + my @umasks = map { + if (/^umask=/) { + my $v = delete $options->{$_}; + /^umask=(.+)/ ? if_($v, $1) : $v; + } else { () } + } keys %$options; + if (@umasks) { + push @l, 'umask=' . min(@umasks); + } + + if (delete $options->{user}) { + push @l, 'user'; + foreach (@$user_implies) { + if (!delete $options->{$_}) { + # overriding + $options->{$non_defaults->{$_}} = 1; + } + } + } + push @l, map_each { if_($::b, $::a =~ /=$/ ? "$::a$::b" : $::a) } %$options; + push @l, $unknown; + + join(",", uniq(grep { $_ } @l)); +} +sub pack { + my ($part, $options, $unknown) = @_; + $part->{options} = pack_($part, $options, $unknown); + noreturn(); +} + +# update me on each util-linux new release: +sub help() { + ( + + 'grpquota' => '', + + 'noatime' => N("Do not update inode access times on this file system +(e.g, for faster access on the news spool to speed up news servers)."), + + 'noauto' => N("Can only be mounted explicitly (i.e., +the -a option will not cause the file system to be mounted)."), + + 'nodev' => N("Do not interpret character or block special devices on the file system."), + + 'noexec' => N("Do not allow execution of any binaries on the mounted +file system. This option might be useful for a server that has file systems +containing binaries for architectures other than its own."), + + 'nosuid' => N("Do not allow set-user-identifier or set-group-identifier +bits to take effect. (This seems safe, but is in fact rather unsafe if you +have suidperl(1) installed.)"), + + 'ro' => N("Mount the file system read-only."), + + 'sync' => N("All I/O to the file system should be done synchronously."), + + 'supermount' => '', + + 'user' => N("Allow an ordinary user to mount the file system. The +name of the mounting user is written to mtab so that he can unmount the file +system again. This option implies the options noexec, nosuid, and nodev +(unless overridden by subsequent options, as in the option line +user,exec,dev,suid )."), + + 'usrquota' => '', + + 'umask=0' => N("Give write access to ordinary users"), + + 'umask=0022' => N("Give read-only access to ordinary users"), + ); +} + + +sub rationalize { + my ($part) = @_; + + my ($options, $unknown) = &unpack($part); + + if ($part->{fs_type} ne 'reiserfs') { + $options->{notail} = 0; + } + + &pack($part, $options, $unknown); +} + +sub set_default { + my ($part, %opts) = @_; + #- opts are: useSupermount security iocharset codepage + + my ($options, $unknown) = &unpack($part); + + if ($part->{is_removable} && !member($part->{mntpoint}, qw(/ /usr /var /boot))) { + $options->{supermount} = $opts{useSupermount} && !($opts{useSupermount} eq 'magicdev' && $part->{media_type} eq 'cdrom'); + $part->{fs_type} = !$options->{supermount} ? 'auto' : + $part->{media_type} eq 'cdrom' ? 'udf:iso9660' : 'ext2:vfat'; + } + + if ($part->{media_type} eq 'cdrom') { + $options->{ro} = 1; + } + + if ($part->{media_type} eq 'fd') { + # slow device so don't loose time, write now! + $options->{sync} = 1; + } + + if (isTrueFS($part)) { + #- noatime on laptops (do not wake up the hd) + #- Do not update inode access times on this + #- file system (e.g, for faster access on the + #- news spool to speed up news servers). + $options->{noatime} = detect_devices::isLaptop(); + } + if ($part->{fs_type} eq 'nfs') { + put_in_hash($options, { + nosuid => 1, 'rsize=8192,wsize=8192' => 1, soft => 1, + }); + } + if ($part->{fs_type} eq 'smbfs') { + add2hash($options, { 'username=' => '%' }) if !$options->{'credentials='}; + } + if (member('vfat', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') { + + put_in_hash($options, { + user => 1, noexec => 0, + }) if $part->{is_removable}; + + put_in_hash($options, { + 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, + 'iocharset=' => $opts{iocharset}, 'codepage=' => $opts{codepage}, + }); + } + if ($part->{fs_type} eq 'ntfs') { + put_in_hash($options, { ro => 1, 'nls=' => $opts{iocharset}, + 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, + }); + } + if (member('iso9660', split(':', $part->{fs_type})) || $part->{fs_type} eq 'auto') { + put_in_hash($options, { user => 1, noexec => 0, 'iocharset=' => $opts{iocharset} }); + } + if ($part->{fs_type} eq 'reiserfs') { + $options->{notail} = 1; + } + if (isLoopback($part) && !isSwap($part)) { #- no need for loop option for swap files + $options->{loop} = 1; + } + + # rationalize: no need for user + if ($options->{autofs} || $options->{supermount}) { + $options->{user} = 0; + } + + # have noauto when we have user + $options->{noauto} = 1 if $options->{user}; + + if ($options->{user}) { + # ensure security (user_implies - noexec as noexec is not a security matter) + $options->{$_} = 1 foreach 'nodev', 'nosuid'; + } + + &pack($part, $options, $unknown); + + rationalize($part); +} + +sub set_all_default { + my ($all_hds, %opts) = @_; + #- opts are: useSupermount security iocharset codepage + + foreach my $part (fs::get::really_all_fstab($all_hds)) { + set_default($part, %opts); + } +} diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm index 7fae25536..b5a8351e3 100644 --- a/perl-install/fsedit.pm +++ b/perl-install/fsedit.pm @@ -645,7 +645,7 @@ sub change_type { $part->{mntpoint} = '' if isRawLVM($type) || isRawRAID($type); set_isFormatted($part, 0); fs::type::set_type_subpart($part, $type); - fs::rationalize_options($part); + fs::mount_options::rationalize($part); 1; } diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm index 96b5c6021..5a7351837 100644 --- a/perl-install/install_steps.pm +++ b/perl-install/install_steps.pm @@ -193,7 +193,7 @@ sub doPartitionDisksAfter { } fs::set_removable_mntpoints($o->{all_hds}); - fs::set_all_default_options($o->{all_hds}, %$o, lang::fs_options($o->{locale})) + fs::mount_options::set_all_default($o->{all_hds}, %$o, lang::fs_options($o->{locale})) if !$o->{isUpgrade}; $o->{fstab} = [ fs::get::fstab($o->{all_hds}) ]; diff --git a/perl-install/install_steps_interactive.pm b/perl-install/install_steps_interactive.pm index 8b7357375..cda91d1eb 100644 --- a/perl-install/install_steps_interactive.pm +++ b/perl-install/install_steps_interactive.pm @@ -157,7 +157,7 @@ sub selectInstallClass { log::l("choosing to upgrade partition $part->{device}"); install_any::use_root_part($o->{all_hds}, $part, $o->{prefix}); foreach (grep { $_->{mntpoint} } @{$o->{fstab}}) { - my ($options, $_unknown) = fs::mount_options_unpack($_); + my ($options, $_unknown) = fs::mount_options::unpack($_); $options->{encrypted} or next; $o->ask_from_({ focus_first => 1 }, [ { label => N("Encryption key for %s", $_->{mntpoint}), diff --git a/perl-install/network/smb.pm b/perl-install/network/smb.pm index 26b61c518..81b32f54e 100644 --- a/perl-install/network/smb.pm +++ b/perl-install/network/smb.pm @@ -15,9 +15,9 @@ sub to_fstab_entry { my ($class, $e) = @_; my $part = $class->to_fstab_entry_raw($e, 'smbfs'); if ($e->{server}{username}) { - my ($options, $unknown) = fs::mount_options_unpack($part); + my ($options, $unknown) = fs::mount_options::unpack($part); $options->{"$_="} = $e->{server}{$_} foreach qw(username password domain); - fs::mount_options_pack($part, $options, $unknown); + fs::mount_options::pack($part, $options, $unknown); } $part; } @@ -122,11 +122,11 @@ sub fstab_entry_to_credentials { my ($server_name) = network::smb->from_dev($part->{device}) or return; - my ($options, $unknown) = fs::mount_options_unpack($part); + my ($options, $unknown) = fs::mount_options::unpack($part); $options->{'username='} && $options->{'password='} or return; my %h = map { $_ => delete $options->{"$_="} } qw(username domain password); $h{file} = $options->{'credentials='} = to_credentials($server_name, $h{username}); - fs::mount_options_pack_($part, $options, $unknown), \%h; + fs::mount_options::pack_($part, $options, $unknown), \%h; } sub remove_bad_credentials { diff --git a/perl-install/network/smbnfs.pm b/perl-install/network/smbnfs.pm index 9e587a10f..c38903028 100644 --- a/perl-install/network/smbnfs.pm +++ b/perl-install/network/smbnfs.pm @@ -37,7 +37,7 @@ sub to_fullstring { sub to_fstab_entry_raw { my ($class, $e, $fs_type) = @_; my $fs_entry = { device => $class->to_dev($e), fs_type => $fs_type }; - fs::set_default_options($fs_entry); + fs::mount_options::set_default($fs_entry); $fs_entry; } diff --git a/perl-install/standalone/diskdrake b/perl-install/standalone/diskdrake index 870d115b0..74787fc21 100755 --- a/perl-install/standalone/diskdrake +++ b/perl-install/standalone/diskdrake @@ -106,7 +106,7 @@ if ($type eq 'list-hd') { my $useSupermount = 'magicdev'; require security::level; require lang; - fs::set_default_options($raw_hd, + fs::mount_options::set_default($raw_hd, useSupermount => $useSupermount, security => security::level::get(), lang::fs_options(lang::read())); diff --git a/perl-install/standalone/drakupdate_fstab b/perl-install/standalone/drakupdate_fstab index 711df4e45..46b05e9fc 100755 --- a/perl-install/standalone/drakupdate_fstab +++ b/perl-install/standalone/drakupdate_fstab @@ -91,14 +91,14 @@ sub set_options { my ($part, $useSupermount) = @_; $part->{is_removable} = 1; #- force removable flag - fs::set_default_options($part, + fs::mount_options::set_default($part, useSupermount => $useSupermount, security => security::level::get(), lang::fs_options(lang::read())); - my ($options, $unknown) = fs::mount_options_unpack($part); + my ($options, $unknown) = fs::mount_options::unpack($part); $options->{kudzu} = 1 if !$no_flag; - fs::mount_options_pack($part, $options, $unknown); + fs::mount_options::pack($part, $options, $unknown); } sub set_mount_point { |