[Ocfs2-devel] [PATCH 1/2] Disable indexing for directory with corrupt index

Joel Becker jlbec at evilplan.org
Thu Jul 28 02:22:11 PDT 2011


On Wed, Jun 15, 2011 at 10:57:54AM -0500, Goldwyn Rodrigues wrote:
> Introduces ocfs2_dx_disable() to disable the index of a directory.
> This function is called when a index directory is encountered.
> Calling function must try and revert to regular directory handling,
> instead of using indexes, in order to complete the operation.
> 
> 
> Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>

Hey Goldwyn,
	I like the idea of this.  I have a few comments.

> @@ -649,9 +649,9 @@ static int ocfs2_validate_dx_leaf(struct super_block *sb,
>  	}
> 
>  	if (!OCFS2_IS_VALID_DX_LEAF(dx_leaf)) {
> -		ocfs2_error(sb, "Dir Index Leaf has bad signature %.*s",
> -			    7, dx_leaf->dl_signature);
> -		return -EROFS;
> +		mlog(ML_ERROR, "Dir Index Leaf has bad signature %.*s",
> +				7, dx_leaf->dl_signature);
> +		return -EINVAL;

	The meta_ecc validation functions return -EIO.  Perhaps we
should do the same?  -EIO signifies an attempt to continue.

> +static void ocfs2_dx_disable(struct inode *dir, struct buffer_head *di_bh)
> +{
> +	struct ocfs2_inode_info *oi = OCFS2_I(dir);
> +	struct ocfs2_dinode *di;
> +	if (!di_bh) {
> +		mlog(ML_ERROR, "Index directory corruption but unable "
> +			"to disable dx_dir for <%llu>. Please execute "
> +			"fsck.ocfs2\n",	OCFS2_I(dir)->ip_blkno);
> +		return;
> +	}
> +	di = (struct ocfs2_dinode *)di_bh->b_data;
> +	BUG_ON(di->i_blkno != oi->ip_blkno);
> +	mlog(ML_ERROR, "Disabling index for directory <%llu> due to"
> +		" corruption. Please execute fsck.ocfs2\n", oi->ip_blkno);

	Please match the indentation to the open parenthesis.

> +	oi->ip_dyn_features &= ~OCFS2_INDEXED_DIR_FL;
> +	di->i_dyn_features = cpu_to_le16(OCFS2_I(dir)->ip_dyn_features);
> +	di->i_dx_root = cpu_to_le64(0ULL);
> +}
> +
> +
>  /*
>   * Try to find an entry of the provided name within 'dir'.
>   *
> @@ -4364,11 +4392,17 @@ int ocfs2_prepare_dir_for_insert(struct
> ocfs2_super *osb,
>  	if (ocfs2_dir_indexed(dir)) {
>  		ret = ocfs2_prepare_dx_dir_for_insert(dir, parent_fe_bh,
>  						      name, namelen, lookup);
> -		if (ret)
> +		if (ret == -EINVAL) {
> +			ocfs2_dx_disable(dir, parent_fe_bh);
> +			/* Reset ret */
> +			ret = 0;
> +			goto no_index;
> +		} else if (ret)
>  			mlog_errno(ret);

	See here, you'll disable the index on a bad signature, but you
error when ECC fails.  You should disable the index on both cases.  I
say you return -EIO as I described above, and then disable when ret ==
-EIO.  Yes, we might disable the index upon an actual read error, but
that's OK.  We can rebuild it later.

Joel

-- 

"Also, all of life's big problems include the words 'indictment' or
	'inoperable.' Everything else is small stuff."
	- Alton Brown

			http://www.jlbec.org/
			jlbec at evilplan.org



More information about the Ocfs2-devel mailing list