From: Dave Chinner <dchinner@xxxxxxxxxx> We can't really repair broken symlink buffer contents, but we can at least warn about it and correct the CRC error so the symlink is again readable. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- repair/dinode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index b086bec..6360dba 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1254,6 +1254,7 @@ process_symlink_remote( while (pathlen > 0) { int blk_cnt = 1; int byte_cnt; + int dirty = 0; fsbno = blkmap_get(blkmap, i); if (fsbno == NULLDFSBNO) { @@ -1284,6 +1285,12 @@ _("cannot read inode %" PRIu64 ", file block %d, disk block %" PRIu64 "\n"), lino, i, fsbno); return 1; } + if (bp->b_error == EFSBADCRC) { + do_warn( +_("Bad symlink buffer CRC, block %" PRIu64 ", inode %" PRIu64 ".\n" + "Correcting CRC, but symlink may be bad.\n"), fsbno, lino); + dirty = 1; + } byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); byte_cnt = MIN(pathlen, byte_cnt); @@ -1307,7 +1314,10 @@ _("bad symlink header ino %" PRIu64 ", file block %d, disk block %" PRIu64 "\n") offset += byte_cnt; i++; - libxfs_putbuf(bp); + if (dirty) + libxfs_writebuf(bp, 0); + else + libxfs_putbuf(bp); } return 0; } -- 1.9.0 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs