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

Goldwyn Rodrigues rgoldwyn at gmail.com
Thu Jul 28 16:43:42 PDT 2011


Hi Joel,

Thanks for the review.

On Thu, Jul 28, 2011 at 4:22 AM, Joel Becker <jlbec at evilplan.org> wrote:
> 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.
>

ok

>> +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.

You mean quotes, right?

>
>> +     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.
>

I understand why I disable index of a bad signature, but I fail to
understand why I will err of ECC errors. In any case, I will change
this to EIO. I chose EINVAL just to make it different from read
errors. It does make sense to encompass read errors as well.


-- 
Goldwyn



More information about the Ocfs2-devel mailing list