cluster: RHEL6 - fsck.gfs2: Check for formal inode mismatch when adding to lost+found

Bob Peterson rpeterso at fedoraproject.org
Tue May 21 12:23:00 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=872b99e0a2569404c49f4483260b5a1b8023d372
Commit:        872b99e0a2569404c49f4483260b5a1b8023d372
Parent:        1325bb4d27bffbcaa5c2170bb1300d8e2c3a9807
Author:        Bob Peterson <rpeterso at redhat.com>
AuthorDate:    Wed Mar 6 10:28:20 2013 -0700
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Fri May 17 14:56:44 2013 -0500

fsck.gfs2: Check for formal inode mismatch when adding to lost+found

This patch adds a check to the code that adds inodes to lost+found
so that dinodes with formal inode mismatches are logged, but not added.

rhbz#902920
---
 gfs2/fsck/lost_n_found.c |   44 ++++++++++++++++++++++++++++----------------
 1 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index 751cbd8..42d97ee 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -38,24 +38,36 @@ static void add_dotdot(struct gfs2_inode *ip)
 			  (unsigned long long)ip->i_di.di_num.no_addr,
 			  (unsigned long long)di->dotdot_parent.no_addr,
 			  (unsigned long long)di->dotdot_parent.no_addr);
-		decr_link_count(di->dotdot_parent.no_addr,
-				ip->i_di.di_num.no_addr,
-				_(".. unlinked, moving to lost+found"));
 		dip = fsck_load_inode(sdp, di->dotdot_parent.no_addr);
-		if (dip->i_di.di_nlink > 0) {
-			dip->i_di.di_nlink--;
-			set_di_nlink(dip); /* keep inode tree in sync */
-			log_debug(_("Decrementing its links to %d\n"),
-				  dip->i_di.di_nlink);
-			bmodified(dip->i_bh);
-		} else if (!dip->i_di.di_nlink) {
-			log_debug(_("Its link count is zero.\n"));
+		if (dip->i_di.di_num.no_formal_ino ==
+		    di->dotdot_parent.no_formal_ino) {
+			decr_link_count(di->dotdot_parent.no_addr,
+					ip->i_di.di_num.no_addr,
+					_(".. unlinked, moving to lost+found"));
+			if (dip->i_di.di_nlink > 0) {
+			  dip->i_di.di_nlink--;
+			  set_di_nlink(dip); /* keep inode tree in sync */
+			  log_debug(_("Decrementing its links to %d\n"),
+				    dip->i_di.di_nlink);
+			  bmodified(dip->i_bh);
+			} else if (!dip->i_di.di_nlink) {
+			  log_debug(_("Its link count is zero.\n"));
+			} else {
+			  log_debug(_("Its link count is %d!  Changing "
+				      "it to 0.\n"), dip->i_di.di_nlink);
+			  dip->i_di.di_nlink = 0;
+			  set_di_nlink(dip); /* keep inode tree in sync */
+			  bmodified(dip->i_bh);
+			}
 		} else {
-			log_debug(_("Its link count is %d!  Changing "
-				    "it to 0.\n"), dip->i_di.di_nlink);
-			dip->i_di.di_nlink = 0;
-			set_di_nlink(dip); /* keep inode tree in sync */
-			bmodified(dip->i_bh);
+			log_debug(_("Directory (0x%llx)'s link to parent "
+				    "(0x%llx) had a formal inode discrepancy: "
+				    "was 0x%llx, expected 0x%llx\n"),
+				  (unsigned long long)ip->i_di.di_num.no_addr,
+				  (unsigned long long)di->dotdot_parent.no_addr,
+				  di->dotdot_parent.no_formal_ino,
+				  dip->i_di.di_num.no_formal_ino);
+			log_debug(_("The parent directory was not changed.\n"));
 		}
 		fsck_inode_put(&dip);
 		di = NULL;


More information about the cluster-commits mailing list