diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-05-03 15:37:59 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-05-03 15:37:59 +0100 |
commit | bd91bd76d188e4a7402dd5d3c904f8cc128823b1 (patch) | |
tree | 81914c7d248332c8dc7a9a0f64a2e1e89f63d2cd /align | |
parent | 9e2cdd309b709ee1e88269ee3252768515bf56ad (diff) | |
download | libguestfs-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.c | 36 |
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. */ |