[Libguestfs] [PATCH] inspection: Handle MD devices in fstab

Richard W.M. Jones rjones at redhat.com
Tue Nov 22 19:41:56 UTC 2011


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




More information about the Libguestfs mailing list