summaryrefslogtreecommitdiffstats
path: root/align
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-05-03 15:37:59 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-05-03 15:37:59 +0100
commitbd91bd76d188e4a7402dd5d3c904f8cc128823b1 (patch)
tree81914c7d248332c8dc7a9a0f64a2e1e89f63d2cd /align
parent9e2cdd309b709ee1e88269ee3252768515bf56ad (diff)
downloadlibguestfs-bd91bd76d188e4a7402dd5d3c904f8cc128823b1.tar.gz
libguestfs-bd91bd76d188e4a7402dd5d3c904f8cc128823b1.tar.xz
libguestfs-bd91bd76d188e4a7402dd5d3c904f8cc128823b1.zip
virt-alignment-scan: Don't fail immediately if a disk is not accessible (RHBZ#789504).
Diffstat (limited to 'align')
-rw-r--r--align/domains.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/align/domains.c b/align/domains.c
index 6a3a7b5f..88271380 100644
--- a/align/domains.c
+++ b/align/domains.c
@@ -89,7 +89,7 @@ static void add_domains_by_id (virConnectPtr conn, int *ids, size_t n);
static void add_domains_by_name (virConnectPtr conn, char **names, size_t n);
static void add_domain (virDomainPtr dom);
static int add_disk (guestfs_h *g, const char *filename, const char *format, int readonly, void *domain_vp);
-static void add_disks_to_handle_reverse (struct disk *disk);
+static size_t add_disks_to_handle_reverse (struct disk *disk, size_t *errors_r);
static void reset_guestfs_handle (void);
void
@@ -98,7 +98,7 @@ get_domains_from_libvirt (int uuid, size_t *worst_alignment_ptr)
virErrorPtr err;
virConnectPtr conn;
int n;
- size_t i;
+ size_t i, count, errors;
const char *prefix;
nr_domains = 0;
@@ -171,8 +171,14 @@ get_domains_from_libvirt (int uuid, size_t *worst_alignment_ptr)
/* Sort the domains alphabetically by name for display. */
qsort (domains, nr_domains, sizeof (struct domain), compare_domain_names);
+ errors = 0;
for (i = 0; i < nr_domains; ++i) {
- add_disks_to_handle_reverse (domains[i].disks);
+ if (domains[i].disks == NULL)
+ continue;
+
+ count = add_disks_to_handle_reverse (domains[i].disks, &errors);
+ if (count == 0)
+ continue;
if (guestfs_launch (g) == -1)
exit (EXIT_FAILURE);
@@ -190,6 +196,12 @@ get_domains_from_libvirt (int uuid, size_t *worst_alignment_ptr)
for (i = 0; i < nr_domains; ++i)
free_domain (&domains[i]);
free (domains);
+
+ if (errors > 0) {
+ fprintf (stderr, _("%s: failed to analyze a disk, see error(s) above\n"),
+ program_name);
+ exit (EXIT_FAILURE);
+ }
}
static void
@@ -297,13 +309,15 @@ add_disk (guestfs_h *g,
return 0;
}
-static void
-add_disks_to_handle_reverse (struct disk *disk)
+static size_t
+add_disks_to_handle_reverse (struct disk *disk, size_t *errors_r)
{
+ size_t nr_disks_added;
+
if (disk == NULL)
- return;
+ return 0;
- add_disks_to_handle_reverse (disk->next);
+ nr_disks_added = add_disks_to_handle_reverse (disk->next, errors_r);
struct guestfs_add_drive_opts_argv optargs = { .bitmask = 0 };
@@ -315,8 +329,12 @@ add_disks_to_handle_reverse (struct disk *disk)
optargs.format = disk->format;
}
- if (guestfs_add_drive_opts_argv (g, disk->filename, &optargs) == -1)
- exit (EXIT_FAILURE);
+ if (guestfs_add_drive_opts_argv (g, disk->filename, &optargs) == -1) {
+ (*errors_r)++;
+ return nr_disks_added;
+ }
+
+ return nr_disks_added+1;
}
/* Close and reopen the libguestfs handle. */