Fix 'unknown filesystem' warnings in old inspection code (RHBZ#678231 RHBZ#666578).
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 11 Aug 2011 10:45:25 +0000 (11:45 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 17 Aug 2011 12:10:19 +0000 (13:10 +0100)
This is a comprehensive fix for the warnings from the old (and
obsolete) Perl inspection code.  For a full description and
reproducer, see:

https://bugzilla.redhat.com/show_bug.cgi?id=678231#c5
(cherry picked from commit b9838001015a06a69a08b69d9f013d82f0ea3139)

perl/lib/Sys/Guestfs/Lib.pm

index fc6a10f..007db64 100644 (file)
@@ -892,23 +892,29 @@ sub _find_filesystem
 
     if (/^LABEL=(.*)/) {
         my $label = $1;
 
     if (/^LABEL=(.*)/) {
         my $label = $1;
-        foreach (sort keys %$fses) {
-            if (exists $fses->{$_}->{label} &&
-                $fses->{$_}->{label} eq $label) {
-                return ($_, $fses->{$_});
-            }
-        }
-        warn __x("unknown filesystem label {label}\n", label => $label);
+        my $dev;
+        eval {
+            $dev = $g->findfs_label ($label);
+        };
+        warn "unknown filesystem LABEL=$label in /etc/fstab: $@\n" if $@;
+        return () if !defined $dev;
+        $dev = _canonical_dev ($dev);
+        return ($dev, $fses->{$dev}) if exists $fses->{$dev};
+        # Otherwise return nothing.  It's just a filesystem that we are
+        # ignoring, eg. swap.
         return ();
     } elsif (/^UUID=(.*)/) {
         my $uuid = $1;
         return ();
     } elsif (/^UUID=(.*)/) {
         my $uuid = $1;
-        foreach (sort keys %$fses) {
-            if (exists $fses->{$_}->{uuid} &&
-                $fses->{$_}->{uuid} eq $uuid) {
-                return ($_, $fses->{$_});
-            }
-        }
-        warn __x("unknown filesystem UUID {uuid}\n", uuid => $uuid);
+        my $dev;
+        eval {
+            $dev = $g->findfs_uuid ($uuid);
+        };
+        warn "unknown filesystem UUID=$uuid in /etc/fstab: $@\n" if $@;
+        return () if !defined $dev;
+        $dev = _canonical_dev ($dev);
+        return ($dev, $fses->{$dev}) if exists $fses->{$dev};
+        # Otherwise return nothing.  It's just a filesystem that we are
+        # ignoring, eg. swap.
         return ();
     } else {
         return ($_, $fses->{$_}) if exists $fses->{$_};
         return ();
     } else {
         return ($_, $fses->{$_}) if exists $fses->{$_};