inspect: Handle cciss devices in /etc/fstab
authorMatthew Booth <mbooth@redhat.com>
Tue, 18 Oct 2011 12:42:16 +0000 (13:42 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 19 Oct 2011 15:27:38 +0000 (16:27 +0100)
regressions/test-inspect-fstab.sh
src/inspect_fs_unix.c

index bb79a81..26ea10f 100755 (executable)
@@ -93,6 +93,38 @@ if [ "$(cat test.output)" != "/dev/VG/Root
     exit 1
 fi
 
     exit 1
 fi
 
+cat <<'EOF' > test.fstab
+/dev/VG/Root / ext2 default 0 0
+
+# cciss device which requires a hint
+/dev/cciss/c1d3p1 /boot ext2 default 0 0
+
+# cciss device, whole disk
+/dev/cciss/c1d3 /var ext2 default 0 0
+EOF
+
+$guestfish -a test1.img <<'EOF'
+  run
+  mount-options "" /dev/VG/Root /
+  upload test.fstab /etc/fstab
+EOF
+
+$guestfish <<'EOF' > test.output
+  add-drive-opts test1.img readonly:true name:cciss/c1d3
+  run
+  inspect-os
+  inspect-get-mountpoints /dev/VG/Root
+EOF
+
+if [ "$(cat test.output)" != "/dev/VG/Root
+/: /dev/VG/Root
+/boot: /dev/vda1
+/var: /dev/vda" ]; then
+    echo "$0: error: unexpected output from inspect-get-mountpoints command"
+    cat test.output
+    exit 1
+fi
+
 rm test.fstab
 rm test1.img
 rm test.output
 rm test.fstab
 rm test1.img
 rm test.output
index 77834a1..6b1a05b 100644 (file)
@@ -64,6 +64,7 @@ static pcre *re_scientific_linux_no_minor;
 static pcre *re_major_minor;
 static pcre *re_aug_seq;
 static pcre *re_xdev;
 static pcre *re_major_minor;
 static pcre *re_aug_seq;
 static pcre *re_xdev;
+static pcre *re_cciss;
 static pcre *re_first_partition;
 static pcre *re_freebsd;
 static pcre *re_netbsd;
 static pcre *re_first_partition;
 static pcre *re_freebsd;
 static pcre *re_netbsd;
@@ -108,6 +109,7 @@ compile_regexps (void)
   COMPILE (re_major_minor, "(\\d+)\\.(\\d+)", 0);
   COMPILE (re_aug_seq, "/\\d+$", 0);
   COMPILE (re_xdev, "^/dev/(h|s|v|xv)d([a-z]+)(\\d*)$", 0);
   COMPILE (re_major_minor, "(\\d+)\\.(\\d+)", 0);
   COMPILE (re_aug_seq, "/\\d+$", 0);
   COMPILE (re_xdev, "^/dev/(h|s|v|xv)d([a-z]+)(\\d*)$", 0);
+  COMPILE (re_cciss, "^/dev/(cciss/c\\d+d\\d+)(?:p(\\d+))?$", 0);
   COMPILE (re_freebsd, "^/dev/ad(\\d+)s(\\d+)([a-z])$", 0);
   COMPILE (re_netbsd, "^NetBSD (\\d+)\\.(\\d+)", 0);
 }
   COMPILE (re_freebsd, "^/dev/ad(\\d+)s(\\d+)([a-z])$", 0);
   COMPILE (re_netbsd, "^NetBSD (\\d+)\\.(\\d+)", 0);
 }
@@ -128,6 +130,7 @@ free_regexps (void)
   pcre_free (re_major_minor);
   pcre_free (re_aug_seq);
   pcre_free (re_xdev);
   pcre_free (re_major_minor);
   pcre_free (re_aug_seq);
   pcre_free (re_xdev);
+  pcre_free (re_cciss);
   pcre_free (re_freebsd);
   pcre_free (re_netbsd);
 }
   pcre_free (re_freebsd);
   pcre_free (re_netbsd);
 }
@@ -880,6 +883,35 @@ resolve_fstab_device (guestfs_h *g, const char *spec)
     free (part);
     guestfs___free_string_list (devices);
   }
     free (part);
     guestfs___free_string_list (devices);
   }
+  else if (match2 (g, spec, re_cciss, &disk, &part)) {
+    /* disk: (cciss/c\d+d\d+)
+     * part: (\d+)? */
+    char **devices = guestfs_list_devices (g);
+    if (devices == NULL)
+      return NULL;
+
+    /* Check any hints we were passed for a non-heuristic mapping */
+    size_t i = 0;
+    struct drive *drive = g->drives;
+    while (drive) {
+      if (drive->name && STREQ(drive->name, disk)) {
+        if (part) {
+          device = safe_asprintf (g, "%s%s", devices[i], part);
+        } else {
+          device = safe_strdup (g, devices[i]);
+        }
+        break;
+      }
+
+      i++; drive = drive->next;
+    }
+
+    /* We don't try to guess mappings for cciss devices */
+
+    free (disk);
+    free (part);
+    guestfs___free_string_list (devices);
+  }
   else if (match3 (g, spec, re_freebsd, &disk, &slice, &part)) {
     /* FreeBSD disks are organized quite differently.  See:
      * http://www.freebsd.org/doc/handbook/disk-organization.html
   else if (match3 (g, spec, re_freebsd, &disk, &slice, &part)) {
     /* FreeBSD disks are organized quite differently.  See:
      * http://www.freebsd.org/doc/handbook/disk-organization.html