Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=aa125b9443ab37... Commit: aa125b9443ab370b9bcfedafe1b0a69e1804f4b3 Parent: 071287645c85a40797d2658d4e0f6cc3a65cf93f Author: Bob Peterson rpeterso@redhat.com AuthorDate: Thu Jan 12 14:18:13 2012 -0600 Committer: Bob Peterson rpeterso@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. */
cluster-commits@lists.fedorahosted.org