[Ocfs2-tools-devel] [PATCH 1/2] fsck: fix the first group desc in chain 0 when globalbitmap has only one chain

Joseph Qi jiangqi903 at gmail.com
Mon Sep 11 04:19:52 PDT 2017


Hi Jun,

On 17/9/10 11:15, piaojun wrote:
> fsck can't fix the first group desc in chain 0 when global_bitmap has
> only one chain, because we will get error when reading gd in
> maybe_fix_clusters_per_group(). so we need fix the corrupted gd in the
> following steps.
> 
> Signed-off-by: Jun Piao <piaojun at huawei.com>
> ---
>  fsck.ocfs2/pass0.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/fsck.ocfs2/pass0.c b/fsck.ocfs2/pass0.c
> index 148877c..bfd11fb 100644
> --- a/fsck.ocfs2/pass0.c
> +++ b/fsck.ocfs2/pass0.c
> @@ -635,7 +635,15 @@ static errcode_t maybe_fix_clusters_per_group(o2fsck_state *ost,
>  	blkno = cl->cl_recs[0].c_blkno;
> 
>  	ret = ocfs2_read_group_desc(ost->ost_fs, blkno, (char *)gd);
> -	if (ret) {
> +	if ((ret == OCFS2_ET_BAD_GROUP_DESC_MAGIC) ||
> +	    (!ret && gd->bg_generation != ost->ost_fs_generation)) {

IIRC, ocfs2_read_group_desc will validate gd after read. So could you
please describe in which case the return value is 0 while generation is
corrupt?

Thanks,
Joseph

> +		if (prompt(ost, PY, PR_GROUP_EXPECTED_DESC,
> +			    "Group descriptor at block %"PRIu64" is corrupted. "
> +			    "Go fixing it in the following steps?", blkno)) {
> +			ret = 0;
> +		}
> +		goto out;
> +	} else if (ret) {
>  		com_err(whoami, ret, "while reading group descriptor "
>  			"at block %"PRIu64" to fix cl_cpg", blkno);
>  		goto out;
> @@ -1219,8 +1227,8 @@ static errcode_t verify_bitmap_descs(o2fsck_state *ost,
>  		 * its values.. we only preserve the bitmap if the signature
>  		 * and generation match this volume */
>  		ret = ocfs2_read_group_desc(ost->ost_fs, blkno, (char *)bg);
> -		if (ret == OCFS2_ET_BAD_GROUP_DESC_MAGIC ||
> -		    bg->bg_generation != ost->ost_fs_generation) {
> +		if ((ret == OCFS2_ET_BAD_GROUP_DESC_MAGIC) ||
> +		    (!ret && bg->bg_generation != ost->ost_fs_generation)) {
>  			memset(bg, 0, ost->ost_fs->fs_blocksize);
>  			ocfs2_init_group_desc(ost->ost_fs, bg, blkno,
>  					      ost->ost_fs_generation,
> 



More information about the Ocfs2-tools-devel mailing list