GFS2: Add "-o errors=panic|withdraw" mount options
[safe/jmp/linux-2.6] / fs / gfs2 / super.c
index 85bd2bc..7a5c128 100644 (file)
@@ -68,6 +68,8 @@ enum {
        Opt_discard,
        Opt_nodiscard,
        Opt_commit,
+       Opt_err_withdraw,
+       Opt_err_panic,
        Opt_error,
 };
 
@@ -97,6 +99,8 @@ static const match_table_t tokens = {
        {Opt_discard, "discard"},
        {Opt_nodiscard, "nodiscard"},
        {Opt_commit, "commit=%d"},
+       {Opt_err_withdraw, "errors=withdraw"},
+       {Opt_err_panic, "errors=panic"},
        {Opt_error, NULL}
 };
 
@@ -152,6 +156,11 @@ int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *options)
                        args->ar_localcaching = 1;
                        break;
                case Opt_debug:
+                       if (args->ar_errors == GFS2_ERRORS_PANIC) {
+                               fs_info(sdp, "-o debug and -o errors=panic "
+                                      "are mutually exclusive.\n");
+                               return -EINVAL;
+                       }
                        args->ar_debug = 1;
                        break;
                case Opt_nodebug:
@@ -205,6 +214,17 @@ int gfs2_mount_args(struct gfs2_sbd *sdp, struct gfs2_args *args, char *options)
                                return rv ? rv : -EINVAL;
                        }
                        break;
+               case Opt_err_withdraw:
+                       args->ar_errors = GFS2_ERRORS_WITHDRAW;
+                       break;
+               case Opt_err_panic:
+                       if (args->ar_debug) {
+                               fs_info(sdp, "-o debug and -o errors=panic "
+                                       "are mutually exclusive.\n");
+                               return -EINVAL;
+                       }
+                       args->ar_errors = GFS2_ERRORS_PANIC;
+                       break;
                case Opt_error:
                default:
                        fs_info(sdp, "invalid mount option: %s\n", o);
@@ -1226,6 +1246,22 @@ static int gfs2_show_options(struct seq_file *s, struct vfsmount *mnt)
        lfsecs = sdp->sd_tune.gt_log_flush_secs;
        if (lfsecs != 60)
                seq_printf(s, ",commit=%d", lfsecs);
+       if (args->ar_errors != GFS2_ERRORS_DEFAULT) {
+               const char *state;
+
+               switch (args->ar_errors) {
+               case GFS2_ERRORS_WITHDRAW:
+                       state = "withdraw";
+                       break;
+               case GFS2_ERRORS_PANIC:
+                       state = "panic";
+                       break;
+               default:
+                       state = "unknown";
+                       break;
+               }
+               seq_printf(s, ",errors=%s", state);
+       }
        return 0;
 }