All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
To: Murilo Opsfelder Araujo <muriloo@linux.vnet.ibm.com>,
	qemu-devel@nongnu.org
Cc: marcandre.lureau@redhat.com,
	Yasmin Beatriz <yasmins@linux.vnet.ibm.com>,
	Jose Ricardo Ziviani <joserz@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v3 1/1] dump.c: allow fd_write_vmcore to return errno on failure
Date: Mon, 12 Feb 2018 13:49:30 -0200	[thread overview]
Message-ID: <9bdd6f79-05e2-48ab-385a-70b6a3ac207c@linux.vnet.ibm.com> (raw)
In-Reply-To: <98934c2f-2210-83d7-d629-157e5a7cee8e@linux.vnet.ibm.com>



On 02/12/2018 12:46 PM, Murilo Opsfelder Araujo wrote:
> On 02/12/2018 12:25 PM, Daniel Henrique Barboza wrote:
>> From: Yasmin Beatriz <yasmins@linux.vnet.ibm.com>
>>
>> fd_write_vmcore can fail to execute for a lot of reasons that can be
>> retrieved by errno, but it only returns -1. This makes difficult for
>> the caller to know what happened and only a generic error message is
>> propagated back to the user. This is an example using dump-guest-memory:
>>
>> (qemu) dump-guest-memory /home/yasmin/mnt/test.dump
>> dump: failed to save memory
>>
>> All callers of fd_write_vmcore of dump.c does error handling via
>> error_setg(), so at first it seems feasible to add the Error pointer as
>> an argument of fd_write_vmcore. This proved to be more complex than it
>> first looked. fd_write_vmcore is used by write_elf64_notes and
>> write_elf32_notes as a WriteCoreDumpFunction prototype. WriteCoreDumpFunction
>> is declared in include/qom/cpu.h and is used all around the code. This
>> leaves us with few alternatives:
>>
>> - change the WriteCoreDumpFunction prototype to include an error pointer.
>> This would require to change all functions that implements this prototype
>> to also receive an Error pointer;
>>
>> - change both write_elf64_notes and write_elf32_notes to no use the
>> WriteCoreDumpFunction. These functions use not only fd_write_vmcore
>> but also buf_write_note, so this would require to change buf_write_note
>> to handle an Error pointer. Considerable easier than the alternative
>> above, but it's still a lot of code just for the benefit of the callers
>> of fd_write_vmcore.
>>
>> This patch presents an easier solution that benefits all fd_write_vmcore
>> callers:
>>
>> - instead of returning -1 on error, return -errno. All existing callers
>> already checks for ret < 0 so there is no need to change the caller's
>> logic too much. This also allows the retrieval of the errno.
>>
>> - all callers were updated to use error_setg_errno instead of just
>> errno_setg. Now that fd_write_vmcore can return an errno, let's update
>> all callers so they can benefit from a more detailed error message.
>>
>> This is the same dump-guest-memory example with this patch applied:
>>
>> (qemu) dump-guest-memory /home/yasmin/mnt/test.dump
>> dump: failed to save memory: No space left on device
>> (qemu)
>>
>> This example illustrates an error of fd_write_vmcore when called
>> from write_data. All other callers will benefit from better
>> error messages as well.
>>
>> Reported-by: yilzhang@redhat.com
>> Cc: Jose Ricardo Ziviani <joserz@linux.vnet.ibm.com>
>> Signed-off-by: Yasmin Beatriz <yasmins@linux.vnet.ibm.com>
>> Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
>> ---
>>   dump.c | 23 ++++++++++++++---------
>>   1 file changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/dump.c b/dump.c
>> index 7b13baa413..171ff8a3b8 100644
>> --- a/dump.c
>> +++ b/dump.c
>> @@ -107,7 +107,7 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
>>
>>       written_size = qemu_write_full(s->fd, buf, size);
>>       if (written_size != size) {
>> -        return -1;
>> +        return -errno;
>>       }
>>
>>       return 0;
>> @@ -140,7 +140,7 @@ static void write_elf64_header(DumpState *s, Error **errp)
>>
>>       ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
>>       if (ret < 0) {
>> -        error_setg(errp, "dump: failed to write elf header");
>> +        error_setg_errno(errp, -ret, "dump: failed to write elf header");
> Do we need -ret passed to error_setg_errno()? fd_write_vmcore() returns
> negative errno in case of error.

I am passing -ret here to provide a positive errno value to 
error_setg_errno. I
am not sure if os_error can be negative and didn't want to risk 
strerror() breaking.



Daniel


>
> Cheers
> Murilo

  reply	other threads:[~2018-02-12 15:49 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-12 14:25 [Qemu-devel] [PATCH v3 0/1] dump.c: allow fd_write_vmcore to return errno on failure Daniel Henrique Barboza
2018-02-12 14:25 ` [Qemu-devel] [PATCH v3 1/1] " Daniel Henrique Barboza
2018-02-12 14:31   ` Marc-Andre Lureau
2018-02-12 14:46   ` Murilo Opsfelder Araujo
2018-02-12 15:49     ` Daniel Henrique Barboza [this message]
2018-02-12 17:31     ` Eric Blake
2018-02-12 19:19       ` Murilo Opsfelder Araujo
2018-02-12 17:47   ` Eric Blake
2018-03-21 13:29 ` [Qemu-devel] [PATCH v3 0/1] " Daniel Henrique Barboza
2018-03-21 13:56   ` [Qemu-devel] [PATCH v3 for-2.12? " Eric Blake
2018-03-21 14:20     ` Marc-André Lureau

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=9bdd6f79-05e2-48ab-385a-70b6a3ac207c@linux.vnet.ibm.com \
    --to=danielhb@linux.vnet.ibm.com \
    --cc=joserz@linux.vnet.ibm.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=muriloo@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yasmins@linux.vnet.ibm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.