>From 4e664f2ae4ee2d58469a83216a2e049a614b2964 Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <[email protected]>
Date: Thu, 15 Dec 2011 11:29:45 +0000
Subject: [PATCH 2/2] fsck.gfs2: Clean up pass calling code

There was a lot of repeated code for running each pass
of fsck. This cleans it up into a single function that
is called once for each pass.

Signed-off-by: Steven Whitehouse <[email protected]>
---
 gfs2/fsck/main.c |  145 +++++++++++++++++-------------------------------------
 1 files changed, 45 insertions(+), 100 deletions(-)

diff --git a/gfs2/fsck/main.c b/gfs2/fsck/main.c
index aa354ad..9c3b06d 100644
--- a/gfs2/fsck/main.c
+++ b/gfs2/fsck/main.c
@@ -147,7 +147,7 @@ static void interrupt(int sig)
        }
 }
 
-static void check_statfs(struct gfs2_sbd *sdp)
+static int check_statfs(struct gfs2_sbd *sdp)
 {
        struct osi_node *n, *next = NULL;
        struct rgrp_tree *rgd;
@@ -158,7 +158,7 @@ static void check_statfs(struct gfs2_sbd *sdp)
 
        if (sdp->gfs1 && !sdp->md.statfs->i_di.di_size) {
                log_info("This GFS1 file system is not using fast_statfs.\n");
-               return;
+               return 0;
        }
        /* Read the current statfs values */
        count = gfs2_readi(sdp->md.statfs, buf, 0,
@@ -185,7 +185,7 @@ static void check_statfs(struct gfs2_sbd *sdp)
            sc.sc_free == (sdp->blks_total - sdp->blks_alloced) &&
            sc.sc_dinodes == sdp->dinodes_alloced) {
                log_info( _("The statfs file is accurate.\n"));
-               return;
+               return 0;
        }
        log_err( _("The statfs file is wrong:\n\n"));
        log_err( _("Current statfs values:\n"));
@@ -213,12 +213,50 @@ static void check_statfs(struct gfs2_sbd *sdp)
        errors_found++;
        if (!query( _("Okay to fix the master statfs file? (y/n)"))) {
                log_err( _("The statfs file was not fixed.\n"));
-               return;
+               return 0;
        }
 
        do_init_statfs(sdp);
        log_err( _("The statfs file was fixed.\n"));
        errors_corrected++;
+       return 0;
+}
+
+struct fsck_pass {
+       const char *name;
+       int (*f)(struct gfs2_sbd *sdp);
+};
+
+static const struct fsck_pass passes[] = {
+       { .name = "pass1",  .f = pass1 },
+       { .name = "pass1b", .f = pass1b },
+       { .name = "pass1c", .f = pass1c },
+       { .name = "pass2",  .f = pass2 },
+       { .name = "pass3",  .f = pass3 },
+       { .name = "pass4",  .f = pass4 },
+       { .name = "pass5",  .f = pass5 },
+       { .name = "check_statfs", .f = check_statfs },
+       { .name = NULL, }
+};
+
+static int fsck_pass(const struct fsck_pass *p, struct gfs2_sbd *sdp)
+{
+       int ret;
+
+       if (fsck_abort)
+               return FSCK_CANCELED;
+       pass = p->name;
+       log_notice( _("Starting %s\n"), p->name);
+       ret = p->f(sdp);
+       if (ret)
+               exit(ret);
+       if (skip_this_pass || fsck_abort) {
+               skip_this_pass = 0;
+               log_notice( _("%s interrupted   \n"), p->name);
+               return FSCK_CANCELED;
+       }
+       log_notice( _("%s complete      \n"), p->name);
+       return 0;
 }
 
 int main(int argc, char **argv)
@@ -226,6 +264,7 @@ int main(int argc, char **argv)
        struct gfs2_sbd sb;
        struct gfs2_sbd *sdp = &sb;
        int j;
+       int i;
        int error = 0;
        int all_clean = 0;
        struct sigaction act = { .sa_handler = interrupt, };
@@ -250,102 +289,8 @@ int main(int argc, char **argv)
 
        sigaction(SIGINT, &act, NULL);
 
-       log_notice( _("Starting pass1\n"));
-       pass = "pass 1";
-       last_reported_block = 0;
-       if ((error = pass1(sdp)))
-               exit(error);
-       if (skip_this_pass || fsck_abort) {
-               skip_this_pass = FALSE;
-               log_notice( _("Pass1 interrupted   \n"));
-       }
-       else
-               log_notice( _("Pass1 complete      \n"));
-
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 1b";
-               log_notice( _("Starting pass1b\n"));
-               if ((error = pass1b(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass1b interrupted   \n"));
-               }
-               else
-                       log_notice( _("Pass1b complete\n"));
-       }
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 1c";
-               log_notice( _("Starting pass1c\n"));
-               if ((error = pass1c(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass1c interrupted   \n"));
-               }
-               else
-                       log_notice( _("Pass1c complete\n"));
-       }
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 2";
-               log_notice( _("Starting pass2\n"));
-               if ((error = pass2(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass2 interrupted   \n"));
-               }
-               else
-                       log_notice( _("Pass2 complete      \n"));
-       }
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 3";
-               log_notice( _("Starting pass3\n"));
-               if ((error = pass3(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass3 interrupted   \n"));
-               }
-               else
-                       log_notice( _("Pass3 complete      \n"));
-       }
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 4";
-               log_notice( _("Starting pass4\n"));
-               if ((error = pass4(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass4 interrupted   \n"));
-               }
-               else
-                       log_notice( _("Pass4 complete      \n"));
-       }
-       if (!fsck_abort) {
-               last_reported_block = 0;
-               pass = "pass 5";
-               log_notice( _("Starting pass5\n"));
-               if ((error = pass5(sdp)))
-                       exit(error);
-               if (skip_this_pass || fsck_abort) {
-                       skip_this_pass = FALSE;
-                       log_notice( _("Pass5 interrupted   \n"));
-                       error = FSCK_CANCELED;
-               }
-               else
-                       log_notice( _("Pass5 complete      \n"));
-       } else {
-               error = FSCK_CANCELED;
-       }
-
-       if (!fsck_abort)
-               check_statfs(sdp);
+       for (i = 0; passes[i].name; i++)
+               error = fsck_pass(passes + i, sdp);
 
        /* Free up our system inodes */
        if (!sdp->gfs1)
-- 
1.7.4.4



Reply via email to