On Tue, Nov 22, 2011 at 04:31:50PM +0000, Matthew Booth wrote:
 diff --git a/src/inspect.c b/src/inspect.c
 index 1b41be5..f9b8298 100644
 --- a/src/inspect.c
 +++ b/src/inspect.c
 @@ -61,8 +61,7 @@ guestfs__inspect_os (guestfs_h *g)
     * information to the handle.
     */
    /* Look to see if any devices directly contain filesystems (RHBZ#590167). */
 -  char **devices;
 -  devices = guestfs_list_devices (g);
 +  char **devices = guestfs_list_devices (g);
    if (devices == NULL)
      return NULL;
  
 @@ -77,8 +76,7 @@ guestfs__inspect_os (guestfs_h *g)
    guestfs___free_string_list (devices);
  
    /* Look at all partitions. */
 -  char **partitions;
 -  partitions = guestfs_list_partitions (g);
 +  char **partitions = guestfs_list_partitions (g);
    if (partitions == NULL) {
      guestfs___free_inspect_info (g);
      return NULL; 
If there's not any need for these two hunks, then omit them.  OTOH if
it's a good stylistic thing to have them, they should be in a separate
patch so that it can be cherry picked for the stable branch (since all
NFC code cleanups are candidates for cherry picking).
 @@ -141,9 +146,23 @@ static int check_hostname_redhat (guestfs_h *g,
struct inspect_fs *fs);
  static int check_hostname_freebsd (guestfs_h *g, struct inspect_fs *fs);
  static int check_fstab (guestfs_h *g, struct inspect_fs *fs);
  static int add_fstab_entry (guestfs_h *g, struct inspect_fs *fs,
 -                            const char *spec, const char *mp);
 -static char *resolve_fstab_device (guestfs_h *g, const char *spec);
 -static int inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char
*filename, int (*f) (guestfs_h *, struct inspect_fs *));
 +                            const char *spec, const char *mp,
 +                            Hash_table *md_map);
 +static char *resolve_fstab_device (guestfs_h *g, const char *spec,
 +                                   Hash_table *md_map);
 +static int inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char
**configfiles, int (*f) (guestfs_h *, struct inspect_fs *)); 
 +static size_t uuid_hash(const void *x, size_t table_size);
 +static bool uuid_cmp(const void *x, const void *y);
 +static void md_uuid_free(void *x);
 +static bool parse_uuid(const char *str, uint32_t *uuid);
 +
 +static size_t mdadm_app_hash(const void *x, size_t table_size);
 +static bool mdadm_app_cmp(const void *x, const void *y);
 +static void mdadm_app_free(void *x);
 +
 +static bool map_app_md_devices (guestfs_h *g, Hash_table **map);
 +static bool map_md_devices(guestfs_h *g, Hash_table **map); 
There's a mix of stylistic changes, extensions to core functions (such
as allowing inspect_with_augeas to take a list), and new functionality
(uuid_hash).  To make this easy to backport that could be two or three
separate layers of patches.
 @@ -684,14 +707,15 @@ check_hostname_freebsd (guestfs_h *g, struct
inspect_fs *fs)
  static int
  check_fstab (guestfs_h *g, struct inspect_fs *fs)
  {
 +  Hash_table *md_map;
 +  if (!map_md_devices (g, &md_map)) return -1; 
This doesn't call error/perrorf() on the error path.
It would be nice if we could enforce this invariant somehow (OCaml can
do this, for example).  I don't know how to in C.
The hash could also do with a small comment to explain briefly what
md_map contains.
 +        case 0:
 +          /* Duplicate uuid in for md device is weird, but not fatal. */
 +          warning(g, "inspect-os: md devices %s and %s have the same uuid",
 +                  ((md_uuid *)matched)->path, entry->path); 
I would avoid using warning() -- it says as much in the comment above
the guestfs___warning function in src/guestfs.c.  This one might be a
case for debug() instead.
That's all for now, I'll probably have more to say when I try it out.
Could all the md stuff be moved into another source file?  Might be
cleaner ...
Rich.
-- 
Richard Jones, Virtualization Group, Red Hat 
http://people.redhat.com/~rjones
Read my programming blog: 
http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora