6015
6258
if (!prepare_cache_data(&cd_header))
6018
if (!prepare_cache_data(&cd_page))
6261
if (!prepare_cache_data(&cd_page)) {
6262
free_cache_data(&cd_header);
6021
6265
if (info->flag_elf_dumpfile) {
6022
6266
if (!write_elf_header(&cd_header))
6024
6268
if (!write_elf_pages(&cd_header, &cd_page))
6027
6271
if (!write_kdump_header())
6029
6273
if (!write_kdump_pages(&cd_header, &cd_page))
6031
6275
if (!write_kdump_bitmap())
6034
6278
if (info->flag_flatten) {
6035
6279
if (!write_end_flat_header())
6038
6285
free_cache_data(&cd_header);
6039
6286
free_cache_data(&cd_page);
6041
if (!close_files_for_creating_dumpfile())
6290
if ((ret == FALSE) && info->flag_nospace)
6297
setup_splitting(void)
6300
unsigned long long j, pfn_per_dumpfile;
6301
unsigned long long start_pfn, end_pfn;
6302
unsigned long long num_dumpable = get_num_dumpable();
6303
struct dump_bitmap bitmap2;
6305
if (info->num_dumpfile <= 1)
6308
initialize_2nd_bitmap(&bitmap2);
6310
pfn_per_dumpfile = num_dumpable / info->num_dumpfile;
6311
start_pfn = end_pfn = 0;
6312
for (i = 0; i < info->num_dumpfile; i++) {
6313
start_pfn = end_pfn;
6314
if (i == (info->num_dumpfile - 1)) {
6315
end_pfn = info->max_mapnr;
6317
for (j = 0; j < pfn_per_dumpfile; end_pfn++) {
6318
if (is_dumpable(&bitmap2, end_pfn))
6322
SPLITTING_START_PFN(i) = start_pfn;
6323
SPLITTING_END_PFN(i) = end_pfn;
6330
* This function is for creating split dumpfiles by multiple
6331
* processes. Each child process should re-open a /proc/vmcore
6332
* file, because it prevents each other from affectting the file
6333
* offset due to read(2) call.
6336
reopen_dump_memory()
6338
close_dump_memory();
6340
if ((info->fd_memory = open(info->name_memory, O_RDONLY)) < 0) {
6341
ERRMSG("Can't open the dump memory(%s). %s\n",
6342
info->name_memory, strerror(errno));
6349
get_next_dump_level(int index)
6351
if (info->num_dump_level <= index)
6354
return info->array_dump_level[index];
6358
delete_dumpfile(void)
6362
if (info->flag_flatten)
6365
if (info->flag_split) {
6366
for (i = 0; i < info->num_dumpfile; i++)
6367
unlink(SPLITTING_DUMPFILE(i));
6369
unlink(info->name_dumpfile);
6375
writeout_multiple_dumpfiles(void)
6377
int i, status, ret = TRUE;
6379
pid_t array_pid[info->num_dumpfile];
6381
if (!setup_splitting())
6384
for (i = 0; i < info->num_dumpfile; i++) {
6385
if ((pid = fork()) < 0) {
6388
} else if (pid == 0) { /* Child */
6389
info->name_dumpfile = SPLITTING_DUMPFILE(i);
6390
info->fd_bitmap = SPLITTING_FD_BITMAP(i);
6391
info->split_start_pfn = SPLITTING_START_PFN(i);
6392
info->split_end_pfn = SPLITTING_END_PFN(i);
6394
if (!reopen_dump_memory())
6396
if ((status = writeout_dumpfile()) == FALSE)
6398
else if (status == NOSPACE)
6404
for (i = 0; i < info->num_dumpfile; i++) {
6405
waitpid(array_pid[i], &status, WUNTRACED);
6406
if (!WIFEXITED(status) || WEXITSTATUS(status) == 1) {
6407
ERRMSG("Child process(%d) finished imcompletely.(%d)\n",
6408
array_pid[i], status);
6410
} else if ((ret == TRUE) && (WEXITSTATUS(status) == 2))
6417
create_dumpfile(void)
6419
int num_retry, status;
6421
if (!open_files_for_creating_dumpfile())
6424
if (!get_elf_info())
6427
if (vt.mem_flags & MEMORY_XEN) {
6438
if (!create_dump_bitmap())
6441
if (info->flag_split) {
6442
if ((status = writeout_multiple_dumpfiles()) == FALSE)
6445
if ((status = writeout_dumpfile()) == FALSE)
6448
if (status == NOSPACE) {
6450
* If specifying the other dump_level, makedumpfile tries
6451
* to create a dumpfile with it again.
6454
if ((info->dump_level = get_next_dump_level(num_retry)) < 0)
6456
MSG("Retry to create a dumpfile by dump_level(%d).\n",
6458
if (!delete_dumpfile())
6044
6462
print_report();
6464
if (!close_files_for_creating_dumpfile())
6471
read_disk_dump_header(struct disk_dump_header *dh, char *filename)
6473
int fd, ret = FALSE;
6475
if ((fd = open(filename, O_RDONLY)) < 0) {
6476
ERRMSG("Can't open a file(%s). %s\n",
6477
filename, strerror(errno));
6480
if (lseek(fd, 0x0, SEEK_SET) < 0) {
6481
ERRMSG("Can't seek a file(%s). %s\n",
6482
filename, strerror(errno));
6485
if (read(fd, dh, sizeof(struct disk_dump_header))
6486
!= sizeof(struct disk_dump_header)) {
6487
ERRMSG("Can't read a file(%s). %s\n",
6488
filename, strerror(errno));
6491
if (strncmp(dh->signature, KDUMP_SIGNATURE, strlen(KDUMP_SIGNATURE))) {
6492
ERRMSG("%s is not the kdump-compressed format.\n",
6504
read_kdump_sub_header(struct kdump_sub_header *ksh, char *filename)
6506
int fd, ret = FALSE;
6508
if (!info->page_size)
6511
if ((fd = open(filename, O_RDONLY)) < 0) {
6512
ERRMSG("Can't open a file(%s). %s\n",
6513
filename, strerror(errno));
6516
if (lseek(fd, info->page_size, SEEK_SET) < 0) {
6517
ERRMSG("Can't seek a file(%s). %s\n",
6518
filename, strerror(errno));
6521
if (read(fd, ksh, sizeof(struct kdump_sub_header))
6522
!= sizeof(struct kdump_sub_header)) {
6523
ERRMSG("Can't read a file(%s). %s\n",
6524
filename, strerror(errno));
6535
store_splitting_info(void)
6538
struct disk_dump_header dh, tmp_dh;
6539
struct kdump_sub_header ksh;
6541
for (i = 0; i < info->num_dumpfile; i++) {
6542
if (!read_disk_dump_header(&tmp_dh, SPLITTING_DUMPFILE(i)))
6546
memcpy(&dh, &tmp_dh, sizeof(tmp_dh));
6547
info->max_mapnr = dh.max_mapnr;
6548
if (!set_page_size(dh.block_size))
6550
DEBUG_MSG("max_mapnr : %llx\n", info->max_mapnr);
6551
DEBUG_MSG("page_size : %ld\n", info->page_size);
6555
* Check whether multiple dumpfiles are parts of
6556
* the same /proc/vmcore.
6558
if (memcmp(&dh, &tmp_dh, sizeof(tmp_dh))) {
6559
ERRMSG("Invalid dumpfile(%s).\n",
6560
SPLITTING_DUMPFILE(i));
6563
if (!read_kdump_sub_header(&ksh, SPLITTING_DUMPFILE(i)))
6567
info->dump_level = ksh.dump_level;
6568
DEBUG_MSG("dump_level : %d\n", info->dump_level);
6570
SPLITTING_START_PFN(i) = ksh.start_pfn;
6571
SPLITTING_END_PFN(i) = ksh.end_pfn;
6577
sort_splitting_info(void)
6580
unsigned long long start_pfn, end_pfn;
6581
char *name_dumpfile;
6584
* Sort splitting_info by start_pfn.
6586
for (i = 0; i < (info->num_dumpfile - 1); i++) {
6587
for (j = i; j < info->num_dumpfile; j++) {
6588
if (SPLITTING_START_PFN(i) < SPLITTING_START_PFN(j))
6590
start_pfn = SPLITTING_START_PFN(i);
6591
end_pfn = SPLITTING_END_PFN(i);
6592
name_dumpfile = SPLITTING_DUMPFILE(i);
6594
SPLITTING_START_PFN(i) = SPLITTING_START_PFN(j);
6595
SPLITTING_END_PFN(i) = SPLITTING_END_PFN(j);
6596
SPLITTING_DUMPFILE(i) = SPLITTING_DUMPFILE(j);
6598
SPLITTING_START_PFN(j) = start_pfn;
6599
SPLITTING_END_PFN(j) = end_pfn;
6600
SPLITTING_DUMPFILE(j) = name_dumpfile;
6604
DEBUG_MSG("num_dumpfile : %d\n", info->num_dumpfile);
6605
for (i = 0; i < info->num_dumpfile; i++) {
6606
DEBUG_MSG("dumpfile (%s)\n", SPLITTING_DUMPFILE(i));
6607
DEBUG_MSG(" start_pfn : %llx\n", SPLITTING_START_PFN(i));
6608
DEBUG_MSG(" end_pfn : %llx\n", SPLITTING_END_PFN(i));
6613
check_splitting_info(void)
6616
unsigned long long end_pfn;
6619
* Check whether there are not lack of /proc/vmcore.
6621
if (SPLITTING_START_PFN(0) != 0) {
6622
ERRMSG("There is not dumpfile corresponding to pfn 0x%x - 0x%llx.\n",
6623
0x0, SPLITTING_START_PFN(0));
6626
end_pfn = SPLITTING_END_PFN(0);
6628
for (i = 1; i < info->num_dumpfile; i++) {
6629
if (end_pfn != SPLITTING_START_PFN(i)) {
6630
ERRMSG("There is not dumpfile corresponding to pfn 0x%llx - 0x%llx.\n",
6631
end_pfn, SPLITTING_START_PFN(i));
6634
end_pfn = SPLITTING_END_PFN(i);
6636
if (end_pfn != info->max_mapnr) {
6637
ERRMSG("There is not dumpfile corresponding to pfn 0x%llx - 0x%llx.\n",
6638
end_pfn, info->max_mapnr);
6646
get_splitting_info(void)
6648
if (!store_splitting_info())
6651
sort_splitting_info();
6653
if (!check_splitting_info())
6660
reassemble_kdump_header(void)
6662
int fd, ret = FALSE;
6663
off_t offset_bitmap;
6664
struct disk_dump_header dh;
6665
struct kdump_sub_header ksh;
6669
* Write common header.
6671
if (!read_disk_dump_header(&dh, SPLITTING_DUMPFILE(0)))
6674
if (lseek(info->fd_dumpfile, 0x0, SEEK_SET) < 0) {
6675
ERRMSG("Can't seek a file(%s). %s\n",
6676
info->name_dumpfile, strerror(errno));
6679
if (write(info->fd_dumpfile, &dh, sizeof(dh)) != sizeof(dh)) {
6680
ERRMSG("Can't write a file(%s). %s\n",
6681
info->name_dumpfile, strerror(errno));
6688
if (!read_kdump_sub_header(&ksh, SPLITTING_DUMPFILE(0)))
6695
if (lseek(info->fd_dumpfile, info->page_size, SEEK_SET) < 0) {
6696
ERRMSG("Can't seek a file(%s). %s\n",
6697
info->name_dumpfile, strerror(errno));
6700
if (write(info->fd_dumpfile, &ksh, sizeof(ksh)) != sizeof(ksh)) {
6701
ERRMSG("Can't write a file(%s). %s\n",
6702
info->name_dumpfile, strerror(errno));
6707
* Write dump bitmap to both a dumpfile and a bitmap file.
6709
offset_bitmap = info->page_size * (1 + dh.sub_hdr_size);
6710
info->len_bitmap = info->page_size * dh.bitmap_blocks;
6711
if ((buf_bitmap = malloc(info->len_bitmap)) == NULL) {
6712
ERRMSG("Can't allcate memory for bitmap.\n");
6716
if ((fd = open(SPLITTING_DUMPFILE(0), O_RDONLY)) < 0) {
6717
ERRMSG("Can't open a file(%s). %s\n",
6718
SPLITTING_DUMPFILE(0), strerror(errno));
6721
if (lseek(fd, offset_bitmap, SEEK_SET) < 0) {
6722
ERRMSG("Can't seek a file(%s). %s\n",
6723
SPLITTING_DUMPFILE(0), strerror(errno));
6726
if (read(fd, buf_bitmap, info->len_bitmap) != info->len_bitmap) {
6727
ERRMSG("Can't read a file(%s). %s\n",
6728
SPLITTING_DUMPFILE(0), strerror(errno));
6732
if (lseek(info->fd_dumpfile, offset_bitmap, SEEK_SET) < 0) {
6733
ERRMSG("Can't seek a file(%s). %s\n",
6734
info->name_dumpfile, strerror(errno));
6737
if (write(info->fd_dumpfile, buf_bitmap, info->len_bitmap)
6738
!= info->len_bitmap) {
6739
ERRMSG("Can't write a file(%s). %s\n",
6740
info->name_dumpfile, strerror(errno));
6744
if (lseek(info->fd_bitmap, 0x0, SEEK_SET) < 0) {
6745
ERRMSG("Can't seek a file(%s). %s\n",
6746
info->name_bitmap, strerror(errno));
6749
if (write(info->fd_bitmap, buf_bitmap, info->len_bitmap)
6750
!= info->len_bitmap) {
6751
ERRMSG("Can't write a file(%s). %s\n",
6752
info->name_bitmap, strerror(errno));
6764
reassemble_kdump_pages(void)
6766
int i, fd = 0, ret = FALSE;
6767
off_t offset_first_ph, offset_ph_org;
6768
off_t offset_data_new, offset_zero_page = 0;
6769
unsigned long long pfn, start_pfn, end_pfn;
6770
unsigned long long num_dumpable, num_dumped;
6771
struct dump_bitmap bitmap2;
6772
struct disk_dump_header dh;
6773
struct page_desc pd, pd_zero;
6774
struct cache_data cd_pd, cd_data;
6777
initialize_2nd_bitmap(&bitmap2);
6779
if (!read_disk_dump_header(&dh, SPLITTING_DUMPFILE(0)))
6782
if (!prepare_cache_data(&cd_pd))
6785
if (!prepare_cache_data(&cd_data)) {
6786
free_cache_data(&cd_pd);
6789
if ((data = malloc(info->page_size)) == NULL) {
6790
ERRMSG("Can't allcate memory for page data.\n");
6791
free_cache_data(&cd_pd);
6792
free_cache_data(&cd_data);
6795
num_dumpable = get_num_dumpable();
6798
offset_first_ph = (1 + dh.sub_hdr_size + dh.bitmap_blocks)
6800
cd_pd.offset = offset_first_ph;
6801
offset_data_new = offset_first_ph + sizeof(page_desc_t) * num_dumpable;
6802
cd_data.offset = offset_data_new;
6805
* Write page header of zero-filled page.
6807
if (info->dump_level & DL_EXCLUDE_ZERO) {
6809
* makedumpfile outputs the data of zero-filled page at first
6810
* if excluding zero-filled page, so the offset of first data
6811
* is for zero-filled page in all dumpfiles.
6813
offset_zero_page = offset_data_new;
6815
pd_zero.size = info->page_size;
6817
pd_zero.offset = offset_data_new;
6818
pd_zero.page_flags = 0;
6819
memset(data, 0, pd_zero.size);
6820
if (!write_cache(&cd_data, data, pd_zero.size))
6822
offset_data_new += pd_zero.size;
6824
for (i = 0; i < info->num_dumpfile; i++) {
6825
if ((fd = open(SPLITTING_DUMPFILE(i), O_RDONLY)) < 0) {
6826
ERRMSG("Can't open a file(%s). %s\n",
6827
SPLITTING_DUMPFILE(i), strerror(errno));
6830
start_pfn = SPLITTING_START_PFN(i);
6831
end_pfn = SPLITTING_END_PFN(i);
6833
offset_ph_org = offset_first_ph;
6834
for (pfn = start_pfn; pfn < end_pfn; pfn++) {
6835
if (!is_dumpable(&bitmap2, pfn))
6840
print_progress(PROGRESS_COPY, num_dumped, num_dumpable);
6842
if (lseek(fd, offset_ph_org, SEEK_SET) < 0) {
6843
ERRMSG("Can't seek a file(%s). %s\n",
6844
SPLITTING_DUMPFILE(i), strerror(errno));
6847
if (read(fd, &pd, sizeof(pd)) != sizeof(pd)) {
6848
ERRMSG("Can't read a file(%s). %s\n",
6849
SPLITTING_DUMPFILE(i), strerror(errno));
6852
if (lseek(fd, pd.offset, SEEK_SET) < 0) {
6853
ERRMSG("Can't seek a file(%s). %s\n",
6854
SPLITTING_DUMPFILE(i), strerror(errno));
6857
if (read(fd, data, pd.size) != pd.size) {
6858
ERRMSG("Can't read a file(%s). %s\n",
6859
SPLITTING_DUMPFILE(i), strerror(errno));
6862
if ((info->dump_level & DL_EXCLUDE_ZERO)
6863
&& (pd.offset == offset_zero_page)) {
6865
* Handle the data of zero-filled page.
6867
if (!write_cache(&cd_pd, &pd_zero,
6870
offset_ph_org += sizeof(pd);
6873
pd.offset = offset_data_new;
6874
if (!write_cache(&cd_pd, &pd, sizeof(pd)))
6876
offset_ph_org += sizeof(pd);
6878
if (!write_cache(&cd_data, data, pd.size))
6881
offset_data_new += pd.size;
6886
if (!write_cache_bufsz(&cd_pd))
6888
if (!write_cache_bufsz(&cd_data))
6891
print_progress(PROGRESS_COPY, num_dumpable, num_dumpable);
6894
free_cache_data(&cd_pd);
6895
free_cache_data(&cd_data);
6906
reassemble_dumpfile(void)
6908
if (!get_splitting_info())
6911
if (!open_dump_bitmap())
6914
if (!open_dump_file())
6917
if (!reassemble_kdump_header())
6920
if (!reassemble_kdump_pages())
6924
close_dump_bitmap();