xfs
[Top] [All Lists]

[PATCH 8/9] repair: handle remote sylmlink CRC errors

To: xfs@xxxxxxxxxxx
Subject: [PATCH 8/9] repair: handle remote sylmlink CRC errors
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Tue, 15 Apr 2014 18:25:00 +1000
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1397550301-31883-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1397550301-31883-1-git-send-email-david@xxxxxxxxxxxxx>
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..51863c4 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

<Prev in Thread] Current Thread [Next in Thread>