kdump header provides offset and size of the vmcoreinfo note, append it
if available.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
dump.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 44 insertions(+), 4 deletions(-)
diff --git a/dump.c b/dump.c
index 6911ffad8b..ba7676a514 100644
--- a/dump.c
+++ b/dump.c
@@ -791,8 +791,9 @@ static void create_header32(DumpState *s, Error **errp)
uint32_t sub_hdr_size;
uint32_t bitmap_blocks;
uint32_t status = 0;
- uint64_t offset_note;
+ uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
Error *local_err = NULL;
+ uint8_t *vmcoreinfo = NULL;
/* write common header, the version of kdump-compressed format is 6th */
size = sizeof(DiskDumpHeader32);
@@ -841,7 +842,18 @@ static void create_header32(DumpState *s, Error **errp)
kh->phys_base = cpu_to_dump32(s, s->dump_info.phys_base);
kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
- offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
+ offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
+ if (s->vmcoreinfo) {
+ uint64_t hsize, name_size;
+
+ get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcoreinfo);
+ vmcoreinfo =
+ s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
+ kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
+ kh->size_vmcoreinfo = cpu_to_dump32(s, size_vmcoreinfo);
+ }
+
+ offset_note = offset_vmcoreinfo + size_vmcoreinfo;
kh->offset_note = cpu_to_dump64(s, offset_note);
kh->note_size = cpu_to_dump32(s, s->note_size);
@@ -851,6 +863,14 @@ static void create_header32(DumpState *s, Error **errp)
goto out;
}
+ if (vmcoreinfo) {
+ if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
+ size_vmcoreinfo) < 0) {
+ error_setg(errp, "dump: failed to vmcoreinfo");
+ goto out;
+ }
+ }
+
/* write note */
s->note_buf = g_malloc0(s->note_size);
s->note_buf_offset = 0;
@@ -891,8 +911,9 @@ static void create_header64(DumpState *s, Error **errp)
uint32_t sub_hdr_size;
uint32_t bitmap_blocks;
uint32_t status = 0;
- uint64_t offset_note;
+ uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
Error *local_err = NULL;
+ uint8_t *vmcoreinfo = NULL;
/* write common header, the version of kdump-compressed format is 6th */
size = sizeof(DiskDumpHeader64);
@@ -941,7 +962,18 @@ static void create_header64(DumpState *s, Error **errp)
kh->phys_base = cpu_to_dump64(s, s->dump_info.phys_base);
kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
- offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
+ offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
+ if (s->vmcoreinfo) {
+ uint64_t hsize, name_size;
+
+ get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcoreinfo);
+ vmcoreinfo =
+ s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
+ kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
+ kh->size_vmcoreinfo = cpu_to_dump64(s, size_vmcoreinfo);
+ }
+
+ offset_note = offset_vmcoreinfo + size_vmcoreinfo;
kh->offset_note = cpu_to_dump64(s, offset_note);
kh->note_size = cpu_to_dump64(s, s->note_size);
@@ -951,6 +983,14 @@ static void create_header64(DumpState *s, Error **errp)
goto out;
}
+ if (vmcoreinfo) {
+ if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
+ size_vmcoreinfo) < 0) {
+ error_setg(errp, "dump: failed to vmcoreinfo");
+ goto out;
+ }
+ }
+
/* write note */
s->note_buf = g_malloc0(s->note_size);
s->note_buf_offset = 0;
--
2.13.0.91.g00982b8dd
On Thu, Jun 01, 2017 at 05:03:24PM +0400, Marc-André Lureau wrote:
> kdump header provides offset and size of the vmcoreinfo note, append it
> if available.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> dump.c | 48 ++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 44 insertions(+), 4 deletions(-)
>
> diff --git a/dump.c b/dump.c
> index 6911ffad8b..ba7676a514 100644
> --- a/dump.c
> +++ b/dump.c
> @@ -791,8 +791,9 @@ static void create_header32(DumpState *s, Error **errp)
> uint32_t sub_hdr_size;
> uint32_t bitmap_blocks;
> uint32_t status = 0;
> - uint64_t offset_note;
> + uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
> Error *local_err = NULL;
> + uint8_t *vmcoreinfo = NULL;
>
> /* write common header, the version of kdump-compressed format is 6th */
> size = sizeof(DiskDumpHeader32);
> @@ -841,7 +842,18 @@ static void create_header32(DumpState *s, Error **errp)
> kh->phys_base = cpu_to_dump32(s, s->dump_info.phys_base);
> kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
>
> - offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
> + offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
> + if (s->vmcoreinfo) {
> + uint64_t hsize, name_size;
> +
> + get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcoreinfo);
> + vmcoreinfo =
> + s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
> + kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
> + kh->size_vmcoreinfo = cpu_to_dump32(s, size_vmcoreinfo);
> + }
> +
> + offset_note = offset_vmcoreinfo + size_vmcoreinfo;
> kh->offset_note = cpu_to_dump64(s, offset_note);
> kh->note_size = cpu_to_dump32(s, s->note_size);
>
> @@ -851,6 +863,14 @@ static void create_header32(DumpState *s, Error **errp)
> goto out;
> }
>
> + if (vmcoreinfo) {
> + if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
> + size_vmcoreinfo) < 0) {
> + error_setg(errp, "dump: failed to vmcoreinfo");
> + goto out;
> + }
> + }
> +
> /* write note */
> s->note_buf = g_malloc0(s->note_size);
> s->note_buf_offset = 0;
> @@ -891,8 +911,9 @@ static void create_header64(DumpState *s, Error **errp)
> uint32_t sub_hdr_size;
> uint32_t bitmap_blocks;
> uint32_t status = 0;
> - uint64_t offset_note;
> + uint64_t offset_note, offset_vmcoreinfo, size_vmcoreinfo = 0;
> Error *local_err = NULL;
> + uint8_t *vmcoreinfo = NULL;
>
> /* write common header, the version of kdump-compressed format is 6th */
> size = sizeof(DiskDumpHeader64);
> @@ -941,7 +962,18 @@ static void create_header64(DumpState *s, Error **errp)
> kh->phys_base = cpu_to_dump64(s, s->dump_info.phys_base);
> kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL);
>
> - offset_note = DISKDUMP_HEADER_BLOCKS * block_size + size;
> + offset_vmcoreinfo = DISKDUMP_HEADER_BLOCKS * block_size + size;
> + if (s->vmcoreinfo) {
> + uint64_t hsize, name_size;
> +
> + get_note_sizes(s, s->vmcoreinfo, &hsize, &name_size, &size_vmcoreinfo);
> + vmcoreinfo =
> + s->vmcoreinfo + ((hsize + 3) / 4 + (name_size + 3) / 4) * 4;
> + kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo);
> + kh->size_vmcoreinfo = cpu_to_dump64(s, size_vmcoreinfo);
> + }
> +
> + offset_note = offset_vmcoreinfo + size_vmcoreinfo;
> kh->offset_note = cpu_to_dump64(s, offset_note);
> kh->note_size = cpu_to_dump64(s, s->note_size);
>
> @@ -951,6 +983,14 @@ static void create_header64(DumpState *s, Error **errp)
> goto out;
> }
>
> + if (vmcoreinfo) {
> + if (write_buffer(s->fd, offset_vmcoreinfo, vmcoreinfo,
> + size_vmcoreinfo) < 0) {
> + error_setg(errp, "dump: failed to vmcoreinfo");
> + goto out;
> + }
> + }
> +
> /* write note */
> s->note_buf = g_malloc0(s->note_size);
> s->note_buf_offset = 0;
> --
> 2.13.0.91.g00982b8dd
>
>
Besides the + 3 / 4 * 4, which might be nicer as ROUND_UP()
Reviewed-by: Andrew Jones <drjones@redhat.com>
© 2016 - 2026 Red Hat, Inc.