[PATCH v2] makedumpfile: code cleanup: set_bitmap

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Mon Apr 28 00:27:32 PDT 2014


>On 2014/4/25 16:03, Petr Tesarik wrote:
>> On Fri, 25 Apr 2014 13:25:23 +0800
>> Wang Nan <wangnan0 at huawei.com> wrote:
>>
>>> On 2014/4/24 17:28, Petr Tesarik wrote:
>>>> On Thu, 24 Apr 2014 17:11:13 +0800
>>>> Wang Nan <wangnan0 at huawei.com> wrote:
>>> [...]
>>>>>  set_bitmap(struct dump_bitmap *bitmap, unsigned long long pfn,
>>>>>      int val)
>>>>>  {
>>>>> @@ -3317,20 +3345,11 @@ set_bitmap(struct dump_bitmap *bitmap, unsigned long long pfn,
>>>>>  	old_offset = bitmap->offset + BUFSIZE_BITMAP * bitmap->no_block;
>>>>>  	new_offset = bitmap->offset + BUFSIZE_BITMAP * (pfn / PFN_BUFBITMAP);
>>>>
>>>> After applying this patch, both old_offset and new_offset are
>>>> calculated only to compare for equality. And new_offset is in fact
>>>> computed twice (once in set_bitmap and once in sync_bitmap).
>>>>
>>>> This could be cleaned up by replacing the offsets with:
>>>>
>>>> 	int new_no_block = pfn / PFN_BUFBITMAP;
>>>>
>>>> Then change all occurrences of if (old_offset != new_offset) to:
>>>>
>>>> 	if (bitmap->no_block != new_no_block)
>>>>
>>>> and finally re-use new_no_block in the assignment to bitmap->no_block
>>>> near the end of the function, like this:
>>>>
>>>> -		bitmap->no_block = pfn / PFN_BUFBITMAP;
>>>> +		bitmap->no_block = new_no_block;
>>>>
>>>> Petr T
>>>>
>>>>>
>>>>> -	if (0 <= bitmap->no_block && old_offset != new_offset) {
>>>>> -		if (lseek(bitmap->fd, old_offset, SEEK_SET) < 0 ) {
>>>>> -			ERRMSG("Can't seek the bitmap(%s). %s\n",
>>>>> -			    bitmap->file_name, strerror(errno));
>>>>> -			return FALSE;
>>>>> -		}
>>>>> -		if (write(bitmap->fd, bitmap->buf, BUFSIZE_BITMAP)
>>>>> -		    != BUFSIZE_BITMAP) {
>>>>> -			ERRMSG("Can't write the bitmap(%s). %s\n",
>>>>> -			    bitmap->file_name, strerror(errno));
>>>>> +	if (old_offset != new_offset) {
>>>>> +		if (!sync_bitmap(bitmap)) {
>>>>> +			ERRMSG("Can't sync bitmap\n");
>>>>>  			return FALSE;
>>>>>  		}
>>>>> -	}
>>>>> -	if (old_offset != new_offset) {
>>>>>  		if (lseek(bitmap->fd, new_offset, SEEK_SET) < 0 ) {
>>>>>  			ERRMSG("Can't seek the bitmap(%s). %s\n",
>>>>>  			    bitmap->file_name, strerror(errno));
>>> [ .. see below .. ]
>>>
>>> Good suggestion, but new_offset is still needed to be calculated for these lseeks.
>>
>> True, but it will be calculated only once (in sync_bitmap). OTOH the
>> block number is always needed, because it is stored in bitmap->no_block.
>>
>> Okay, that can be changed, and you can store the offset instead. I
>> don't have a strong opinion on this.
>>
>>> In addition, I have another idea: what about to replace all lseek .. read/write pattern to pread/pwrite?
>>
>> Definitely! After doing that, we could even reuse the same file descriptor
>> for all processes.
>>
>
>I posted a series of patches for lseek. If Atsushi Kumagai accept them, I will
>redo this patch on top of them.

I haven't gotten a chance to review them yet, but I accept your idea.
So please give me a time for reviewing.


Thanks
Atsushi Kumagai

>> Now, since the original patch looks good as it is, let's see if Atsushi
>> Kumagai takes it into the tree and post more clean up patches afterwards.
>>
>> Petr T
>>
>




More information about the kexec mailing list