[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