xfs
[Top] [All Lists]

[PATCH 4/4] xfs_repair: set *parent if process_dir2_data() fixes root in

To: Eric Sandeen <sandeen@xxxxxxxxxx>, xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH 4/4] xfs_repair: set *parent if process_dir2_data() fixes root inode's parent
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Wed, 04 Mar 2015 15:02:10 -0600
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <54F77199.8030708@xxxxxxxxxx>
References: <54F77199.8030708@xxxxxxxxxx>
process_dir2_data() may fix the root dir's parent inode:

"bad .. entry in root directory inode 6912, was 7159: correcting"

But we don't update the *parent passed in in that case; this then leads to
an assert later in process_dir2, because *parent is still the wrong value:

xfs_repair: dir2.c:2039: process_dir2:
  Assertion `(ino != mp->m_sb.sb_rootino && ino != *parent) ||
  (ino == mp->m_sb.sb_rootino && (ino == *parent || need_root_dotdot == 1))'
  failed.

Updating the value of *parent when we fix the parent value resolves this
problem.  Do it whether or not we're in no_modify mode.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
---

diff --git a/repair/dir2.c b/repair/dir2.c
index 6b8964d..67cd9d1 100644
--- a/repair/dir2.c
+++ b/repair/dir2.c
@@ -1468,6 +1468,7 @@ _("bad .. entry in root directory inode %" PRIu64 ", was 
%" PRIu64 ": "),
                                        } else {
                                                do_warn(_("would correct\n"));
                                        }
+                                       *parent = ino;
                                }
                        }
                        /*

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