Message ID | 20170601130325.6433-4-marcandre.lureau@redhat.com |
---|---|
State | New |
Headers | show |
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>
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;
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(-)