[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#336636: fails on fstab line without optional fields



On Tue, Nov 01, 2005 at 10:08:11PM +0100, Jonas Smedegaard wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On Tue, 1 Nov 2005 17:37:19 +0100
> Sven Luther <sven.luther@wanadoo.fr> wrote:
> 
> > BTW, i just had an idea, but is maybe the way yaird does this not
> > broken, and it should use the mount output instead :
> 
> The output of mount shows what is currently mounted.
> 
> /etc/fstab shows what is intended to be mounted.
> 
> So switching to using a different rootfs for the next mount would not
> be possible if relying on what's mounted now.

Please find attached a patch to do 
* absent options in fstab
* multiple fstypes: ext2,ext3
* auto fstype.

We could use blkid to verify the fstype even if it's given explicitly
in /etc/fstab, then do an error message if there's no match so the
image would not boot.  Somehow I get the impression that's an improvement
that would not be much appreciated today ...

Regards,
Erik

This is the test set used to make the patch:
	#
	# This is true; works
	#   /dev/mapper/vg0-tst /b ext3 defaults,noauto 0 2
	# This is a lie, its ext3 -- mount complains 'wrong fstype or superblock'.
	# Expect yaird to fail at boot time.
	#   /dev/mapper/vg0-tst /b vfat defaults,noauto 0 2
	# this is successful -- do two mount system calls, both fs types.
	#    /dev/mapper/vg0-tst /b vfat,ext3 defaults,noauto 0 2
	# Works, but complains about unknown fstype '' if it was already mounted
	# deviant repeat errors not tested for other variants.
	#    /dev/mapper/vg0-tst /b vfat,ext3, defaults,noauto 0 2
	# Works
	#    /dev/mapper/vg0-tst /b ,vfat,ext3 defaults,noauto 0 2
	# Works
	#    /dev/mapper/vg0-tst /b vfat,,ext3 defaults,noauto 0 2
	# Fails
	#    /dev/mapper/vg0-tst /b ,, defaults,noauto 0 2
	# this works -- courtesy of blkid libaries
	#   /dev/mapper/vg0-tst /b auto defaults,noauto 0 2
	# this works - fsck stuff is optional
	#   /dev/mapper/vg0-tst /b ext3 defaults,noauto
	# this also works
	#   /dev/mapper/vg0-tst /b ext3
	# this breaks -- mount complains unknown fstype ''
	#   /dev/mapper/vg0-tst /b
	#


diff -urN -x {arch} -x .arch-ids -x configure -x aclocal.m4 -x depcomp -x missing -x Makefile -x Makefile.in -x install-sh -x INSTALL p79/ChangeLog p83/ChangeLog
--- p79/ChangeLog	2005-11-01 22:55:04.000000000 +0100
+++ p83/ChangeLog	2005-11-01 22:55:16.000000000 +0100
@@ -2,6 +2,62 @@
 # arch-tag: automatic-ChangeLog--ekonijn@xs4all.nl--debian/yaird--devo--0.1
 #
 
+2005-11-01 21:54:21 GMT	Erik van Konijnenburg <ekonijn@xs4all.nl>	patch-83
+
+    Summary:
+      support fstype == auto
+    Revision:
+      yaird--devo--0.1--patch-83
+
+    support fstype == auto
+    
+
+    modified files:
+     ChangeLog perl/Plan.pm
+
+
+2005-11-01 21:29:30 GMT	Erik van Konijnenburg <ekonijn@xs4all.nl>	patch-82
+
+    Summary:
+      merge optGetOutput from evms branch
+    Revision:
+      yaird--devo--0.1--patch-82
+
+    merge optGetOutput from evms branch
+    
+
+    modified files:
+     ChangeLog perl/Base.pm
+
+
+2005-11-01 21:15:27 GMT	Erik van Konijnenburg <ekonijn@xs4all.nl>	patch-81
+
+    Summary:
+      allow absent fs options
+    Revision:
+      yaird--devo--0.1--patch-81
+
+    allow absent fs options
+    
+
+    modified files:
+     ChangeLog perl/FsTab.pm
+
+
+2005-11-01 21:04:52 GMT	Erik van Konijnenburg <ekonijn@xs4all.nl>	patch-80
+
+    Summary:
+      allow fstype ext3,vfat
+    Revision:
+      yaird--devo--0.1--patch-80
+
+    allow fstype ext3,vfat
+    
+
+    modified files:
+     ChangeLog perl/Plan.pm
+
+
 2005-11-01 20:28:10 GMT	Erik van Konijnenburg <ekonijn@xs4all.nl>	patch-79
 
     Summary:
diff -urN -x {arch} -x .arch-ids -x configure -x aclocal.m4 -x depcomp -x missing -x Makefile -x Makefile.in -x install-sh -x INSTALL p79/perl/Base.pm p83/perl/Base.pm
--- p79/perl/Base.pm	2005-11-01 22:55:04.000000000 +0100
+++ p83/perl/Base.pm	2005-11-01 22:55:16.000000000 +0100
@@ -35,6 +35,7 @@
 #
 # Also routines to
 # - read content of one-line files
+# - read content of multi-line files
 # - get device number from block or character device files
 # - interpret symbolic links
 # - interpret pathnames
@@ -151,6 +152,69 @@
 
 
 #
+# optGetOutput -- all chomped lines of output for a given command.
+# The twist is that a non-existent command is acceptable,
+# and results in returning undef.
+# Errors in invoking the cmd are fatal.
+# Discard stderr.
+#
+sub optGetOutput {
+	my ($cmd, @args) = @_;
+	my $cmdLine = join (' ', $cmd, @args);
+
+	my $in;
+	my $result;
+	if (! -e $cmd) {
+		Base::debug ("No command $cmd, returning undef");
+		return undef;
+	}
+
+	my $rc = open ($in, "-|");
+
+	if (! defined ($rc)) {
+		Base::fatal ("Can't start command $cmdLine");
+	}
+	elsif ($rc == 0) {
+		# Child - setup stderr and exec or fatal.
+		$rc = open (STDERR, '>', '/dev/null');
+		if (! $rc) {
+			exit (1);
+		}
+
+		# Do the exec like so to make shell escapes
+		# impossible.
+		exec { $cmd } $cmd, @args;
+
+		# Let parent do the error message.
+		exit (1);
+	}
+	else {
+		# parent
+		my @lines = <$in>;
+		if (! close ($in)) {
+			Base::fatal ("Could not read output for $cmdLine");
+		}
+		chomp @lines;
+		$result = [ @lines ];
+	}
+	return $result;
+}
+
+
+# getOutput -- the same, except that command must exist.
+sub getOutput {
+	my ($cmd, @args) = @_;
+
+	my $result = optGetOutput ($cmd, @args);
+	if (! defined ($result)) {
+		my $cmdLine = join (' ', $cmd, @args);
+		Base::fatal ("Could not execute $cmdLine");
+	}
+	return $result;
+}
+
+
+#
 # devno -- given pathname to a device, return "maj:min" or undef.
 # symlinks are resolved implicitly.
 #
diff -urN -x {arch} -x .arch-ids -x configure -x aclocal.m4 -x depcomp -x missing -x Makefile -x Makefile.in -x install-sh -x INSTALL p79/perl/FsTab.pm p83/perl/FsTab.pm
--- p79/perl/FsTab.pm	2005-11-01 22:55:04.000000000 +0100
+++ p83/perl/FsTab.pm	2005-11-01 22:55:16.000000000 +0100
@@ -45,10 +45,14 @@
 		next if $line =~ /^#/;	# comment line
 		next if $line eq "";	# empty line
 		my @fields = split (/\s+/, $line, 999);
-		if ($#fields < 4) {
-			# no test for extra fields;
+		if ($#fields < 3) {
+			# No test for extra fields;
 			# the mount command allows that.
-			# note that field 5,6 (fsck stuff) is optional
+			# Note that field 5,6 (fsck stuff) is optional.
+			# Note that mount(8) does not explicitly handle
+			# absence of field 4 (options) in fstab line,
+			# but effect is that no special options are
+			# passed to mount system call.
 			Base::fatal ("malformed line in $name:$lineNo");
 		}
 		if ($fields[2] eq "swap") {
diff -urN -x {arch} -x .arch-ids -x configure -x aclocal.m4 -x depcomp -x missing -x Makefile -x Makefile.in -x install-sh -x INSTALL p79/perl/Plan.pm p83/perl/Plan.pm
--- p79/perl/Plan.pm	2005-11-01 22:55:04.000000000 +0100
+++ p83/perl/Plan.pm	2005-11-01 22:55:16.000000000 +0100
@@ -543,7 +543,39 @@
 	addDevicePlan ($actions, $abd, []);
 
 	my $fsType = $root->type;
-	ModProbe::addModules ($actions, [ $fsType ]);
+
+	if ($fsType eq "auto") {
+		#
+		# Let's guess the fstype using /sbin/blkid.
+		#
+		my $guess = Base::optGetOutput ('/sbin/blkid', $rootDevName);
+		if (!defined ($guess)) {
+			my $origin = $root->origin;
+			Base::fatal ("the command /sbin/blkid is not found, so file system type 'auto' for '$rootDevName' is not supported; use an explicit file system type ($origin)");
+		}
+		if (@{$guess} != 1) {
+			my $origin = $root->origin;
+			Base::fatal ("the command /sbin/blkid $rootDevName did not give exactly one line of output, so file system type 'auto' for '$rootDevName' is not supported; use an explicit file system type ($origin)");
+		}
+
+		if (${$guess}[0] !~ /\sTYPE="([a-zA-Z0-9]+)"/) {
+			my $origin = $root->origin;
+			Base::fatal ("the command /sbin/blkid $rootDevName did not have TYPE=\"fstype\" in the output, so file system type 'auto' for '$rootDevName' is not supported; use an explicit file system type ($origin)");
+		}
+		$fsType = $1;
+		Base::debug ("blkid $rootDevName => $fsType");
+	}
+
+	#
+	# Actually, fsType may be a comma-separated list of types,
+	# to be tried in turn
+	#
+	my @types = grep {$_ ne ''} split (',', $fsType);
+	if (@types == 0) {
+		my $origin = $root->origin;
+		Base::fatal ("no file system type given for '$rootDevName'; use an explicit file system type ($origin)");
+	}
+	ModProbe::addModules ($actions, [ @types ]);
 
 	my $yspecial = $abd->yspecial();
 	my $opts = $root->opts->cmdLineVersion();



Reply to: