From: zhanghailiang <zhang.zhanghailiang@huawei.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: lersek@redhat.com, lcapitulino@redhat.com, luonengjun@huawei.com,
qemu-devel@nongnu.org, peter.huangpeng@huawei.com
Subject: Re: [Qemu-devel] [PATCH v6 2/2] dump: Don't return error code when return an Error object
Date: Tue, 30 Sep 2014 16:39:47 +0800 [thread overview]
Message-ID: <542A6C53.8000009@huawei.com> (raw)
In-Reply-To: <8761g6voj4.fsf@blackfin.pond.sub.org>
On 2014/9/29 16:06, Markus Armbruster wrote:
> zhanghailiang <zhang.zhanghailiang@huawei.com> writes:
>
>> Functions shouldn't return an error code and an Error object at the same time.
>> Turn all these functions that returning Error object to void.
>> We also judge if a function success or fail by reference to the local_err.
>>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>>
>> ---
>> dump.c | 313 +++++++++++++++++++++++++++++++----------------------------------
>> 1 file changed, 148 insertions(+), 165 deletions(-)
>>
>> diff --git a/dump.c b/dump.c
>> index 07d2300..a6188b3 100644
>> --- a/dump.c
>> +++ b/dump.c
>> @@ -100,7 +100,7 @@ static int fd_write_vmcore(const void *buf, size_t size, void *opaque)
>> return 0;
>> }
>>
>> -static int write_elf64_header(DumpState *s, Error **errp)
>> +static void write_elf64_header(DumpState *s, Error **errp)
>> {
>> Elf64_Ehdr elf_header;
>> int ret;
>> @@ -128,13 +128,10 @@ static int write_elf64_header(DumpState *s, Error **errp)
>> ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write elf header", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf32_header(DumpState *s, Error **errp)
>> +static void write_elf32_header(DumpState *s, Error **errp)
>> {
>> Elf32_Ehdr elf_header;
>> int ret;
>> @@ -162,13 +159,10 @@ static int write_elf32_header(DumpState *s, Error **errp)
>> ret = fd_write_vmcore(&elf_header, sizeof(elf_header), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write elf header", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
>> +static void write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
>> int phdr_index, hwaddr offset,
>> hwaddr filesz, Error **errp)
>> {
>> @@ -188,15 +182,12 @@ static int write_elf64_load(DumpState *s, MemoryMapping *memory_mapping,
>> ret = fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write program header table", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
>> - int phdr_index, hwaddr offset,
>> - hwaddr filesz, Error **errp)
>> +static void write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
>> + int phdr_index, hwaddr offset,
>> + hwaddr filesz, Error **errp)
>> {
>> Elf32_Phdr phdr;
>> int ret;
>> @@ -214,13 +205,10 @@ static int write_elf32_load(DumpState *s, MemoryMapping *memory_mapping,
>> ret = fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write program header table", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf64_note(DumpState *s, Error **errp)
>> +static void write_elf64_note(DumpState *s, Error **errp)
>> {
>> Elf64_Phdr phdr;
>> hwaddr begin = s->memory_offset - s->note_size;
>> @@ -237,10 +225,7 @@ static int write_elf64_note(DumpState *s, Error **errp)
>> ret = fd_write_vmcore(&phdr, sizeof(Elf64_Phdr), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write program header table", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> static inline int cpu_index(CPUState *cpu)
>> @@ -248,8 +233,8 @@ static inline int cpu_index(CPUState *cpu)
>> return cpu->cpu_index + 1;
>> }
>>
>> -static int write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
>> - Error **errp)
>> +static void write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
>> + Error **errp)
>> {
>> CPUState *cpu;
>> int ret;
>> @@ -260,7 +245,7 @@ static int write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
>> ret = cpu_write_elf64_note(f, cpu, id, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write elf notes", errp);
>> - return -1;
>> + return;
>> }
>> }
>>
>> @@ -268,14 +253,12 @@ static int write_elf64_notes(WriteCoreDumpFunction f, DumpState *s,
>> ret = cpu_write_elf64_qemunote(f, cpu, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write CPU status", errp);
>> - return -1;
>> + return;
>> }
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf32_note(DumpState *s, Error **errp)
>> +static void write_elf32_note(DumpState *s, Error **errp)
>> {
>> hwaddr begin = s->memory_offset - s->note_size;
>> Elf32_Phdr phdr;
>> @@ -292,14 +275,11 @@ static int write_elf32_note(DumpState *s, Error **errp)
>> ret = fd_write_vmcore(&phdr, sizeof(Elf32_Phdr), s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write program header table", errp);
>> - return -1;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
>> - Error **errp)
>> +static void write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
>> + Error **errp)
>> {
>> CPUState *cpu;
>> int ret;
>> @@ -310,7 +290,7 @@ static int write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
>> ret = cpu_write_elf32_note(f, cpu, id, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write elf notes", errp);
>> - return -1;
>> + return;
>> }
>> }
>>
>> @@ -318,14 +298,12 @@ static int write_elf32_notes(WriteCoreDumpFunction f, DumpState *s,
>> ret = cpu_write_elf32_qemunote(f, cpu, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write CPU status", errp);
>> - return -1;
>> + return;
>> }
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_elf_section(DumpState *s, int type, Error **errp)
>> +static void write_elf_section(DumpState *s, int type, Error **errp)
>> {
>> Elf32_Shdr shdr32;
>> Elf64_Shdr shdr64;
>> @@ -348,49 +326,45 @@ static int write_elf_section(DumpState *s, int type, Error **errp)
>> ret = fd_write_vmcore(&shdr, shdr_size, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write section header table", errp);
>> - return -1;
>> + return;
>> }
>> -
>> - return 0;
>> }
>>
>> -static int write_data(DumpState *s, void *buf, int length, Error **errp)
>> +static void write_data(DumpState *s, void *buf, int length, Error **errp)
>> {
>> int ret;
>>
>> ret = fd_write_vmcore(buf, length, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to save memory", errp);
>> - return -1;
>> + return;
>> }
>> -
>> - return 0;
>> }
>>
>> /* write the memroy to vmcore. 1 page per I/O. */
>> -static int write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
>> - int64_t size, Error **errp)
>> +static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start,
>> + int64_t size, Error **errp)
>> {
>> int64_t i;
>> - int ret;
>> + Error *local_err = NULL;
>>
>> for (i = 0; i < size / TARGET_PAGE_SIZE; i++) {
>> - ret = write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
>> - TARGET_PAGE_SIZE, errp);
>> - if (ret < 0) {
>> - return ret;
>> + write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
>> + TARGET_PAGE_SIZE, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> }
>>
>> if ((size % TARGET_PAGE_SIZE) != 0) {
>> - ret = write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
>> - size % TARGET_PAGE_SIZE, errp);
>> - if (ret < 0) {
>> - return ret;
>> + write_data(s, block->host_addr + start + i * TARGET_PAGE_SIZE,
>> + size % TARGET_PAGE_SIZE, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> }
>> -
>> - return 0;
>> }
>>
>> /* get the memory's offset and size in the vmcore */
>> @@ -455,13 +429,13 @@ static void get_offset_range(hwaddr phys_addr,
>> }
>> }
>>
>> -static int write_elf_loads(DumpState *s, Error **errp)
>> +static void write_elf_loads(DumpState *s, Error **errp)
>> {
>> hwaddr offset, filesz;
>> MemoryMapping *memory_mapping;
>> uint32_t phdr_index = 1;
>> - int ret;
>> uint32_t max_index;
>> + Error *local_err = NULL;
>>
>> if (s->have_section) {
>> max_index = s->sh_info;
>> @@ -474,29 +448,28 @@ static int write_elf_loads(DumpState *s, Error **errp)
>> memory_mapping->length,
>> s, &offset, &filesz);
>> if (s->dump_info.d_class == ELFCLASS64) {
>> - ret = write_elf64_load(s, memory_mapping, phdr_index++, offset,
>> - filesz, errp);
>> + write_elf64_load(s, memory_mapping, phdr_index++, offset,
>> + filesz, &local_err);
>> } else {
>> - ret = write_elf32_load(s, memory_mapping, phdr_index++, offset,
>> - filesz, errp);
>> + write_elf32_load(s, memory_mapping, phdr_index++, offset,
>> + filesz, &local_err);
>> }
>>
>> - if (ret < 0) {
>> - return -1;
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> if (phdr_index >= max_index) {
>> break;
>> }
>> }
>> -
>> - return 0;
>> }
>>
>> /* write elf header, PT_NOTE and elf note to vmcore. */
>> -static int dump_begin(DumpState *s, Error **errp)
>> +static void dump_begin(DumpState *s, Error **errp)
>> {
>> - int ret;
>> + Error *local_err = NULL;
>>
>> /*
>> * the vmcore's format is:
>> @@ -524,62 +497,76 @@ static int dump_begin(DumpState *s, Error **errp)
>>
>> /* write elf header to vmcore */
>> if (s->dump_info.d_class == ELFCLASS64) {
>> - ret = write_elf64_header(s, errp);
>> + write_elf64_header(s, &local_err);
>> } else {
>> - ret = write_elf32_header(s, errp);
>> + write_elf32_header(s, &local_err);
>> }
>> - if (ret < 0) {
>> - return -1;
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> if (s->dump_info.d_class == ELFCLASS64) {
>> /* write PT_NOTE to vmcore */
>> - if (write_elf64_note(s, errp) < 0) {
>> - return -1;
>> + write_elf64_note(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> /* write all PT_LOAD to vmcore */
>> - if (write_elf_loads(s, errp) < 0) {
>> - return -1;
>> + write_elf_loads(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> /* write section to vmcore */
>> if (s->have_section) {
>> - if (write_elf_section(s, 1, errp) < 0) {
>> - return -1;
>> + write_elf_section(s, 1, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> }
>>
>> /* write notes to vmcore */
>> - if (write_elf64_notes(fd_write_vmcore, s, errp) < 0) {
>> - return -1;
>> + write_elf64_notes(fd_write_vmcore, s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> -
>> } else {
>> /* write PT_NOTE to vmcore */
>> - if (write_elf32_note(s, errp) < 0) {
>> - return -1;
>> + write_elf32_note(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> /* write all PT_LOAD to vmcore */
>> - if (write_elf_loads(s, errp) < 0) {
>> - return -1;
>> + write_elf_loads(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> /* write section to vmcore */
>> if (s->have_section) {
>> - if (write_elf_section(s, 0, errp) < 0) {
>> - return -1;
>> + write_elf_section(s, 0, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> }
>>
>> /* write notes to vmcore */
>> - if (write_elf32_notes(fd_write_vmcore, s, errp) < 0) {
>> - return -1;
>> + write_elf32_notes(fd_write_vmcore, s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>> }
>> -
>> - return 0;
>> }
>>
>> /* write PT_LOAD to vmcore */
> static int dump_completed(DumpState *s)
> {
> dump_cleanup(s);
> return 0;
> }
>
> I doubt this comment is accurate. Outside the scope of this patch.
>
Er, i will clean it and also change this function to void in this patch. Thanks.
>> @@ -617,11 +604,12 @@ static int get_next_block(DumpState *s, GuestPhysBlock *block)
>> }
>>
>> /* write all memory to vmcore */
>> -static int dump_iterate(DumpState *s, Error **errp)
>> +static void dump_iterate(DumpState *s, Error **errp)
>> {
>> GuestPhysBlock *block;
>> int64_t size;
>> int ret;
>> + Error *local_err = NULL;
>>
>> while (1) {
>> block = s->next_block;
>> @@ -633,34 +621,35 @@ static int dump_iterate(DumpState *s, Error **errp)
>> size -= block->target_end - (s->begin + s->length);
>> }
>> }
>> - ret = write_memory(s, block, s->start, size, errp);
>> - if (ret == -1) {
>> - return ret;
>> + write_memory(s, block, s->start, size, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> ret = get_next_block(s, block);
>> if (ret == 1) {
>> dump_completed(s);
>> - return 0;
>> }
>> }
>> }
>>
>> -static int create_vmcore(DumpState *s, Error **errp)
>> +static void create_vmcore(DumpState *s, Error **errp)
>> {
>> - int ret;
>> + Error *local_err = NULL;
>>
>> - ret = dump_begin(s, errp);
>> - if (ret < 0) {
>> - return -1;
>> + dump_begin(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> - ret = dump_iterate(s, errp);
>> - if (ret < 0) {
>> - return -1;
>> + dump_iterate(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>
> Please drop this blank line, like you do elsewhere.
>
OK!
>> - return 0;
>> }
>>
>
> You need local_err when you want to examine the error. You do after
> dump_begin(), because you want to return early on error. You don't
> after dump_iterate(). There, you could simply call
>
> dump_iterate(s, errp);
>
> and be done with it. Your choice.
>
You are right, it is unnecessary. Will remove this check. Thanks;)
>> static int write_start_flat_header(int fd)
>> @@ -741,9 +730,8 @@ static int buf_write_note(const void *buf, size_t size, void *opaque)
>> }
>>
>> /* write common header, sub header and elf note to vmcore */
>> -static int create_header32(DumpState *s, Error **errp)
>> +static void create_header32(DumpState *s, Error **errp)
>> {
>> - int ret = 0;
>> DiskDumpHeader32 *dh = NULL;
>> KdumpSubHeader32 *kh = NULL;
>> size_t size;
>> @@ -752,6 +740,7 @@ static int create_header32(DumpState *s, Error **errp)
>> uint32_t bitmap_blocks;
>> uint32_t status = 0;
>> uint64_t offset_note;
>> + Error *local_err = NULL;
>>
>> /* write common header, the version of kdump-compressed format is 6th */
>> size = sizeof(DiskDumpHeader32);
>> @@ -788,7 +777,6 @@ static int create_header32(DumpState *s, Error **errp)
>>
>> if (write_buffer(s->fd, 0, dh, size) < 0) {
>> dump_error(s, "dump: failed to write disk dump header", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -808,7 +796,6 @@ static int create_header32(DumpState *s, Error **errp)
>> if (write_buffer(s->fd, DISKDUMP_HEADER_BLOCKS *
>> block_size, kh, size) < 0) {
>> dump_error(s, "dump: failed to write kdump sub header", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -817,15 +804,14 @@ static int create_header32(DumpState *s, Error **errp)
>> s->note_buf_offset = 0;
>>
>> /* use s->note_buf to store notes temporarily */
>> - if (write_elf32_notes(buf_write_note, s, errp) < 0) {
>> - ret = -1;
>> + write_elf32_notes(buf_write_note, s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> goto out;
>> }
>> -
>> if (write_buffer(s->fd, offset_note, s->note_buf,
>> s->note_size) < 0) {
>> dump_error(s, "dump: failed to write notes", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -841,14 +827,11 @@ out:
>> g_free(dh);
>> g_free(kh);
>> g_free(s->note_buf);
>> -
>> - return ret;
>> }
>>
>> /* write common header, sub header and elf note to vmcore */
>> -static int create_header64(DumpState *s, Error **errp)
>> +static void create_header64(DumpState *s, Error **errp)
>> {
>> - int ret = 0;
>> DiskDumpHeader64 *dh = NULL;
>> KdumpSubHeader64 *kh = NULL;
>> size_t size;
>> @@ -857,6 +840,7 @@ static int create_header64(DumpState *s, Error **errp)
>> uint32_t bitmap_blocks;
>> uint32_t status = 0;
>> uint64_t offset_note;
>> + Error *local_err = NULL;
>>
>> /* write common header, the version of kdump-compressed format is 6th */
>> size = sizeof(DiskDumpHeader64);
>> @@ -893,7 +877,6 @@ static int create_header64(DumpState *s, Error **errp)
>>
>> if (write_buffer(s->fd, 0, dh, size) < 0) {
>> dump_error(s, "dump: failed to write disk dump header", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -913,7 +896,6 @@ static int create_header64(DumpState *s, Error **errp)
>> if (write_buffer(s->fd, DISKDUMP_HEADER_BLOCKS *
>> block_size, kh, size) < 0) {
>> dump_error(s, "dump: failed to write kdump sub header", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -922,15 +904,15 @@ static int create_header64(DumpState *s, Error **errp)
>> s->note_buf_offset = 0;
>>
>> /* use s->note_buf to store notes temporarily */
>> - if (write_elf64_notes(buf_write_note, s, errp) < 0) {
>> - ret = -1;
>> + write_elf64_notes(buf_write_note, s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> goto out;
>> }
>>
>> if (write_buffer(s->fd, offset_note, s->note_buf,
>> s->note_size) < 0) {
>> dump_error(s, "dump: failed to write notes", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -946,16 +928,19 @@ out:
>> g_free(dh);
>> g_free(kh);
>> g_free(s->note_buf);
>> -
>> - return ret;
>> }
>>
>> -static int write_dump_header(DumpState *s, Error **errp)
>> +static void write_dump_header(DumpState *s, Error **errp)
>> {
>> + Error *local_err = NULL;
>> +
>> if (s->dump_info.d_class == ELFCLASS32) {
>> - return create_header32(s, errp);
>> + create_header32(s, &local_err);
>> } else {
>> - return create_header64(s, errp);
>> + create_header64(s, &local_err);
>> + }
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> }
>> }
>>
>> @@ -1069,7 +1054,7 @@ static bool get_next_page(GuestPhysBlock **blockptr, uint64_t *pfnptr,
>> return true;
>> }
>>
>> -static int write_dump_bitmap(DumpState *s, Error **errp)
>> +static void write_dump_bitmap(DumpState *s, Error **errp)
>> {
>> int ret = 0;
>> uint64_t last_pfn, pfn;
>> @@ -1091,7 +1076,6 @@ static int write_dump_bitmap(DumpState *s, Error **errp)
>> ret = set_dump_bitmap(last_pfn, pfn, true, dump_bitmap_buf, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to set dump_bitmap", errp);
>> - ret = -1;
>> goto out;
>> }
>>
>> @@ -1109,7 +1093,6 @@ static int write_dump_bitmap(DumpState *s, Error **errp)
>> dump_bitmap_buf, s);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to sync dump_bitmap", errp);
>> - ret = -1;
>> goto out;
>> }
>> }
>> @@ -1119,8 +1102,6 @@ static int write_dump_bitmap(DumpState *s, Error **errp)
>>
>> out:
>> g_free(dump_bitmap_buf);
>> -
>> - return ret;
>> }
>>
>> static void prepare_data_cache(DataCache *data_cache, DumpState *s,
>> @@ -1200,7 +1181,7 @@ static inline bool is_zero_page(const uint8_t *buf, size_t page_size)
>> return buffer_is_zero(buf, page_size);
>> }
>>
>> -static int write_dump_pages(DumpState *s, Error **errp)
>> +static void write_dump_pages(DumpState *s, Error **errp)
>> {
>> int ret = 0;
>> DataCache page_desc, page_data;
>> @@ -1365,13 +1346,12 @@ out:
>> #endif
>>
>> g_free(buf_out);
>> -
>> - return ret;
>> }
>>
>> -static int create_kdump_vmcore(DumpState *s, Error **errp)
>> +static void create_kdump_vmcore(DumpState *s, Error **errp)
>> {
>> int ret;
>> + Error *local_err = NULL;
>>
>> /*
>> * the kdump-compressed format is:
>> @@ -1398,33 +1378,34 @@ static int create_kdump_vmcore(DumpState *s, Error **errp)
>> ret = write_start_flat_header(s->fd);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write start flat header", errp);
>> - return -1;
>> + return;
>> }
>>
>> - ret = write_dump_header(s, errp);
>> - if (ret < 0) {
>> - return -1;
>> + write_dump_header(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> - ret = write_dump_bitmap(s, errp);
>> - if (ret < 0) {
>> - return -1;
>> + write_dump_bitmap(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> - ret = write_dump_pages(s, errp);
>> - if (ret < 0) {
>> - return -1;
>> + write_dump_pages(s, &local_err);
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> + return;
>> }
>>
>> ret = write_end_flat_header(s->fd);
>> if (ret < 0) {
>> dump_error(s, "dump: failed to write end flat header", errp);
>> - return -1;
>> + return;
>> }
>>
>> dump_completed(s);
>> -
>> - return 0;
>> }
>>
>> static ram_addr_t get_start_block(DumpState *s)
>> @@ -1463,9 +1444,9 @@ static void get_max_mapnr(DumpState *s)
>> s->max_mapnr = paddr_to_pfn(last_block->target_end);
>> }
>>
>> -static int dump_init(DumpState *s, int fd, bool has_format,
>> - DumpGuestMemoryFormat format, bool paging, bool has_filter,
>> - int64_t begin, int64_t length, Error **errp)
>> +static void dump_init(DumpState *s, int fd, bool has_format,
>> + DumpGuestMemoryFormat format, bool paging, bool has_filter,
>> + int64_t begin, int64_t length, Error **errp)
>> {
>> CPUState *cpu;
>> int nr_cpus;
>> @@ -1570,7 +1551,7 @@ static int dump_init(DumpState *s, int fd, bool has_format,
>> s->flag_compress = 0;
>> }
>>
>> - return 0;
>> + return;
>> }
>>
>> if (s->has_filter) {
>> @@ -1619,11 +1600,10 @@ static int dump_init(DumpState *s, int fd, bool has_format,
>> }
>> }
>>
>> - return 0;
>> + return;
>>
>> cleanup:
>> dump_cleanup(s);
>> - return -1;
>> }
>>
>> void qmp_dump_guest_memory(bool paging, const char *file, bool has_begin,
>> @@ -1634,7 +1614,7 @@ void qmp_dump_guest_memory(bool paging, const char *file, bool has_begin,
>> const char *p;
>> int fd = -1;
>> DumpState *s;
>> - int ret;
>> + Error *local_err = NULL;
>>
>> /*
>> * kdump-compressed format need the whole memory dumped, so paging or
>> @@ -1694,19 +1674,22 @@ void qmp_dump_guest_memory(bool paging, const char *file, bool has_begin,
>>
>> s = g_malloc0(sizeof(DumpState));
>>
>> - ret = dump_init(s, fd, has_format, format, paging, has_begin,
>> - begin, length, errp);
>> - if (ret < 0) {
>> + dump_init(s, fd, has_format, format, paging, has_begin,
>> + begin, length, &local_err);
>> + if (local_err) {
>> g_free(s);
>> + error_propagate(errp, local_err);
>> return;
>> }
>>
>> if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
>> - create_kdump_vmcore(s, errp);
>> + create_kdump_vmcore(s, &local_err);
>> } else {
>> - create_vmcore(s, errp);
>> + create_vmcore(s, &local_err);
>> + }
>> + if (local_err) {
>> + error_propagate(errp, local_err);
>> }
>> -
>> g_free(s);
>> }
>
> Another case where local_err isn't needed. You could simplify to just
>
> if (has_format && format != DUMP_GUEST_MEMORY_FORMAT_ELF) {
> create_kdump_vmcore(s, errp);
> } else {
> create_vmcore(s, errp);
> }
> g_free(s);
>
>
OK, Will fix it. Thanks.
> This patch illustrates why I dislike void functions with an Error **
> parameter: lots of busy-work with error_propagate(). But others feel
> it's what we should do. *shrug*
>
;)
> Patch looks correct to me on a glance. I'm leaving real review to the
> folks who think it's what we should do.
>
> .
>
next prev parent reply other threads:[~2014-09-30 8:40 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-19 6:43 [Qemu-devel] [PATCH v6 0/2] dump: let dump_error return error reason to caller zhanghailiang
2014-09-19 6:43 ` [Qemu-devel] [PATCH v6 1/2] dump: let dump_error return error info " zhanghailiang
2014-09-29 7:48 ` Markus Armbruster
2014-09-29 8:06 ` zhanghailiang
2014-09-19 6:43 ` [Qemu-devel] [PATCH v6 2/2] dump: Don't return error code when return an Error object zhanghailiang
2014-09-29 8:06 ` Markus Armbruster
2014-09-30 8:39 ` zhanghailiang [this message]
2014-09-24 0:39 ` [Qemu-devel] [PATCH v6 0/2] dump: let dump_error return error reason to caller zhanghailiang
2014-09-28 1:18 ` zhanghailiang
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=542A6C53.8000009@huawei.com \
--to=zhang.zhanghailiang@huawei.com \
--cc=armbru@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=lersek@redhat.com \
--cc=luonengjun@huawei.com \
--cc=peter.huangpeng@huawei.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).