[Ocfs2-devel] [PATCH 1/2] Disable indexing for directory with corrupt index
Joel Becker
jlbec at evilplan.org
Sun Aug 21 20:55:42 PDT 2011
On Thu, Jul 28, 2011 at 06:43:42PM -0500, Goldwyn Rodrigues wrote:
> Hi Joel,
>
> Thanks for the review.
No problem. Sorry I took so long to get back to you.
> >> +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?
No, I mean parenthesis. Both are acceptible, though. I'd
probably do:
mlog(ML_ERROR,
"Disabling ..."
" corruption...",
oi->ip_blkno);
It's mostly a matter of taste. The only wrong answer is an indentation
that doesn't line up with anything ;-)
> >> @@ -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.
Since ECC error returns -EIO, you'll trigger the mlog_errno(ret)
path and reject continuing. Conversely, if you disable, the directory
can continue to work in non-indexed mode. The same is true of read
errors for the index; disabling the index allows the directory to
continue to work.
Joel
--
Joel's Second Law:
If a code change requires additional user setup, it is wrong.
http://www.jlbec.org/
jlbec at evilplan.org
More information about the Ocfs2-devel
mailing list