* [PATCH] repair: Repair directory block CRC mismatches
@ 2014-06-24 9:33 Jan Kara
2014-07-08 0:59 ` Dave Chinner
0 siblings, 1 reply; 2+ messages in thread
From: Jan Kara @ 2014-06-24 9:33 UTC (permalink / raw)
To: xfs; +Cc: Jan Kara
It can happen that just CRC doesn't match for directory blocks. In that
case xfs_repair will just report the error but won't fix anything (as
further checking of the block doesn't reveal any problems). Make sure we
recompute and write out new CRC when we failed verification during
reading.
Signed-off-by: Jan Kara <jack@suse.cz>
---
repair/dir2.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/repair/dir2.c b/repair/dir2.c
index 14c1435f5077..a189c161e569 100644
--- a/repair/dir2.c
+++ b/repair/dir2.c
@@ -596,7 +596,13 @@ _("bad level %d in block %u for directory inode %" PRIu64 "\n"),
*/
ASSERT(cursor->level[this_level].dirty == 0 ||
(cursor->level[this_level].dirty && !no_modify));
-
+ /*
+ * If block looks ok but CRC didn't match, make sure to
+ * recompute it.
+ */
+ if (!no_modify &&
+ cursor->level[this_level].bp->b_error == EFSBADCRC)
+ cursor->level[this_level].dirty = 1;
if (cursor->level[this_level].dirty && !no_modify)
libxfs_writebuf(cursor->level[this_level].bp, 0);
else
@@ -1621,6 +1627,9 @@ _("bad directory block magic # %#x in block %u for directory inode %" PRIu64 "\n
blp = (xfs_dir2_leaf_entry_t *)btp;
rval = process_dir2_data(mp, ino, dip, ino_discovery, dirname, parent,
bp, dot, dotdot, mp->m_dirdatablk, (char *)blp, &dirty);
+ /* If block looks ok but CRC didn't match, make sure to recompute it. */
+ if (!rval && bp->b_error == EFSBADCRC)
+ dirty = 1;
if (dirty && !no_modify) {
*repair = 1;
libxfs_writebuf(bp, 0);
@@ -1784,6 +1793,12 @@ _("bad sibling back pointer for block %u in directory inode %" PRIu64 "\n"),
}
}
current_hashval = greatest_hashval;
+ /*
+ * If block looks ok but CRC didn't match, make sure to
+ * recompute it.
+ */
+ if (!no_modify && bp->b_error == EFSBADCRC)
+ buf_dirty = 1;
ASSERT(buf_dirty == 0 || (buf_dirty && !no_modify));
if (buf_dirty && !no_modify) {
*repair = 1;
@@ -1927,8 +1942,12 @@ _("bad directory block magic # %#x in block %" PRIu64 " for directory inode %" P
i = process_dir2_data(mp, ino, dip, ino_discovery, dirname,
parent, bp, dot, dotdot, (xfs_dablk_t)dbno,
(char *)data + mp->m_dirblksize, &dirty);
- if (i == 0)
+ if (i == 0) {
good++;
+ /* Maybe just CRC is wrong. Make sure we correct it. */
+ if (bp->b_error == EFSBADCRC)
+ dirty = 1;
+ }
if (dirty && !no_modify) {
*repair = 1;
libxfs_writebuf(bp, 0);
--
1.8.1.4
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] repair: Repair directory block CRC mismatches
2014-06-24 9:33 [PATCH] repair: Repair directory block CRC mismatches Jan Kara
@ 2014-07-08 0:59 ` Dave Chinner
0 siblings, 0 replies; 2+ messages in thread
From: Dave Chinner @ 2014-07-08 0:59 UTC (permalink / raw)
To: Jan Kara; +Cc: xfs
On Tue, Jun 24, 2014 at 11:33:35AM +0200, Jan Kara wrote:
> It can happen that just CRC doesn't match for directory blocks. In that
> case xfs_repair will just report the error but won't fix anything (as
> further checking of the block doesn't reveal any problems). Make sure we
> recompute and write out new CRC when we failed verification during
> reading.
>
> Signed-off-by: Jan Kara <jack@suse.cz>
Applied and pushed. Thanks.
--
Dave Chinner
david@fromorbit.com
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-07-08 1:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-24 9:33 [PATCH] repair: Repair directory block CRC mismatches Jan Kara
2014-07-08 0:59 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox