[Ocfs2-tools-devel] [PATCH 06/18] tunefs.ocfs2: Display progress feature_metaecc.
Mark Fasheh
mfasheh at suse.com
Wed Jan 14 14:49:02 PST 2009
Signed-off-by: Mark Fasheh <mfasheh at suse.com>
On Mon, Jan 05, 2009 at 06:33:42PM -0800, Joel Becker wrote:
> feature_metaecc provides progress display while it's doing work.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
> tunefs.ocfs2/feature_metaecc.c | 87 ++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 83 insertions(+), 4 deletions(-)
>
> diff --git a/tunefs.ocfs2/feature_metaecc.c b/tunefs.ocfs2/feature_metaecc.c
> index 7c822a7..2d491ea 100644
> --- a/tunefs.ocfs2/feature_metaecc.c
> +++ b/tunefs.ocfs2/feature_metaecc.c
> @@ -33,7 +33,6 @@
>
>
>
> -
> /* A dirblock we have to add a trailer to */
> struct tunefs_trailer_dirblock {
> struct list_head db_list;
> @@ -640,10 +639,15 @@ struct chain_to_ecc {
>
> struct add_ecc_context {
> errcode_t ae_ret;
> + struct tools_progress *ae_prog;
> +
> uint32_t ae_clusters;
> struct list_head ae_dirs;
> + uint64_t ae_dircount;
> struct list_head ae_chains;
> + uint64_t ae_chaincount;
> struct rb_root ae_blocks;
> + uint64_t ae_blockcount;
> };
>
> static void block_free(struct block_to_ecc *block)
> @@ -712,6 +716,7 @@ static errcode_t block_insert(struct add_ecc_context *ctxt,
>
> rb_link_node(&block->e_node, parent, p);
> rb_insert_color(&block->e_node, &ctxt->ae_blocks);
> + ctxt->ae_blockcount++;
> ret = 0;
>
> return ret;
> @@ -876,6 +881,7 @@ static errcode_t add_ecc_chain(struct add_ecc_context *ctxt,
> if (!ret) {
> cte->ce_blkno = blkno;
> list_add_tail(&cte->ce_list, &ctxt->ae_chains);
> + ctxt->ae_chaincount++;
> }
>
> return ret;
> @@ -1040,7 +1046,8 @@ static errcode_t find_chain_blocks(ocfs2_filesys *fs,
> struct chain_to_ecc *cte;
> struct ocfs2_dinode *di;
> struct block_to_ecc *block;
> - char *buf;
> + char *buf = NULL;
> + struct tools_progress *prog;
> struct add_ecc_iterate iter = {
> .ic_ctxt = ctxt,
> };
> @@ -1049,6 +1056,13 @@ static errcode_t find_chain_blocks(ocfs2_filesys *fs,
> if (ret)
> goto out;
>
> + prog = tools_progress_start("Scanning allocators", "chains",
> + ctxt->ae_chaincount);
> + if (!prog) {
> + ret = TUNEFS_ET_NO_MEMORY;
> + goto out;
> + }
> +
> list_for_each(pos, &ctxt->ae_chains) {
> cte = list_entry(pos, struct chain_to_ecc, ce_list);
> ret = ocfs2_read_inode(fs, cte->ce_blkno, buf);
> @@ -1076,11 +1090,15 @@ static errcode_t find_chain_blocks(ocfs2_filesys *fs,
> &iter);
> if (ret)
> break;
> + tools_progress_step(prog, 1);
> }
>
> - ocfs2_free(&buf);
> + tools_progress_stop(prog);
>
> out:
> + if (buf)
> + ocfs2_free(&buf);
> +
> return ret;
> }
>
> @@ -1151,6 +1169,7 @@ static errcode_t inode_iterate(ocfs2_filesys *fs, struct ocfs2_dinode *di,
> "more blocks\n",
> tc->d_blkno, tc->d_blocks_needed);
> list_add(&tc->d_list, &ctxt->ae_dirs);
> + ctxt->ae_dircount++;
> ctxt->ae_clusters +=
> ocfs2_clusters_in_blocks(fs,
> tc->d_blocks_needed);
> @@ -1158,6 +1177,8 @@ static errcode_t inode_iterate(ocfs2_filesys *fs, struct ocfs2_dinode *di,
> }
>
> out:
> + tools_progress_step(ctxt->ae_prog, 1);
> +
> return ret;
> }
>
> @@ -1166,9 +1187,18 @@ static errcode_t find_blocks(ocfs2_filesys *fs, struct add_ecc_context *ctxt)
> errcode_t ret;
> uint32_t free_clusters = 0;
>
> + ctxt->ae_prog = tools_progress_start("Scanning filesystem",
> + "scanning", 0);
> + if (!ctxt->ae_prog) {
> + ret = TUNEFS_ET_NO_MEMORY;
> + goto bail;
> + }
> +
> ret = tunefs_foreach_inode(fs, inode_iterate, ctxt);
> if (ret)
> goto bail;
> + tools_progress_stop(ctxt->ae_prog);
> + ctxt->ae_prog = NULL;
>
> ret = tunefs_get_free_clusters(fs, &free_clusters);
> if (ret)
> @@ -1183,6 +1213,8 @@ static errcode_t find_blocks(ocfs2_filesys *fs, struct add_ecc_context *ctxt)
> ret = OCFS2_ET_NO_SPACE;
>
> bail:
> + if (ctxt->ae_prog)
> + tools_progress_stop(ctxt->ae_prog);
> return ret;
> }
>
> @@ -1192,10 +1224,13 @@ static errcode_t install_trailers(ocfs2_filesys *fs,
> errcode_t ret = 0;
> struct tunefs_trailer_context *tc;
> struct list_head *n, *pos;
> + struct tools_progress *prog;
> struct add_ecc_iterate iter = {
> .ic_ctxt = ctxt,
> };
>
> + prog = tools_progress_start("Installing dir trailers",
> + "trailers", ctxt->ae_dircount);
> list_for_each_safe(pos, n, &ctxt->ae_dirs) {
> tc = list_entry(pos, struct tunefs_trailer_context, d_list);
> verbosef(VL_DEBUG,
> @@ -1220,7 +1255,10 @@ static errcode_t install_trailers(ocfs2_filesys *fs,
> dirdata_iterate, &iter);
> if (ret)
> break;
> +
> + tools_progress_step(prog, 1);
> }
> + tools_progress_stop(prog);
>
> return ret;
> }
> @@ -1231,6 +1269,12 @@ static errcode_t write_ecc_blocks(ocfs2_filesys *fs,
> errcode_t ret = 0;
> struct rb_node *n;
> struct block_to_ecc *block;
> + struct tools_progress *prog;
> +
> + prog = tools_progress_start("Writing blocks", "ECC",
> + ctxt->ae_blockcount);
> + if (!prog)
> + return TUNEFS_ET_NO_MEMORY;
>
> n = rb_first(&ctxt->ae_blocks);
> while (n) {
> @@ -1238,12 +1282,14 @@ static errcode_t write_ecc_blocks(ocfs2_filesys *fs,
> verbosef(VL_DEBUG, "Writing block %"PRIu64"\n",
> block->e_blkno);
>
> + tools_progress_step(prog, 1);
> ret = block->e_write(fs, block);
> if (ret)
> break;
>
> n = rb_next(n);
> }
> + tools_progress_stop(prog);
>
> return ret;
> }
> @@ -1253,6 +1299,7 @@ static int enable_metaecc(ocfs2_filesys *fs, int flags)
> errcode_t ret = 0;
> struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
> struct add_ecc_context ctxt;
> + struct tools_progress *prog = NULL;
>
> if (ocfs2_meta_ecc(super)) {
> verbosef(VL_APP,
> @@ -1266,6 +1313,13 @@ static int enable_metaecc(ocfs2_filesys *fs, int flags)
> fs->fs_devname))
> goto out;
>
> + prog = tools_progress_start("Enabling metaecc", "metaecc", 5);
> + if (!prog) {
> + ret = TUNEFS_ET_NO_MEMORY;
> + tcom_err(ret, "while initializing the progress display");
> + goto out;
> + }
> +
> memset(&ctxt, 0, sizeof(ctxt));
> INIT_LIST_HEAD(&ctxt.ae_dirs);
> INIT_LIST_HEAD(&ctxt.ae_chains);
> @@ -1282,6 +1336,7 @@ static int enable_metaecc(ocfs2_filesys *fs, int flags)
> "while trying to find directory blocks");
> goto out_cleanup;
> }
> + tools_progress_step(prog, 1);
>
> ret = tunefs_set_in_progress(fs, OCFS2_TUNEFS_INPROG_DIR_TRAILER);
> if (ret)
> @@ -1300,27 +1355,38 @@ static int enable_metaecc(ocfs2_filesys *fs, int flags)
> if (ret)
> goto out_cleanup;
>
> + tools_progress_step(prog, 1);
> +
> /* We're done with allocation, scan the chain allocators */
> ret = find_chain_blocks(fs, &ctxt);
> if (ret)
> goto out_cleanup;
>
> + tools_progress_step(prog, 1);
> +
> /* Set the feature bit in-memory and rewrite all our blocks */
> OCFS2_SET_INCOMPAT_FEATURE(super, OCFS2_FEATURE_INCOMPAT_META_ECC);
> ret = write_ecc_blocks(fs, &ctxt);
> if (ret)
> goto out_cleanup;
>
> + tools_progress_step(prog, 1);
> +
> tunefs_block_signals();
> ret = ocfs2_write_super(fs);
> tunefs_unblock_signals();
> if (ret)
> tcom_err(ret, "while writing out the superblock");
>
> + tools_progress_step(prog, 1);
> +
> out_cleanup:
> empty_add_ecc_context(&ctxt);
>
> out:
> + if (prog)
> + tools_progress_stop(prog);
> +
> return ret;
> }
>
> @@ -1328,6 +1394,7 @@ static int disable_metaecc(ocfs2_filesys *fs, int flags)
> {
> errcode_t ret = 0;
> struct ocfs2_super_block *super = OCFS2_RAW_SB(fs->fs_super);
> + struct tools_progress *prog = NULL;
>
> if (!ocfs2_meta_ecc(super)) {
> verbosef(VL_APP,
> @@ -1336,11 +1403,18 @@ static int disable_metaecc(ocfs2_filesys *fs, int flags)
> goto out;
> }
>
> - if (!tools_interact("Enable the metadata ECC feature on device "
> + if (!tools_interact("Disable the metadata ECC feature on device "
> "\"%s\"? ",
> fs->fs_devname))
> goto out;
>
> + prog = tools_progress_start("Disabling metaecc", "nometaecc", 1);
> + if (!prog) {
> + ret = TUNEFS_ET_NO_MEMORY;
> + goto out;
> + }
> +
> +
> OCFS2_CLEAR_INCOMPAT_FEATURE(super,
> OCFS2_FEATURE_INCOMPAT_META_ECC);
> tunefs_block_signals();
> @@ -1349,7 +1423,12 @@ static int disable_metaecc(ocfs2_filesys *fs, int flags)
> if (ret)
> tcom_err(ret, "while writing out the superblock");
>
> + tools_progress_step(prog, 1);
> +
> out:
> + if (prog)
> + tools_progress_stop(prog);
> +
> return ret;
> }
>
> --
> 1.5.6.5
--
Mark Fasheh
More information about the Ocfs2-tools-devel
mailing list