| From 4ca61efe246d62d420eb332655c0c8ead4cc762b Mon Sep 17 00:00:00 2001 |
| From: Janosch Frank <frankja@linux.ibm.com> |
| Date: Wed, 30 Mar 2022 12:35:55 +0000 |
| Subject: [PATCH 13/42] dump: Use ERRP_GUARD() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| RH-Author: Cédric Le Goater <clg@redhat.com> |
| RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump |
| RH-Bugzilla: 1664378 2043909 |
| RH-Acked-by: Thomas Huth <thuth@redhat.com> |
| RH-Acked-by: Cornelia Huck <cohuck@redhat.com> |
| RH-Acked-by: Jon Maloy <jmaloy@redhat.com> |
| RH-Commit: [13/41] f735cd1dab0230000cfadd878765fdf4647b239c |
| |
| Let's move to the new way of handling errors before changing the dump |
| code. This patch has mostly been generated by the coccinelle script |
| scripts/coccinelle/errp-guard.cocci. |
| |
| Signed-off-by: Janosch Frank <frankja@linux.ibm.com> |
| Reviewed-by: Richard Henderson <richard.henderson@linaro.org> |
| Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> |
| Message-Id: <20220330123603.107120-2-frankja@linux.ibm.com> |
| (cherry picked from commit 86a518bba4f4d7c9016fc5b104fe1e58b00ad756) |
| Signed-off-by: Cédric Le Goater <clg@redhat.com> |
| |
| dump/dump.c | 144 ++++++++++++++++++++++------------------------------ |
| 1 file changed, 61 insertions(+), 83 deletions(-) |
| |
| diff --git a/dump/dump.c b/dump/dump.c |
| index 662d0a62cd..9876123f2e 100644 |
| |
| |
| @@ -390,23 +390,21 @@ static void write_data(DumpState *s, void *buf, int length, Error **errp) |
| static void write_memory(DumpState *s, GuestPhysBlock *block, ram_addr_t start, |
| int64_t size, Error **errp) |
| { |
| + ERRP_GUARD(); |
| int64_t i; |
| - Error *local_err = NULL; |
| |
| for (i = 0; i < size / s->dump_info.page_size; i++) { |
| write_data(s, block->host_addr + start + i * s->dump_info.page_size, |
| - s->dump_info.page_size, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + s->dump_info.page_size, errp); |
| + if (*errp) { |
| return; |
| } |
| } |
| |
| if ((size % s->dump_info.page_size) != 0) { |
| write_data(s, block->host_addr + start + i * s->dump_info.page_size, |
| - size % s->dump_info.page_size, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + size % s->dump_info.page_size, errp); |
| + if (*errp) { |
| return; |
| } |
| } |
| @@ -476,11 +474,11 @@ static void get_offset_range(hwaddr phys_addr, |
| |
| static void write_elf_loads(DumpState *s, Error **errp) |
| { |
| + ERRP_GUARD(); |
| hwaddr offset, filesz; |
| MemoryMapping *memory_mapping; |
| uint32_t phdr_index = 1; |
| uint32_t max_index; |
| - Error *local_err = NULL; |
| |
| if (s->have_section) { |
| max_index = s->sh_info; |
| @@ -494,14 +492,13 @@ static void write_elf_loads(DumpState *s, Error **errp) |
| s, &offset, &filesz); |
| if (s->dump_info.d_class == ELFCLASS64) { |
| write_elf64_load(s, memory_mapping, phdr_index++, offset, |
| - filesz, &local_err); |
| + filesz, errp); |
| } else { |
| write_elf32_load(s, memory_mapping, phdr_index++, offset, |
| - filesz, &local_err); |
| + filesz, errp); |
| } |
| |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + if (*errp) { |
| return; |
| } |
| |
| @@ -514,7 +511,7 @@ static void write_elf_loads(DumpState *s, Error **errp) |
| /* write elf header, PT_NOTE and elf note to vmcore. */ |
| static void dump_begin(DumpState *s, Error **errp) |
| { |
| - Error *local_err = NULL; |
| + ERRP_GUARD(); |
| |
| /* |
| * the vmcore's format is: |
| @@ -542,73 +539,64 @@ static void dump_begin(DumpState *s, Error **errp) |
| |
| /* write elf header to vmcore */ |
| if (s->dump_info.d_class == ELFCLASS64) { |
| - write_elf64_header(s, &local_err); |
| + write_elf64_header(s, errp); |
| } else { |
| - write_elf32_header(s, &local_err); |
| + write_elf32_header(s, errp); |
| } |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + if (*errp) { |
| return; |
| } |
| |
| if (s->dump_info.d_class == ELFCLASS64) { |
| /* write PT_NOTE to vmcore */ |
| - write_elf64_note(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf64_note(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| /* write all PT_LOAD to vmcore */ |
| - write_elf_loads(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf_loads(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| /* write section to vmcore */ |
| if (s->have_section) { |
| - write_elf_section(s, 1, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf_section(s, 1, errp); |
| + if (*errp) { |
| return; |
| } |
| } |
| |
| /* write notes to vmcore */ |
| - write_elf64_notes(fd_write_vmcore, s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf64_notes(fd_write_vmcore, s, errp); |
| + if (*errp) { |
| return; |
| } |
| } else { |
| /* write PT_NOTE to vmcore */ |
| - write_elf32_note(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf32_note(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| /* write all PT_LOAD to vmcore */ |
| - write_elf_loads(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf_loads(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| /* write section to vmcore */ |
| if (s->have_section) { |
| - write_elf_section(s, 0, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf_section(s, 0, errp); |
| + if (*errp) { |
| return; |
| } |
| } |
| |
| /* write notes to vmcore */ |
| - write_elf32_notes(fd_write_vmcore, s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf32_notes(fd_write_vmcore, s, errp); |
| + if (*errp) { |
| return; |
| } |
| } |
| @@ -644,9 +632,9 @@ static int get_next_block(DumpState *s, GuestPhysBlock *block) |
| /* write all memory to vmcore */ |
| static void dump_iterate(DumpState *s, Error **errp) |
| { |
| + ERRP_GUARD(); |
| GuestPhysBlock *block; |
| int64_t size; |
| - Error *local_err = NULL; |
| |
| do { |
| block = s->next_block; |
| @@ -658,9 +646,8 @@ static void dump_iterate(DumpState *s, Error **errp) |
| size -= block->target_end - (s->begin + s->length); |
| } |
| } |
| - write_memory(s, block, s->start, size, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_memory(s, block, s->start, size, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| @@ -669,11 +656,10 @@ static void dump_iterate(DumpState *s, Error **errp) |
| |
| static void create_vmcore(DumpState *s, Error **errp) |
| { |
| - Error *local_err = NULL; |
| + ERRP_GUARD(); |
| |
| - dump_begin(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + dump_begin(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| @@ -810,6 +796,7 @@ static bool note_name_equal(DumpState *s, |
| /* write common header, sub header and elf note to vmcore */ |
| static void create_header32(DumpState *s, Error **errp) |
| { |
| + ERRP_GUARD(); |
| DiskDumpHeader32 *dh = NULL; |
| KdumpSubHeader32 *kh = NULL; |
| size_t size; |
| @@ -818,7 +805,6 @@ static void 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); |
| @@ -894,9 +880,8 @@ static void create_header32(DumpState *s, Error **errp) |
| s->note_buf_offset = 0; |
| |
| /* use s->note_buf to store notes temporarily */ |
| - write_elf32_notes(buf_write_note, s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf32_notes(buf_write_note, s, errp); |
| + if (*errp) { |
| goto out; |
| } |
| if (write_buffer(s->fd, offset_note, s->note_buf, |
| @@ -922,6 +907,7 @@ out: |
| /* write common header, sub header and elf note to vmcore */ |
| static void create_header64(DumpState *s, Error **errp) |
| { |
| + ERRP_GUARD(); |
| DiskDumpHeader64 *dh = NULL; |
| KdumpSubHeader64 *kh = NULL; |
| size_t size; |
| @@ -930,7 +916,6 @@ static void 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); |
| @@ -1006,9 +991,8 @@ static void create_header64(DumpState *s, Error **errp) |
| s->note_buf_offset = 0; |
| |
| /* use s->note_buf to store notes temporarily */ |
| - write_elf64_notes(buf_write_note, s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_elf64_notes(buf_write_note, s, errp); |
| + if (*errp) { |
| goto out; |
| } |
| |
| @@ -1472,8 +1456,8 @@ out: |
| |
| static void create_kdump_vmcore(DumpState *s, Error **errp) |
| { |
| + ERRP_GUARD(); |
| int ret; |
| - Error *local_err = NULL; |
| |
| /* |
| * the kdump-compressed format is: |
| @@ -1503,21 +1487,18 @@ static void create_kdump_vmcore(DumpState *s, Error **errp) |
| return; |
| } |
| |
| - write_dump_header(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_dump_header(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| - write_dump_bitmap(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_dump_bitmap(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| - write_dump_pages(s, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + write_dump_pages(s, errp); |
| + if (*errp) { |
| return; |
| } |
| |
| @@ -1647,10 +1628,10 @@ 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) |
| { |
| + ERRP_GUARD(); |
| VMCoreInfoState *vmci = vmcoreinfo_find(); |
| CPUState *cpu; |
| int nr_cpus; |
| - Error *err = NULL; |
| int ret; |
| |
| s->has_format = has_format; |
| @@ -1769,9 +1750,8 @@ static void dump_init(DumpState *s, int fd, bool has_format, |
| |
| /* get memory mapping */ |
| if (paging) { |
| - qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, &err); |
| - if (err != NULL) { |
| - error_propagate(errp, err); |
| + qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, errp); |
| + if (*errp) { |
| goto cleanup; |
| } |
| } else { |
| @@ -1870,33 +1850,32 @@ cleanup: |
| /* this operation might be time consuming. */ |
| static void dump_process(DumpState *s, Error **errp) |
| { |
| - Error *local_err = NULL; |
| + ERRP_GUARD(); |
| DumpQueryResult *result = NULL; |
| |
| if (s->has_format && s->format == DUMP_GUEST_MEMORY_FORMAT_WIN_DMP) { |
| #ifdef TARGET_X86_64 |
| - create_win_dump(s, &local_err); |
| + create_win_dump(s, errp); |
| #endif |
| } else if (s->has_format && s->format != DUMP_GUEST_MEMORY_FORMAT_ELF) { |
| - create_kdump_vmcore(s, &local_err); |
| + create_kdump_vmcore(s, errp); |
| } else { |
| - create_vmcore(s, &local_err); |
| + create_vmcore(s, errp); |
| } |
| |
| /* make sure status is written after written_size updates */ |
| smp_wmb(); |
| qatomic_set(&s->status, |
| - (local_err ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED)); |
| + (*errp ? DUMP_STATUS_FAILED : DUMP_STATUS_COMPLETED)); |
| |
| /* send DUMP_COMPLETED message (unconditionally) */ |
| result = qmp_query_dump(NULL); |
| /* should never fail */ |
| assert(result); |
| - qapi_event_send_dump_completed(result, !!local_err, (local_err ? |
| - error_get_pretty(local_err) : NULL)); |
| + qapi_event_send_dump_completed(result, !!*errp, (*errp ? |
| + error_get_pretty(*errp) : NULL)); |
| qapi_free_DumpQueryResult(result); |
| |
| - error_propagate(errp, local_err); |
| dump_cleanup(s); |
| } |
| |
| @@ -1925,10 +1904,10 @@ void qmp_dump_guest_memory(bool paging, const char *file, |
| int64_t length, bool has_format, |
| DumpGuestMemoryFormat format, Error **errp) |
| { |
| + ERRP_GUARD(); |
| const char *p; |
| int fd = -1; |
| DumpState *s; |
| - Error *local_err = NULL; |
| bool detach_p = false; |
| |
| if (runstate_check(RUN_STATE_INMIGRATE)) { |
| @@ -2028,9 +2007,8 @@ void qmp_dump_guest_memory(bool paging, const char *file, |
| dump_state_prepare(s); |
| |
| dump_init(s, fd, has_format, format, paging, has_begin, |
| - begin, length, &local_err); |
| - if (local_err) { |
| - error_propagate(errp, local_err); |
| + begin, length, errp); |
| + if (*errp) { |
| qatomic_set(&s->status, DUMP_STATUS_FAILED); |
| return; |
| } |
| -- |
| 2.37.3 |
| |