[PATCH v2] makedumpfile: code cleanup: set_bitmap

Petr Tesarik ptesarik at suse.cz
Thu Apr 24 02:28:15 PDT 2014


On Thu, 24 Apr 2014 17:11:13 +0800
Wang Nan <wangnan0 at huawei.com> wrote:

> This patch makes set_bitmap() to call sync_bitmap() instead rewrite
> identical code to do same thing.
> 
> Change from v1:
> 
> - fix a simple mistake:
>   sync_bitmap() returns TRUE(1) when it succeeds, so use
>   (!sync_bitmap()) for checking.

Hi Wang Nan,

I like your change. See my comments below:

> Signed-off-by: Wang Nan <wangnan0 at huawei.com>
> Cc: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
> Cc: kexec at lists.infradead.org
> Cc: Geng Hui <hui.geng at huawei.com>
> ---
>  makedumpfile.c | 70 ++++++++++++++++++++++++++--------------------------------
>  1 file changed, 31 insertions(+), 39 deletions(-)
> 
> diff --git a/makedumpfile.c b/makedumpfile.c
> index ce4a866..cea37a2 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -3309,6 +3309,34 @@ initialize_2nd_bitmap(struct dump_bitmap *bitmap)
>  }
>  
>  int
> +sync_bitmap(struct dump_bitmap *bitmap)
> +{
> +	off_t offset;
> +	offset = bitmap->offset + BUFSIZE_BITMAP * bitmap->no_block;
> +
> +	/*
> +	 * The bitmap buffer is not dirty, and it is not necessary
> +	 * to write out it.
> +	 */
> +	if (bitmap->no_block < 0)
> +		return TRUE;
> +
> +	if (lseek(bitmap->fd, 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));
> +		return FALSE;
> +	}
> +	return TRUE;
> +}
> +
> +
> +int
>  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));
> @@ -3386,33 +3405,6 @@ set_bitmap_cyclic(char *bitmap, unsigned long long pfn, int val, struct cycle *c
>  }
>  
>  int
> -sync_bitmap(struct dump_bitmap *bitmap)
> -{
> -	off_t offset;
> -	offset = bitmap->offset + BUFSIZE_BITMAP * bitmap->no_block;
> -
> -	/*
> -	 * The bitmap buffer is not dirty, and it is not necessary
> -	 * to write out it.
> -	 */
> -	if (bitmap->no_block < 0)
> -		return TRUE;
> -
> -	if (lseek(bitmap->fd, 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));
> -		return FALSE;
> -	}
> -	return TRUE;
> -}
> -
> -int
>  sync_1st_bitmap(void)
>  {
>  	return sync_bitmap(info->bitmap1);




More information about the kexec mailing list