From: Dave Chinner Date: Thu, 1 May 2014 23:31:28 +0000 (+1000) Subject: repair: handle remote symlink CRC errors X-Git-Tag: v3.2.0-rc2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cb3f7fe20439044aad6cc5512ea6ec408227e86;p=thirdparty%2Fxfsprogs-dev.git 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 --- 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; }