gfs2-utils: master - fsck.gfs2: link.c should log why it's making a change for debugging

Bob Peterson rpeterso at fedoraproject.org
Tue Jan 26 21:09:52 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/gfs2-utils.git?p=gfs2-utils.git;a=commitdiff;h=15ab396220635427dacc678160246ec8d19d8624
Commit:        15ab396220635427dacc678160246ec8d19d8624
Parent:        1bb9a56fe54da70b7439de72fd87dd16c5f4fd18
Author:        Bob Peterson <bob at ganesha.peterson>
AuthorDate:    Fri Jan 22 09:01:15 2010 -0600
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Tue Jan 26 15:09:47 2010 -0600

fsck.gfs2: link.c should log why it's making a change for debugging

This patch helps in debugging directory link problems by logging
the dinode and the reason why the directory link count is being
incremented or decremented.

rhbz#455300
---
 gfs2/fsck/link.c         |   31 +++++++++++++++++++++++--------
 gfs2/fsck/link.h         |    6 ++++--
 gfs2/fsck/lost_n_found.c |   22 ++++++++++++++++------
 gfs2/fsck/pass2.c        |   40 ++++++++++++++++++++++++++++------------
 gfs2/fsck/pass3.c        |    4 ++--
 5 files changed, 73 insertions(+), 30 deletions(-)

diff --git a/gfs2/fsck/link.c b/gfs2/fsck/link.c
index a6b0780..0996fa9 100644
--- a/gfs2/fsck/link.c
+++ b/gfs2/fsck/link.c
@@ -29,21 +29,28 @@ int set_link_count(uint64_t inode_no, uint32_t count)
 	return 0;
 }
 
-int increment_link(struct gfs2_sbd *sbp, uint64_t inode_no)
+int increment_link(uint64_t inode_no, uint64_t referenced_from,
+		   const char *why)
 {
 	struct inode_info *ii = NULL;
 
 	ii = inodetree_find(inode_no);
 	/* If the list has entries, look for one that matches
 	 * inode_no */
-	if(ii) {
+	if (ii) {
 		ii->counted_links++;
-		log_debug( _("Incremented counted links to %u for %"PRIu64" (0x%"
-				  PRIx64 ")\n"), ii->counted_links, inode_no, inode_no);
+		log_debug( _("Directory %lld (0x%llx) incremented counted "
+			     "links to %u for %"PRIu64" (0x%" PRIx64 ") "
+			     "via %s\n"),
+			   (unsigned long long)referenced_from,
+			   (unsigned long long)referenced_from,
+			   ii->counted_links, inode_no, inode_no, why);
 		return 0;
 	}
-	log_debug( _("No match found when incrementing link for %" PRIu64
-			  " (0x%" PRIx64 ")!\n"), inode_no, inode_no);
+	log_debug( _("Ref: %lld (0x%llx) No match found when incrementing "
+		     "link for %" PRIu64 " (0x%" PRIx64 ")!\n"),
+		   (unsigned long long)referenced_from,
+		   (unsigned long long)referenced_from, inode_no, inode_no);
 	/* If no match was found, add a new entry and set its
 	 * counted links to 1 */
 	ii = inodetree_insert(inode_no);
@@ -54,16 +61,24 @@ int increment_link(struct gfs2_sbd *sbp, uint64_t inode_no)
 	return 0;
 }
 
-int decrement_link(struct gfs2_sbd *sbp, uint64_t inode_no)
+int decrement_link(uint64_t inode_no, uint64_t referenced_from,
+		   const char *why)
 {
 	struct inode_info *ii = NULL;
 
 	ii = inodetree_find(inode_no);
 	/* If the list has entries, look for one that matches
 	 * inode_no */
-	log_err( _("Decrementing %"PRIu64" (0x%" PRIx64 ")\n"), inode_no, inode_no);
+	log_err( _("Decrementing %"PRIu64" (0x%" PRIx64 ") to %d\n"),
+		 inode_no, inode_no, ii->counted_links);
 	if(ii) {
 		ii->counted_links--;
+		log_debug( _("Directory %lld (0x%llx) decremented counted "
+			     "links to %u for %"PRIu64" (0x%" PRIx64 ") "
+			     "via %s\n"),
+			   (unsigned long long)referenced_from,
+			   (unsigned long long)referenced_from,
+			   ii->counted_links, inode_no, inode_no, why);
 		return 0;
 	}
 	log_debug( _("No match found when decrementing link for %" PRIu64
diff --git a/gfs2/fsck/link.h b/gfs2/fsck/link.h
index 7446b4a..f890575 100644
--- a/gfs2/fsck/link.h
+++ b/gfs2/fsck/link.h
@@ -2,7 +2,9 @@
 #define _LINK_H
 
 int set_link_count(uint64_t inode_no, uint32_t count);
-int increment_link(struct gfs2_sbd *sbp, uint64_t inode_no);
-int decrement_link(struct gfs2_sbd *sbp, uint64_t inode_no);
+int increment_link(uint64_t inode_no, uint64_t referenced_from,
+		   const char *why);
+int decrement_link(uint64_t inode_no, uint64_t referenced_from,
+		   const char *why);
 
 #endif /* _LINK_H */
diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index 417ddd7..f9cb556 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -48,10 +48,16 @@ int add_inode_to_lf(struct gfs2_inode *ip){
 			 * this */
 			gfs2_blockmap_set(bl, lf_dip->i_di.di_num.no_addr,
 					  gfs2_inode_dir);
-			increment_link(ip->i_sbd,
-						   ip->i_sbd->md.rooti->i_di.di_num.no_addr);
-			increment_link(ip->i_sbd, lf_dip->i_di.di_num.no_addr);
-			increment_link(ip->i_sbd, lf_dip->i_di.di_num.no_addr);
+			/* root inode links to lost+found */
+			increment_link(ip->i_sbd->md.rooti->i_di.di_num.no_addr,
+				       lf_dip->i_di.di_num.no_addr, _("root"));
+			/* lost+found link for '.' from itself */
+			increment_link(lf_dip->i_di.di_num.no_addr,
+				       lf_dip->i_di.di_num.no_addr, "\".\"");
+			/* lost+found link for '..' back to root */
+			increment_link(lf_dip->i_di.di_num.no_addr,
+				       ip->i_sbd->md.rooti->i_di.di_num.no_addr,
+				       "\"..\"");
 		}
 	}
 	if(ip->i_di.di_num.no_addr == lf_dip->i_di.di_num.no_addr) {
@@ -113,9 +119,13 @@ int add_inode_to_lf(struct gfs2_inode *ip){
 
 	dir_add(lf_dip, tmp_name, strlen(tmp_name), &(ip->i_di.di_num),
 		inode_type);
-	increment_link(ip->i_sbd, ip->i_di.di_num.no_addr);
+	/* This inode is linked from lost+found */
+  	increment_link(ip->i_di.di_num.no_addr, lf_dip->i_di.di_num.no_addr,
+		       _("from lost+found"));
+	/* If it's a directory, lost+found is back-linked to it via .. */
 	if(S_ISDIR(ip->i_di.di_mode))
-		increment_link(ip->i_sbd, lf_dip->i_di.di_num.no_addr);
+		increment_link(lf_dip->i_di.di_num.no_addr,
+			       ip->i_di.di_mode, _("to lost+found"));
 
 	log_notice( _("Added inode #%llu to lost+found dir\n"),
 		    (unsigned long long)ip->i_di.di_num.no_addr);
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index c4e5d17..184014c 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -379,7 +379,9 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 				/* FIXME: Should we continue on here
 				 * and check the rest of the '.'
 				 * entry? */
-				increment_link(sbp, entryblock);
+				increment_link(entryblock,
+					       ip->i_di.di_num.no_addr,
+					       _("valid reference"));
 				(*count)++;
 				ds->entry_count++;
 				return 0;
@@ -414,7 +416,9 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 				log_err( _("Invalid '.' reference remains\n"));
 				/* Not setting ds->dotdir here since
 				 * this '.' entry is invalid */
-				increment_link(sbp, entryblock);
+				increment_link(entryblock,
+					       ip->i_di.di_num.no_addr,
+					       _("valid reference"));
 				(*count)++;
 				ds->entry_count++;
 				return 0;
@@ -422,7 +426,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 		}
 
 		ds->dotdir = 1;
-		increment_link(sbp, entryblock);
+		increment_link(entryblock, ip->i_di.di_num.no_addr,
+			       _("valid reference"));
 		(*count)++;
 		ds->entry_count++;
 
@@ -449,7 +454,9 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 				/* FIXME: Should we continue on here
 				 * and check the rest of the '..'
 				 * entry? */
-				increment_link(sbp, entryblock);
+				increment_link(entryblock,
+					       ip->i_di.di_num.no_addr,
+					       _("valid reference"));
 				(*count)++;
 				ds->entry_count++;
 				return 0;
@@ -472,7 +479,9 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 				return 1;
 			} else {
 				log_err( _("Bad '..' directory entry remains\n"));
-				increment_link(sbp, entryblock);
+				increment_link(entryblock,
+					       ip->i_di.di_num.no_addr,
+					       _("valid reference"));
 				(*count)++;
 				ds->entry_count++;
 				return 0;
@@ -489,7 +498,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 		}
 
 		ds->dotdotdir = 1;
-		increment_link(sbp, entryblock);
+		increment_link(entryblock, ip->i_di.di_num.no_addr,
+			       _("valid reference"));
 		(*count)++;
 		ds->entry_count++;
 		return 0;
@@ -498,7 +508,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 	/* After this point we're only concerned with directories */
 	if(q != gfs2_inode_dir) {
 		log_debug( _("Found non-dir inode dentry\n"));
-		increment_link(sbp, entryblock);
+		increment_link(entryblock, ip->i_di.di_num.no_addr,
+			       _("valid reference"));
 		(*count)++;
 		ds->entry_count++;
 		return 0;
@@ -526,7 +537,8 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 		stack;
 		return -1;
 	}
-	increment_link(sbp, entryblock);
+	increment_link(entryblock, ip->i_di.di_num.no_addr,
+		       _("valid reference"));
 	(*count)++;
 	ds->entry_count++;
 	/* End of checks */
@@ -603,8 +615,10 @@ static int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
 			log_warn( _("Adding '.' entry\n"));
 			dir_add(sysinode, filename, filename_len,
 				&(sysinode->i_di.di_num), DT_DIR);
-			increment_link(sysinode->i_sbd,
-				       sysinode->i_di.di_num.no_addr);
+			/* This system inode is linked to itself via '.' */
+			increment_link(sysinode->i_di.di_num.no_addr,
+				       sysinode->i_di.di_num.no_addr,
+				       "sysinode \".\"");
 			ds.entry_count++;
 			free(filename);
 		} else
@@ -783,8 +797,10 @@ int pass2(struct gfs2_sbd *sbp)
 
 				dir_add(ip, filename, filename_len,
 					&(ip->i_di.di_num), DT_DIR);
-				increment_link(ip->i_sbd,
-					       ip->i_di.di_num.no_addr);
+				/* directory links to itself via '.' */
+				increment_link(ip->i_di.di_num.no_addr,
+					       ip->i_di.di_num.no_addr,
+					       _("\". (itself)\""));
 				ds.entry_count++;
 				free(filename);
 				log_err( _("The directory was fixed.\n"));
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index ab01b39..0e8f40b 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -51,9 +51,9 @@ static int attach_dotdot_to(struct gfs2_sbd *sbp, uint64_t newdotdot,
 	if(gfs2_dirent_del(ip, filename, filename_len))
 		log_warn( _("Unable to remove \"..\" directory entry.\n"));
 	else
-		decrement_link(sbp, olddotdot);
+		decrement_link(olddotdot, block, _("old \"..\""));
 	dir_add(ip, filename, filename_len, &pip->i_di.di_num, DT_DIR);
-	increment_link(sbp, newdotdot);
+	increment_link(newdotdot, block, _("new \"..\""));
 	bmodified(ip->i_bh);
 	fsck_inode_put(&ip);
 	fsck_inode_put(&pip);


More information about the cluster-commits mailing list