From 7cb3f7fe20439044aad6cc5512ea6ec408227e86 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Fri, 2 May 2014 09:31:28 +1000 Subject: [PATCH] repair: handle remote symlink CRC errors 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 Reviewed-by: Christoph Hellwig Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- repair/dinode.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index b086bec2d..8891e84ee 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 badcrc = 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); + badcrc = 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 (badcrc && !no_modify) + libxfs_writebuf(bp, 0); + else + libxfs_putbuf(bp); } return 0; } -- 2.47.2