[Ocfs2-tools-devel] [PATCH] tunefs.ocfs2: Check the bitmap with the correct cluster count.

Tao Ma tao.ma at oracle.com
Mon Jun 15 01:00:39 PDT 2009


sob.

Joel Becker wrote:
> When tunefs resizes a filesystem, the lowest-level ocfs2_filesys has its
> fs_clusters updated, but the master ocfs2_filesys does not.  When tunefs
> exits, the bitmap check uses the master ocfs2_filesys.
> 
> This adds tunefs_update_fs_clusters(), which stores off any changes to
> fs_clusters.  When exiting, this value is used for the bitmap check.
> 
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  tunefs.ocfs2/libocfs2ne.c       |   39 ++++++++++++++++++++++++++++++++++++++-
>  tunefs.ocfs2/libocfs2ne.h       |    3 +++
>  tunefs.ocfs2/op_resize_volume.c |    4 ++++
>  3 files changed, 45 insertions(+), 1 deletions(-)
> 
> diff --git a/tunefs.ocfs2/libocfs2ne.c b/tunefs.ocfs2/libocfs2ne.c
> index c5362db..84f44a8 100644
> --- a/tunefs.ocfs2/libocfs2ne.c
> +++ b/tunefs.ocfs2/libocfs2ne.c
> @@ -75,6 +75,13 @@ struct tunefs_filesystem_state {
>  	/* Non-zero if we've ever mucked with the allocator */
>  	int		ts_allocation;
>  
> +	/*
> +	 * Number of clusters in the filesystem.  If changed by a
> +	 * resized filesystem, it is tracked here and used at final
> +	 * close.
> +	 */
> +	uint32_t	ts_fs_clusters;
> +
>  	/* Size of the largest journal seen in tunefs_journal_check() */
>  	uint32_t	ts_journal_clusters;
>  
> @@ -146,6 +153,7 @@ static errcode_t tunefs_set_state(ocfs2_filesys *fs)
>  			s->ts_local_fd = -1;
>  			s->ts_online_fd = -1;
>  			s->ts_master = fs;
> +			s->ts_fs_clusters = fs->fs_clusters;
>  		} else
>  			s = NULL;
>  	}
> @@ -1087,8 +1095,25 @@ static errcode_t tunefs_open_bitmap_check(ocfs2_filesys *fs)
>  	return tunefs_global_bitmap_check(fs);
>  }
>  
> +void tunefs_update_fs_clusters(ocfs2_filesys *fs)
> +{
> +	struct tunefs_private *tp = to_private(fs);
> +	struct tunefs_filesystem_state *state = tunefs_get_state(fs);
> +
> +	if (!(tp->tp_open_flags & TUNEFS_FLAG_ALLOCATION)) {
> +		verbosef(VL_LIB,
> +			 "Operation that claimed it would do no allocation "
> +			 "just attempted to update the filesystem size\n");
> +		return;
> +	}
> +
> +	state->ts_fs_clusters = fs->fs_clusters;
> +}
> +
>  static errcode_t tunefs_close_bitmap_check(ocfs2_filesys *fs)
>  {
> +	errcode_t ret;
> +	uint32_t old_clusters;
>  	struct tunefs_filesystem_state *state = tunefs_get_state(fs);
>  
>  	if (!state->ts_allocation)
> @@ -1097,7 +1122,19 @@ static errcode_t tunefs_close_bitmap_check(ocfs2_filesys *fs)
>  	if (state->ts_master != fs)
>  		return 0;
>  
> -	return tunefs_global_bitmap_check(fs);
> +	/*
> +	 * An operation that resized the filesystem will have called
> +	 * tunefs_update_fs_clusters().  The bitmap check needs this
> +	 * new value, so we swap it in for the call.
> +	 */
> +	old_clusters = fs->fs_clusters;
> +	fs->fs_clusters = state->ts_fs_clusters;
> +	fs->fs_blocks = ocfs2_clusters_to_blocks(fs, fs->fs_clusters);
> +	ret = tunefs_global_bitmap_check(fs);
> +	fs->fs_clusters = old_clusters;
> +	fs->fs_blocks = ocfs2_clusters_to_blocks(fs, fs->fs_clusters);
> +
> +	return ret;
>  }
>  
>  static errcode_t tunefs_journal_check(ocfs2_filesys *fs)
> diff --git a/tunefs.ocfs2/libocfs2ne.h b/tunefs.ocfs2/libocfs2ne.h
> index 6138724..9ddb05f 100644
> --- a/tunefs.ocfs2/libocfs2ne.h
> +++ b/tunefs.ocfs2/libocfs2ne.h
> @@ -227,6 +227,9 @@ errcode_t tunefs_get_free_clusters(ocfs2_filesys *fs, uint32_t *clusters);
>  errcode_t tunefs_empty_clusters(ocfs2_filesys *fs, uint64_t start_blk,
>  				uint32_t num_clusters);
>  
> +/* Tell tunefs that you updated the filesystem size */
> +void tunefs_update_fs_clusters(ocfs2_filesys *fs);
> +
>  /*
>   * Send an ioctl() to a live filesystem for online operation.  If the
>   * filesystem is mounted and an operation needs to be performed online,
> diff --git a/tunefs.ocfs2/op_resize_volume.c b/tunefs.ocfs2/op_resize_volume.c
> index 11552ff..0d0679c 100644
> --- a/tunefs.ocfs2/op_resize_volume.c
> +++ b/tunefs.ocfs2/op_resize_volume.c
> @@ -274,6 +274,7 @@ static errcode_t init_new_gd(ocfs2_filesys *fs,
>  					 gd_blkno);
>  				goto bail;
>  			}
> +			tunefs_update_fs_clusters(fs);
>  		} else {
>  			/* write a new group descriptor */
>  			ret = ocfs2_write_group_desc(fs, gd_blkno, gd_buf);
> @@ -322,6 +323,8 @@ static errcode_t update_global_bitmap(ocfs2_filesys *fs,
>  			 "while writing the global bitmap inode to block "
>  			 "%"PRIu64,
>  			 (uint64_t)di->i_blkno);
> +	else
> +		tunefs_update_fs_clusters(fs);
>  
>  bail:
>  	tunefs_unblock_signals();
> @@ -452,6 +455,7 @@ static errcode_t run_resize(ocfs2_filesys *fs, uint32_t total_clusters,
>  					 cluster_chunk);
>  				goto bail;
>  			}
> +			tunefs_update_fs_clusters(fs);
>  		}
>  	}
>  



More information about the Ocfs2-tools-devel mailing list