Skip to content

Commit

Permalink
dump: Use ERRP_GUARD()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
frankjaa authored and elmarco committed Apr 22, 2022
1 parent a747829 commit 86a518b
Showing 1 changed file with 61 additions and 83 deletions.
144 changes: 61 additions & 83 deletions dump/dump.c
Expand Up @@ -389,23 +389,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;
}
}
Expand Down Expand Up @@ -475,11 +473,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;
Expand All @@ -493,14 +491,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;
}

Expand All @@ -513,7 +510,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:
Expand Down Expand Up @@ -541,73 +538,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;
}
}
Expand Down Expand Up @@ -643,9 +631,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;
Expand All @@ -657,9 +645,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;
}

Expand All @@ -668,11 +655,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;
}

Expand Down Expand Up @@ -809,6 +795,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;
Expand All @@ -817,7 +804,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);
Expand Down Expand Up @@ -893,9 +879,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,
Expand All @@ -921,6 +906,7 @@ static void create_header32(DumpState *s, Error **errp)
/* 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;
Expand All @@ -929,7 +915,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);
Expand Down Expand Up @@ -1005,9 +990,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;
}

Expand Down Expand Up @@ -1463,8 +1447,8 @@ static void write_dump_pages(DumpState *s, Error **errp)

static void create_kdump_vmcore(DumpState *s, Error **errp)
{
ERRP_GUARD();
int ret;
Error *local_err = NULL;

/*
* the kdump-compressed format is:
Expand Down Expand Up @@ -1494,21 +1478,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;
}

Expand Down Expand Up @@ -1638,10 +1619,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;
Expand Down Expand Up @@ -1760,9 +1741,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 {
Expand Down Expand Up @@ -1861,33 +1841,32 @@ static void dump_init(DumpState *s, int fd, bool has_format,
/* 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);
}

Expand Down Expand Up @@ -1916,10 +1895,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)) {
Expand Down Expand Up @@ -2019,9 +1998,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;
}
Expand Down

0 comments on commit 86a518b

Please sign in to comment.