qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 27/41] error: Use error_reportf_err() where it makes obvious sense
Date: Wed, 13 Jan 2016 16:43:25 +0100	[thread overview]
Message-ID: <1452699819-26608-28-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1452699819-26608-1-git-send-email-armbru@redhat.com>

Done with this Coccinelle semantic patch

    @@
    expression FMT, E, S;
    expression list ARGS;
    @@
    -    error_report(FMT, ARGS, error_get_pretty(E));
    +    error_reportf_err(E, FMT/*@@@*/, ARGS);
    (
    -    error_free(E);
    |
	 exit(S);
    |
	 abort();
    )

followed by a replace of '%s"/*@@@*/' by '"' and some line rewrapping,
because I can't figure out how to make Coccinelle transform strings.

We now use the error whole instead of just its message obtained with
error_get_pretty().  This avoids suppressing its hint (see commit
50b7b00), but I can't see how the errors touched in this commit could
come with hints.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1450452927-8346-12-git-send-email-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 arch_init.c               |  4 +---
 block/sheepdog.c          |  5 ++---
 blockdev.c                | 12 +++++-------
 hw/arm/cubieboard.c       |  9 ++++-----
 hw/arm/digic_boards.c     |  3 +--
 hw/core/qdev-properties.c |  6 ++----
 hw/core/qdev.c            |  5 ++---
 hw/i386/pc.c              |  5 ++---
 hw/ppc/e500.c             |  4 ++--
 hw/usb/bus.c              |  5 ++---
 qemu-img.c                | 33 +++++++++++++--------------------
 qemu-nbd.c                | 11 +++++------
 replay/replay.c           |  3 +--
 tests/test-aio.c          |  4 +---
 tests/test-thread-pool.c  |  4 +---
 ui/vnc.c                  |  4 +---
 vl.c                      |  6 ++----
 17 files changed, 47 insertions(+), 76 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index 38f5fb9..d1383b3 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -258,9 +258,7 @@ void do_acpitable_option(const QemuOpts *opts)
 
     acpi_table_add(opts, &err);
     if (err) {
-        error_report("Wrong acpi table provided: %s",
-                     error_get_pretty(err));
-        error_free(err);
+        error_reportf_err(err, "Wrong acpi table provided: ");
         exit(1);
     }
 #endif
diff --git a/block/sheepdog.c b/block/sheepdog.c
index dd8301b..6986be8 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2405,9 +2405,8 @@ static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
 
     ret = do_sd_create(s, &new_vid, 1, &local_err);
     if (ret < 0) {
-        error_report("failed to create inode for snapshot: %s",
-                     error_get_pretty(local_err));
-        error_free(local_err);
+        error_reportf_err(local_err,
+                          "failed to create inode for snapshot: ");
         goto cleanup;
     }
 
diff --git a/blockdev.c b/blockdev.c
index 2df0c6d..1392fff 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1582,13 +1582,11 @@ static void internal_snapshot_abort(BlkActionState *common)
     }
 
     if (bdrv_snapshot_delete(bs, sn->id_str, sn->name, &local_error) < 0) {
-        error_report("Failed to delete snapshot with id '%s' and name '%s' on "
-                     "device '%s' in abort: %s",
-                     sn->id_str,
-                     sn->name,
-                     bdrv_get_device_name(bs),
-                     error_get_pretty(local_error));
-        error_free(local_error);
+        error_reportf_err(local_error,
+                          "Failed to delete snapshot with id '%s' and "
+                          "name '%s' on device '%s' in abort: ",
+                          sn->id_str, sn->name,
+                          bdrv_get_device_name(bs));
     }
 }
 
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index bf068cd..a71e43c 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -39,27 +39,26 @@ static void cubieboard_init(MachineState *machine)
 
     object_property_set_int(OBJECT(&s->a10->emac), 1, "phy-addr", &err);
     if (err != NULL) {
-        error_report("Couldn't set phy address: %s", error_get_pretty(err));
+        error_reportf_err(err, "Couldn't set phy address: ");
         exit(1);
     }
 
     object_property_set_int(OBJECT(&s->a10->timer), 32768, "clk0-freq", &err);
     if (err != NULL) {
-        error_report("Couldn't set clk0 frequency: %s", error_get_pretty(err));
+        error_reportf_err(err, "Couldn't set clk0 frequency: ");
         exit(1);
     }
 
     object_property_set_int(OBJECT(&s->a10->timer), 24000000, "clk1-freq",
                             &err);
     if (err != NULL) {
-        error_report("Couldn't set clk1 frequency: %s", error_get_pretty(err));
+        error_reportf_err(err, "Couldn't set clk1 frequency: ");
         exit(1);
     }
 
     object_property_set_bool(OBJECT(s->a10), true, "realized", &err);
     if (err != NULL) {
-        error_report("Couldn't realize Allwinner A10: %s",
-                     error_get_pretty(err));
+        error_reportf_err(err, "Couldn't realize Allwinner A10: ");
         exit(1);
     }
 
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index 710045a..dfaed25 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -64,8 +64,7 @@ static void digic4_board_init(DigicBoard *board)
     s->digic = DIGIC(object_new(TYPE_DIGIC));
     object_property_set_bool(OBJECT(s->digic), true, "realized", &err);
     if (err != NULL) {
-        error_report("Couldn't realize DIGIC SoC: %s",
-                     error_get_pretty(err));
+        error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
         exit(1);
     }
 
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index fffb58e..3572810 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1063,10 +1063,8 @@ static void qdev_prop_set_globals_for_type(DeviceState *dev,
         object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
         if (err != NULL) {
             assert(prop->user_provided);
-            error_report("Warning: global %s.%s=%s ignored: %s",
-                         prop->driver, prop->property, prop->value,
-                         error_get_pretty(err));
-            error_free(err);
+            error_reportf_err(err, "Warning: global %s.%s=%s ignored: ",
+                              prop->driver, prop->property, prop->value);
             return;
         }
     }
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 4e3173d..2c7101d 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -370,9 +370,8 @@ void qdev_init_nofail(DeviceState *dev)
 
     object_property_set_bool(OBJECT(dev), true, "realized", &err);
     if (err) {
-        error_report("Initialization of device %s failed: %s",
-                     object_get_typename(OBJECT(dev)),
-                     error_get_pretty(err));
+        error_reportf_err(err, "Initialization of device %s failed: ",
+                          object_get_typename(OBJECT(dev)));
         exit(1);
     }
 }
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 166e8e2..0e5c86a 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1253,9 +1253,8 @@ void pc_acpi_init(const char *default_dsdt)
 
         acpi_table_add_builtin(opts, &err);
         if (err) {
-            error_report("WARNING: failed to load %s: %s", filename,
-                         error_get_pretty(err));
-            error_free(err);
+            error_reportf_err(err, "WARNING: failed to load %s: ",
+                              filename);
         }
         g_free(filename);
     }
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index b3418db..bd7da47 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -751,8 +751,8 @@ static qemu_irq *ppce500_init_mpic(MachineState *machine, PPCE500Params *params,
             dev = ppce500_init_mpic_kvm(params, irqs, &err);
         }
         if (machine_kernel_irqchip_required(machine) && !dev) {
-            error_report("kernel_irqchip requested but unavailable: %s",
-                         error_get_pretty(err));
+            error_reportf_err(err,
+                              "kernel_irqchip requested but unavailable: ");
             exit(1);
         }
     }
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index ee6b43a..26ab67f 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -725,9 +725,8 @@ USBDevice *usbdevice_create(const char *cmdline)
     }
     object_property_set_bool(OBJECT(dev), true, "realized", &err);
     if (err) {
-        error_report("Failed to initialize USB device '%s': %s",
-                     f->name, error_get_pretty(err));
-        error_free(err);
+        error_reportf_err(err, "Failed to initialize USB device '%s': ",
+                          f->name);
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/qemu-img.c b/qemu-img.c
index f4f5540..a5949e6 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -213,9 +213,7 @@ static BlockBackend *img_open(const char *id, const char *filename,
 
     blk = blk_new_open(id, filename, NULL, options, flags, &local_err);
     if (!blk) {
-        error_report("Could not open '%s': %s", filename,
-                     error_get_pretty(local_err));
-        error_free(local_err);
+        error_reportf_err(local_err, "Could not open '%s': ", filename);
         goto fail;
     }
 
@@ -360,8 +358,7 @@ static int img_create(int argc, char **argv)
     bdrv_img_create(filename, fmt, base_filename, base_fmt,
                     options, img_size, BDRV_O_FLAGS, &local_err, quiet);
     if (local_err) {
-        error_report("%s: %s", filename, error_get_pretty(local_err));
-        error_free(local_err);
+        error_reportf_err(local_err, "%s: ", filename);
         goto fail;
     }
 
@@ -1711,9 +1708,7 @@ static int img_convert(int argc, char **argv)
         bdrv_snapshot_load_tmp_by_id_or_name(bs[0], snapshot_name, &local_err);
     }
     if (local_err) {
-        error_report("Failed to load snapshot: %s",
-                     error_get_pretty(local_err));
-        error_free(local_err);
+        error_reportf_err(local_err, "Failed to load snapshot: ");
         ret = -1;
         goto out;
     }
@@ -1809,9 +1804,8 @@ static int img_convert(int argc, char **argv)
         /* Create the new image */
         ret = bdrv_create(drv, out_filename, opts, &local_err);
         if (ret < 0) {
-            error_report("%s: error while converting %s: %s",
-                         out_filename, out_fmt, error_get_pretty(local_err));
-            error_free(local_err);
+            error_reportf_err(local_err, "%s: error while converting %s: ",
+                              out_filename, out_fmt);
             goto out;
         }
     }
@@ -2439,9 +2433,8 @@ static int img_snapshot(int argc, char **argv)
     case SNAPSHOT_DELETE:
         bdrv_snapshot_delete_by_id_or_name(bs, snapshot_name, &err);
         if (err) {
-            error_report("Could not delete snapshot '%s': %s",
-                         snapshot_name, error_get_pretty(err));
-            error_free(err);
+            error_reportf_err(err, "Could not delete snapshot '%s': ",
+                              snapshot_name);
             ret = 1;
         }
         break;
@@ -2574,9 +2567,9 @@ static int img_rebase(int argc, char **argv)
         blk_old_backing = blk_new_open("old_backing", backing_name, NULL,
                                        options, src_flags, &local_err);
         if (!blk_old_backing) {
-            error_report("Could not open old backing file '%s': %s",
-                         backing_name, error_get_pretty(local_err));
-            error_free(local_err);
+            error_reportf_err(local_err,
+                              "Could not open old backing file '%s': ",
+                              backing_name);
             goto out;
         }
 
@@ -2591,9 +2584,9 @@ static int img_rebase(int argc, char **argv)
             blk_new_backing = blk_new_open("new_backing", out_baseimg, NULL,
                                            options, src_flags, &local_err);
             if (!blk_new_backing) {
-                error_report("Could not open new backing file '%s': %s",
-                             out_baseimg, error_get_pretty(local_err));
-                error_free(local_err);
+                error_reportf_err(local_err,
+                                  "Could not open new backing file '%s': ",
+                                  out_baseimg);
                 goto out;
             }
         }
diff --git a/qemu-nbd.c b/qemu-nbd.c
index b8be3bc..f9fce4a 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -495,8 +495,8 @@ int main(int argc, char **argv)
                                 BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                                 &local_err);
             if (local_err) {
-                error_report("Failed to parse detect_zeroes mode: %s",
-                             error_get_pretty(local_err));
+                error_reportf_err(local_err,
+                                  "Failed to parse detect_zeroes mode: ");
                 exit(EXIT_FAILURE);
             }
             if (detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
@@ -703,8 +703,8 @@ int main(int argc, char **argv)
     srcpath = argv[optind];
     blk = blk_new_open("hda", srcpath, NULL, options, flags, &local_err);
     if (!blk) {
-        error_report("Failed to blk_new_open '%s': %s", argv[optind],
-                     error_get_pretty(local_err));
+        error_reportf_err(local_err, "Failed to blk_new_open '%s': ",
+                          argv[optind]);
         exit(EXIT_FAILURE);
     }
     bs = blk_bs(blk);
@@ -719,8 +719,7 @@ int main(int argc, char **argv)
                                                    &local_err);
     }
     if (ret < 0) {
-        error_report("Failed to load snapshot: %s",
-                     error_get_pretty(local_err));
+        error_reportf_err(local_err, "Failed to load snapshot: ");
         exit(EXIT_FAILURE);
     }
 
diff --git a/replay/replay.c b/replay/replay.c
index 0d33e82..e4673b3 100644
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -291,8 +291,7 @@ void replay_start(void)
     }
 
     if (replay_blockers) {
-        error_report("Record/replay: %s",
-                     error_get_pretty(replay_blockers->data));
+        error_reportf_err(replay_blockers->data, "Record/replay: ");
         exit(1);
     }
     if (!use_icount) {
diff --git a/tests/test-aio.c b/tests/test-aio.c
index f0b447e..6ccea98 100644
--- a/tests/test-aio.c
+++ b/tests/test-aio.c
@@ -832,9 +832,7 @@ int main(int argc, char **argv)
 
     ctx = aio_context_new(&local_error);
     if (!ctx) {
-        error_report("Failed to create AIO Context: %s",
-                     error_get_pretty(local_error));
-        error_free(local_error);
+        error_reportf_err(local_error, "Failed to create AIO Context: ");
         exit(1);
     }
     src = aio_get_g_source(ctx);
diff --git a/tests/test-thread-pool.c b/tests/test-thread-pool.c
index 153b8f5..ccdee39 100644
--- a/tests/test-thread-pool.c
+++ b/tests/test-thread-pool.c
@@ -229,9 +229,7 @@ int main(int argc, char **argv)
 
     ctx = aio_context_new(&local_error);
     if (!ctx) {
-        error_report("Failed to create AIO Context: %s",
-                     error_get_pretty(local_error));
-        error_free(local_error);
+        error_reportf_err(local_error, "Failed to create AIO Context: ");
         exit(1);
     }
     pool = aio_get_thread_pool(ctx);
diff --git a/ui/vnc.c b/ui/vnc.c
index 09756cd..54673eb 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3861,9 +3861,7 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
     vnc_display_init(id);
     vnc_display_open(id, &local_err);
     if (local_err != NULL) {
-        error_report("Failed to start VNC server: %s",
-                     error_get_pretty(local_err));
-        error_free(local_err);
+        error_reportf_err(local_err, "Failed to start VNC server: ");
         exit(1);
     }
     return 0;
diff --git a/vl.c b/vl.c
index 7548fa2..20a367b 100644
--- a/vl.c
+++ b/vl.c
@@ -3043,7 +3043,7 @@ int main(int argc, char **argv, char **envp)
     runstate_init();
 
     if (qcrypto_init(&err) < 0) {
-        error_report("cannot initialize crypto: %s", error_get_pretty(err));
+        error_reportf_err(err, "cannot initialize crypto: ");
         exit(1);
     }
     rtc_clock = QEMU_CLOCK_HOST;
@@ -4649,9 +4649,7 @@ int main(int argc, char **argv, char **envp)
         Error *local_err = NULL;
         qemu_start_incoming_migration(incoming, &local_err);
         if (local_err) {
-            error_report("-incoming %s: %s", incoming,
-                         error_get_pretty(local_err));
-            error_free(local_err);
+            error_reportf_err(local_err, "-incoming %s: ", incoming);
             exit(1);
         }
     } else if (autostart) {
-- 
2.4.3

  parent reply	other threads:[~2016-01-13 15:44 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-13 15:42 [Qemu-devel] [PULL 00/41] Error reporting patches for 2016-01-13 Markus Armbruster
2016-01-13 15:42 ` [Qemu-devel] [PULL 01/41] error: Document how to accumulate multiple errors Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 02/41] Use error_fatal to simplify obvious fatal errors Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 03/41] hw: Inline the qdev_prop_set_drive_nofail() wrapper Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 04/41] hw: Don't use hw_error() for machine initialization errors Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 05/41] omap: Don't use hw_error() in device init() methods Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 06/41] arm_mptimer: Don't use hw_error() in realize() method Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 07/41] etraxfs_eth: Don't use hw_error() in init() method Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 08/41] raven: Mark use of hw_error() in realize() FIXME Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 09/41] error: Don't append a newline when printing the error hint Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 10/41] hw/arm/virt: Fix property "gic-version" error handling Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 11/41] sysbus: Don't use hw_error() in machine_init_done_notifiers Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 12/41] isa: Trivially convert remaining PCI-ISA bridges to realize() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 13/41] isa: Clean up error handling around isa_bus_new() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 14/41] isa: Clean up inappropriate hw_error() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 15/41] audio: Clean up inappropriate and unreachable use of hw_error() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 16/41] xen-hvm: Mark inappropriate error handling FIXME Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 17/41] qemu-nbd: Replace BSDism <err.h> by error_report() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 18/41] error: Use error_report_err() where appropriate (again) Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 19/41] error: Use error_report_err() instead of monitor_printf() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 20/41] error: Use error_report_err() instead of ad hoc prints Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 21/41] error: Improve documentation Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 22/41] block: Clean up "Could not create temporary overlay" error message Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 23/41] qemu-nbd: Clean up "Failed to load snapshot" " Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 24/41] test-throttle: Simplify qemu_init_main_loop() error handling Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 25/41] error: New error_prepend(), error_reportf_err() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 26/41] error: Don't decorate original error message when adding to it Markus Armbruster
2016-01-13 15:43 ` Markus Armbruster [this message]
2016-01-13 15:43 ` [Qemu-devel] [PULL 28/41] error: Use error_prepend() where it makes obvious sense Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 29/41] spapr: Use error_reportf_err() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 30/41] migration: Use error_reportf_err() instead of monitor_printf() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 31/41] qemu-io qemu-nbd: Use error_report() etc. instead of fprintf() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 32/41] error: Strip trailing '\n' from error string arguments (again) Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 33/41] vmdk: Clean up control flow in vmdk_parse_extents() a bit Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 34/41] vmdk: Clean up "Invalid extent lines" error message Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 35/41] pci-assign: Clean up "Failed to assign" error messages Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 36/41] vhdx: Fix "log that needs to be replayed" error message Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 37/41] error: Clean up errors with embedded newlines (again) Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 38/41] hw/s390x: Rename local variables Error *l_err to just err Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 39/41] s390/sclp: Simplify control flow in sclp_realize() Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 40/41] error: Consistently name Error * objects err, and not errp Markus Armbruster
2016-01-13 15:43 ` [Qemu-devel] [PULL 41/41] checkpatch: Detect newlines in error_report and other error functions Markus Armbruster
2016-01-14 14:09 ` [Qemu-devel] [PULL 00/41] Error reporting patches for 2016-01-13 Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452699819-26608-28-git-send-email-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).