From: Matthew Booth <mbooth@redhat.com> Date: Thu, 10 Nov 2011 17:57:16 +0000 (+0000) Subject: Update list-filesystems to check md devices. X-Git-Tag: 1.15.4~6 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=b051fffc6f4f6c095a3401f89a47fbb948a71ee1;p=libguestfs.git Update list-filesystems to check md devices. --- 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. */