[PATCH 4/5] Store vmcoreinfo data into a kdump-compressed dumpfile. By applying this patch, makedumpfile takes vmcoreinfo data from /proc/vmcore and stores the data into a dumpfile in the kdump- compressed fomat. By the next patch, makedumpfile takes the data from a dumpfile in the kdump-compressed format and uses the data for re-filtering. Signed-off-by: Ken'ichi Ohmichi <oomichi at mxs.nes.nec.co.jp> --- diff -rpuN a/diskdump_mod.h b/diskdump_mod.h --- a/diskdump_mod.h 2009-10-13 12:19:53.000000000 +0900 +++ b/diskdump_mod.h 2009-10-13 12:20:03.000000000 +0900 @@ -71,6 +71,8 @@ struct kdump_sub_header { int split; /* header_version 2 and later */ unsigned long start_pfn; /* header_version 2 and later */ unsigned long end_pfn; /* header_version 2 and later */ + off_t offset_vmcoreinfo;/* header_version 3 and later */ + unsigned long size_vmcoreinfo; /* header_version 3 and later */ }; /* page flags */ diff -rpuN a/makedumpfile.c b/makedumpfile.c --- a/makedumpfile.c 2009-10-13 12:19:53.000000000 +0900 +++ b/makedumpfile.c 2009-10-13 12:23:49.000000000 +0900 @@ -5437,9 +5437,11 @@ out: int write_kdump_header(void) { + int ret = FALSE; size_t size; struct disk_dump_header *dh = info->dump_header; struct kdump_sub_header kh; + char *buf = NULL; if (info->flag_elf_dumpfile) return FALSE; @@ -5448,9 +5450,10 @@ write_kdump_header(void) * Write common header */ strcpy(dh->signature, KDUMP_SIGNATURE); - dh->header_version = 2; - dh->block_size = info->page_size; - dh->sub_hdr_size = divideup(sizeof(kh), dh->block_size); + dh->header_version = 3; + dh->block_size = info->page_size; + dh->sub_hdr_size = sizeof(kh) + info->size_vmcoreinfo; + dh->sub_hdr_size = divideup(dh->sub_hdr_size, dh->block_size); dh->max_mapnr = info->max_mapnr; dh->nr_cpus = 1; dh->bitmap_blocks = divideup(info->len_bitmap, dh->block_size); @@ -5473,14 +5476,47 @@ write_kdump_header(void) kh.start_pfn = info->split_start_pfn; kh.end_pfn = info->split_end_pfn; } + if (info->offset_vmcoreinfo && info->size_vmcoreinfo) { + kh.offset_vmcoreinfo = DISKDUMP_HDADER_BLOCKS * dh->block_size; + kh.offset_vmcoreinfo += sizeof(kh); + kh.size_vmcoreinfo = info->size_vmcoreinfo; + + buf = malloc(info->size_vmcoreinfo); + if (buf == NULL) { + ERRMSG("Can't allocate memory for vmcoreinfo. %s\n", + strerror(errno)); + return FALSE; + } + if (lseek(info->fd_memory, info->offset_vmcoreinfo, SEEK_SET) + < 0) { + ERRMSG("Can't seek the dump memory(%s). %s\n", + info->name_memory, strerror(errno)); + goto out; + } + if (read(info->fd_memory, buf, info->size_vmcoreinfo) + != info->size_vmcoreinfo) { + ERRMSG("Can't read the dump memory(%s). %s\n", + info->name_memory, strerror(errno)); + goto out; + } + } if (!write_buffer(info->fd_dumpfile, dh->block_size, &kh, size, info->name_dumpfile)) - return FALSE; + goto out; + + if (!write_buffer(info->fd_dumpfile, kh.offset_vmcoreinfo, buf, + kh.size_vmcoreinfo, info->name_dumpfile)) + goto out; info->offset_bitmap1 = (DISKDUMP_HDADER_BLOCKS + dh->sub_hdr_size) * dh->block_size; - return TRUE; + ret = TRUE; +out: + if (buf) + free(buf); + + return ret; } void