[PATCH v2 7/8] makedumpfile: Add erased information in compressed kdump file

Mahesh Jagannath Salgaonkar mahesh at linux.vnet.ibm.com
Tue Aug 16 06:16:09 EDT 2011


Hi Ken'ichi,

On 08/16/2011 06:30 AM, Ken'ichi Ohmichi wrote:
> 
> Hi Mahesh,
> 
> On Wed, 18 May 2011 01:36:17 +0530
> Mahesh J Salgaonkar <mahesh at linux.vnet.ibm.com> wrote:
>> @@ -9452,6 +9747,7 @@ reassemble_kdump_pages(void)
>>  	struct cache_data cd_pd, cd_data;
>>  	struct timeval tv_start;
>>  	char *data = NULL;
>> +	unsigned long data_buf_size = info->page_size;
>>  
>>  	initialize_2nd_bitmap(&bitmap2);
>>  
>> @@ -9465,7 +9761,7 @@ reassemble_kdump_pages(void)
>>  		free_cache_data(&cd_pd);
>>  		return FALSE;
>>  	}
>> -	if ((data = malloc(info->page_size)) == NULL) {
>> +	if ((data = malloc(data_buf_size)) == NULL) {
>>  		ERRMSG("Can't allcate memory for page data.\n");
>>  		free_cache_data(&cd_pd);
>>  		free_cache_data(&cd_data);
>> @@ -9570,6 +9866,49 @@ reassemble_kdump_pages(void)
>>  	if (!write_cache_bufsz(&cd_data))
>>  		goto out;
>>  
>> +	info->offset_eraseinfo = cd_data.offset;
>> +	/* Copy eraseinfo from split dumpfiles to o/p dumpfile */
>> +	for (i = 0; i < info->num_dumpfile; i++) {
>> +		if (!SPLITTING_SIZE_EI(i))
>> +			continue;
>> +
>> +		if (SPLITTING_SIZE_EI(i) > data_buf_size) {
>> +			data_buf_size = SPLITTING_SIZE_EI(i);
>> +			if ((data = realloc(data, data_buf_size)) == NULL) {
>> +				ERRMSG("Can't allcate memory for eraseinfo"
>> +					" data.\n");
>> +				goto out;
>> +			}
>> +		}
>> +		if ((fd = open(SPLITTING_DUMPFILE(i), O_RDONLY)) < 0) {
>> +			ERRMSG("Can't open a file(%s). %s\n",
>> +			    SPLITTING_DUMPFILE(i), strerror(errno));
>> +			goto out;
>> +		}
>> +		if (lseek(fd, SPLITTING_OFFSET_EI(i), SEEK_SET) < 0) {
>> +			ERRMSG("Can't seek a file(%s). %s\n",
>> +			    SPLITTING_DUMPFILE(i), strerror(errno));
>> +			goto out;
>> +		}
>> +		if (read(fd, data, SPLITTING_SIZE_EI(i)) !=
>> +						SPLITTING_SIZE_EI(i)) {
>> +			ERRMSG("Can't read a file(%s). %s\n",
>> +			    SPLITTING_DUMPFILE(i), strerror(errno));
>> +			goto out;
>> +		}
>> +		if (!write_cache(&cd_data, data, SPLITTING_SIZE_EI(i)))
>> +			goto out;
>> +		info->size_eraseinfo += SPLITTING_SIZE_EI(i);
>> +
>> +		close(fd);
>> +		fd = 0;
>> +	}
>> +	if (!write_cache_bufsz(&cd_data))
>> +		goto out;
>> +
>> +	if (!update_sub_header())
>> +		goto out;
> 
> The above update_sub_header() breaks "--reassemble" option if a dumpfile
> does not contain eraseinfo data :

My bad. Thanks for catching it.

Thanks,
-Mahesh.

> 
> ---
> # makedumpfile --split -d30 vmcore dump.1 dump.2
> Copying data                       : [100 %]
> Copying data                       : [100 %]
> 
> The dumpfiles are saved to dump.1, and dump.2.
> 
> makedumpfile Completed.
> # makedumpfile --reassemble dump.1 dump.2 dump.3
> Copying data                       : [100 %]
> The dumpfile is saved to dump.3.
> 
> makedumpfile Completed.
> # crash vmlinux dump.3
> [..]
> 
> crash: page excluded: kernel virtual address: ffffffff8040b220  type: "cpu_possible_mask"
> #
> ---
> 
> The cause is that info->sub_header, which is written in update_sub_header(),
> is filled with 0x0.
> The following change fixes this problem:
> 
> ---
> @@ -9378,6 +9680,7 @@ reassemble_kdump_header(void)
>                     info->name_dumpfile, strerror(errno));
>                 return FALSE;
>         }
> +       memcpy(&info->sub_header, &kh, sizeof(kh));
> 
>         /*
>          * Write dump bitmap to both a dumpfile and a bitmap file.
> ---
> 
> Thanks
> Ken'ichi Ohmichi
> 
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec




More information about the kexec mailing list