cluster: RHEL510 - fsck.gfs2: Fix initialization error return codes

Bob Peterson rpeterso at fedoraproject.org
Fri Apr 5 13:46:30 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=aa125b9443ab370b9bcfedafe1b0a69e1804f4b3
Commit:        aa125b9443ab370b9bcfedafe1b0a69e1804f4b3
Parent:        071287645c85a40797d2658d4e0f6cc3a65cf93f
Author:        Bob Peterson <rpeterso at redhat.com>
AuthorDate:    Thu Jan 12 14:18:13 2012 -0600
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Fri Apr 5 06:25:01 2013 -0700

fsck.gfs2: Fix initialization error return codes

In initialize.c there are several places where it can exit with an error.
These places return with -1 where they should return the standard fsck
error FSCK_ERROR.

rhbz#877150
---
 gfs2/fsck/initialize.c |   85 +++++++++++++++++++++++++++++++++++------------
 1 files changed, 63 insertions(+), 22 deletions(-)

diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 537cae5..fc4fdec 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -454,13 +454,13 @@ static void lookup_per_node(struct gfs2_sbd *sdp, int allow_rebuild)
 		if (err) {
 			log_crit(_("Error rebuilding per_node directory: %s\n"),
 				 strerror(err));
-			exit(-1);
+			exit(FSCK_ERROR);
 		}
 	}
 	gfs2_lookupi(sdp->master_dir, "per_node", 8, &sdp->md.pinode);
 	if (!sdp->md.pinode) {
 		log_err( _("Unable to rebuild per_node; aborting.\n"));
-		exit(-1);
+		exit(FSCK_ERROR);
 	}
 }
 
@@ -555,24 +555,52 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
 	/* Look for "inum" entry in master dinode */
 	gfs2_lookupi(sdp->master_dir, "inum", 4, &sdp->md.inum);
 	if (!sdp->md.inum) {
-		if (query( _("The gfs2 system inum inode is missing. "
-			     "Okay to rebuild it? (y/n) ")))
-			build_inum(sdp);
+		if (!query( _("The gfs2 system inum inode is missing. "
+			      "Okay to rebuild it? (y/n) "))) {
+			log_err( _("fsck.gfs2 cannot continue without "
+				   "a valid inum file; aborting.\n"));
+			goto fail;
+		}
+		err = build_inum(sdp);
+		if (err) {
+			log_crit(_("Error rebuilding inum inode: %s\n"),
+				 strerror(err));
+			exit(FSCK_ERROR);
+		}
+		gfs2_lookupi(sdp->master_dir, "inum", 4,
+			     &sdp->md.inum);
+		if (!sdp->md.inum) {
+			log_crit("System inum inode was not rebuilt.  "
+				 "Aborting.\n");
+			goto fail;
+		}
 	}
 	/* Read inum entry into buffer */
-	gfs2_readi(sdp->md.inum, &inumbuf, 0, sdp->md.inum->i_di.di_size);
+	gfs2_readi(sdp->md.inum, &inumbuf, 0,
+		   sdp->md.inum->i_di.di_size);
 	/* call gfs2_inum_range_in() to retrieve range */
 	sdp->md.next_inum = be64_to_cpu(inumbuf);
 
 	gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
 	if (!sdp->md.statfs) {
-		if (query( _("The gfs2 system statfs inode is missing. "
-			     "Okay to rebuild it? (y/n) ")))
-			build_statfs(sdp);
-		else {
-			log_err( _("fsck.gfs2 cannot continue without a "
-				   "valid statfs file; aborting.\n"));
-			return FSCK_ERROR;
+		if (!query( _("The gfs2 system statfs inode is missing. "
+			      "Okay to rebuild it? (y/n) "))) {
+			log_err( _("fsck.gfs2 cannot continue without a valid "
+				   "statfs file; aborting.\n"));
+			goto fail;
+		}
+		err = build_statfs(sdp);
+		if (err) {
+			log_crit(_("Error rebuilding statfs inode: %s\n"),
+				 strerror(err));
+			exit(FSCK_ERROR);
+		}
+		gfs2_lookupi(sdp->master_dir, "statfs", 6, &sdp->md.statfs);
+		if (!sdp->md.statfs) {
+			log_err( _("Rebuild of statfs system file failed."));
+			log_err( _("fsck.gfs2 cannot continue without "
+				   "a valid statfs file; aborting.\n"));
+			goto fail;
 		}
 		do_init_statfs(sdp);
 	}
@@ -589,9 +617,24 @@ static int init_system_inodes(struct gfs2_sbd *sdp)
 
 	gfs2_lookupi(sdp->master_dir, "quota", 5, &sdp->md.qinode);
 	if (!sdp->md.qinode) {
-		if (query( _("The gfs2 system quota inode is missing. "
-			     "Okay to rebuild it? (y/n) ")))
-			build_quota(sdp);
+		if (!query( _("The gfs2 system quota inode is missing. "
+			      "Okay to rebuild it? (y/n) "))) {
+			log_crit("System quota inode was not "
+				 "rebuilt.  Aborting.\n");
+			goto fail;
+		}
+		err = build_quota(sdp);
+		if (err) {
+			log_crit(_("Error rebuilding quota inode: %s\n"),
+				 strerror(err));
+			exit(FSCK_ERROR);
+		}
+		gfs2_lookupi(sdp->master_dir, "quota", 5, &sdp->md.qinode);
+		if (!sdp->md.qinode) {
+			log_crit("Unable to rebuild system quota file "
+				 "inode.  Aborting.\n");
+			goto fail;
+		}
 	}
 
 	/* Try to lookup the per_node inode.  If it was missing, it is now
@@ -1079,6 +1122,8 @@ static int sb_repair(struct gfs2_sbd *sdp)
  */
 static int fill_super_block(struct gfs2_sbd *sdp)
 {
+	int ret;
+
 	sync();
 
 	/********************************************************************
@@ -1100,12 +1145,8 @@ static int fill_super_block(struct gfs2_sbd *sdp)
 	}
 
 	compute_constants(sdp);
-	if (read_sb(sdp) < 0) {
-		/* First, check for a gfs1 (not gfs2) file system */
-		if (sdp->sd_sb.sb_header.mh_magic == GFS2_MAGIC &&
-		    sdp->sd_sb.sb_header.mh_type == GFS2_METATYPE_SB)
-			return -1; /* This is gfs1, don't try to repair */
-		/* It's not a "sane" gfs1 fs so try to repair it */
+	ret = read_sb(sdp);
+	if (ret < 0) {
 		if (sb_repair(sdp) != 0)
 			return -1; /* unrepairable, so exit */
 		/* Now that we've tried to repair it, re-read it. */


More information about the cluster-commits mailing list