[Libguestfs] [PATCH 3/3] Update list-filesystems to check md devices.

Wanlong Gao gaowanlong at cn.fujitsu.com
Mon Nov 14 07:46:47 UTC 2011


On 11/11/2011 08:58 PM, Richard W.M. Jones wrote:

> From: Matthew Booth <mbooth at redhat.com>


Reviewed-by: Wanlong Gao <gaowanlong at cn.fujitsu.com>

Thanks Richard and Matthew.

> 
> ---
>  regressions/Makefile.am              |    1 +
>  regressions/test-list-filesystems.sh |   76 ++++++++++++++++++++++++++++++++++
>  src/listfs.c                         |   51 ++++++++++++-----------
>  3 files changed, 104 insertions(+), 24 deletions(-)
>  create mode 100755 regressions/test-list-filesystems.sh
> 
> diff --git a/regressions/Makefile.am b/regressions/Makefile.am
> index f273464..c75d54a 100644
> --- a/regressions/Makefile.am
> +++ b/regressions/Makefile.am
> @@ -45,6 +45,7 @@ TESTS = \
>  	test-guestfish-tilde.sh \
>  	test-inspect-fstab.sh \
>  	test-launch-race.pl \
> +	test-list-filesystems.sh \
>  	test-list-md-devices.sh \
>  	test-luks.sh \
>  	test-luks-list.sh \
> diff --git a/regressions/test-list-filesystems.sh b/regressions/test-list-filesystems.sh
> new file mode 100755
> index 0000000..1144286
> --- /dev/null
> +++ b/regressions/test-list-filesystems.sh
> @@ -0,0 +1,76 @@
> +#!/bin/bash -
> +# libguestfs
> +# Copyright (C) 2011 Red Hat Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +
> +# Test guestfish list-mddevices command
> +
> +set -e
> +
> +# Create 2 disks partitioned as:
> +# sda1: 20M ext3
> +# sda2: 20M MD (md127)
> +#
> +# sdb1: 20M PV (vg0)
> +# sdb2: 20M MD (md127)
> +#
> +# md127 : 20M ext4
> +# vg0 : 16M LV (lv0)
> +# lv0 : 16M vfat
> +output=$(
> +../fish/guestfish <<EOF
> +# Add 2 empty disks
> +sparse fs-test1.img 50M
> +sparse fs-test2.img 50M
> +run
> +
> +part-init /dev/sda mbr
> +part-add /dev/sda p 64 41023
> +part-add /dev/sda p 41024 81983
> +part-init /dev/sdb mbr
> +part-add /dev/sdb p 64 41023
> +part-add /dev/sdb p 41024 81983
> +
> +# Create vg0 and lv0 on /dev/sdb1
> +pvcreate /dev/sdb1
> +vgcreate vg0 /dev/sdb1
> +lvcreate lv0 vg0 16
> +
> +# Create an md device from sda2 and sdb2
> +mdadm-create test "/dev/sda2 /dev/sdb2" level:raid1
> +
> +# Create filesystems
> +mkfs ext3 /dev/sda1
> +mkfs ext4 /dev/md127
> +mkfs vfat /dev/vg0/lv0
> +
> +list-filesystems
> +EOF
> +)
> +
> +expected="/dev/vda1: ext3
> +/dev/md127: ext4
> +/dev/vg0/lv0: vfat"
> +
> +# Check the output of list-filesystems
> +if [ "$output" != "$expected" ]; then
> +    echo "$0: error: output of list-filesystems did not match expected output"
> +    printf "%s\n" "$output"
> +    exit 1;
> +fi
> +
> +
> +rm -f fs-test1.img fs-test2.img
> diff --git a/src/listfs.c b/src/listfs.c
> index 42bbaef..0aef4f9 100644
> --- a/src/listfs.c
> +++ b/src/listfs.c
> @@ -45,12 +45,13 @@ char **
>  guestfs__list_filesystems (guestfs_h *g)
>  {
>    size_t i;
> -  char **ret;
> -  size_t ret_size;
> +  char **ret = NULL;
> +  size_t ret_size = 0;
>  
> -  ret = safe_malloc (g, sizeof (char *));
> -  ret[0] = NULL;
> -  ret_size = 0;
> +  char **devices = NULL;
> +  char **partitions = NULL;
> +  char **mds = NULL;
> +  char **lvs = NULL;
>  
>    /* Look to see if any devices directly contain filesystems
>     * (RHBZ#590167).  However vfs-type will fail to tell us anything
> @@ -58,19 +59,12 @@ guestfs__list_filesystems (guestfs_h *g)
>     * get the list of partitions and exclude the corresponding devices
>     * by using part-to-dev.
>     */
> -  char **devices;
>    devices = guestfs_list_devices (g);
> -  if (devices == NULL) {
> -    guestfs___free_string_list (ret);
> -    return NULL;
> -  }
> -  char **partitions;
> +  if (devices == NULL) goto error;
>    partitions = guestfs_list_partitions (g);
> -  if (partitions == NULL) {
> -    guestfs___free_string_list (devices);
> -    guestfs___free_string_list (ret);
> -    return NULL;
> -  }
> +  if (partitions == NULL) goto error;
> +  mds = guestfs_list_md_devices (g);
> +  if (mds == NULL) goto error;
>  
>    for (i = 0; partitions[i] != NULL; ++i) {
>      char *dev = guestfs_part_to_dev (g, partitions[i]);
> @@ -82,28 +76,37 @@ guestfs__list_filesystems (guestfs_h *g)
>    /* Use vfs-type to check for filesystems on devices. */
>    for (i = 0; devices[i] != NULL; ++i)
>      check_with_vfs_type (g, devices[i], &ret, &ret_size);
> -  guestfs___free_string_list (devices);
>  
>    /* Use vfs-type to check for filesystems on partitions. */
>    for (i = 0; partitions[i] != NULL; ++i)
>      check_with_vfs_type (g, partitions[i], &ret, &ret_size);
> -  guestfs___free_string_list (partitions);
> +
> +  /* Use vfs-type to check for filesystems on md devices. */
> +  for (i = 0; mds[i] != NULL; ++i)
> +    check_with_vfs_type (g, mds[i], &ret, &ret_size);
>  
>    if (guestfs___feature_available (g, "lvm2")) {
>      /* Use vfs-type to check for filesystems on LVs. */
> -    char **lvs;
>      lvs = guestfs_lvs (g);
> -    if (lvs == NULL) {
> -      guestfs___free_string_list (ret);
> -      return NULL;
> -    }
> +    if (lvs == NULL) goto error;
>  
>      for (i = 0; lvs[i] != NULL; ++i)
>        check_with_vfs_type (g, lvs[i], &ret, &ret_size);
> -    guestfs___free_string_list (lvs);
>    }
>  
> +  guestfs___free_string_list (devices);
> +  guestfs___free_string_list (partitions);
> +  guestfs___free_string_list (mds);
> +  if (lvs) guestfs___free_string_list (lvs);
>    return ret;
> +
> + error:
> +  if (devices) guestfs___free_string_list (devices);
> +  if (partitions) guestfs___free_string_list (partitions);
> +  if (mds) guestfs___free_string_list (mds);
> +  if (lvs) guestfs___free_string_list (lvs);
> +  if (ret) guestfs___free_string_list (ret);
> +  return NULL;
>  }
>  
>  /* If 'item' occurs in 'list', remove and free it. */





More information about the Libguestfs mailing list