ubifs: Allow setting assert action as mount parameter
authorRichard Weinberger <richard@nod.at>
Thu, 12 Jul 2018 11:01:59 +0000 (13:01 +0200)
committerRichard Weinberger <richard@nod.at>
Tue, 14 Aug 2018 22:25:21 +0000 (00:25 +0200)
Expose our three options to userspace.

Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/misc.c
fs/ubifs/misc.h
fs/ubifs/super.c

index 586fd5b..cd23de0 100644 (file)
@@ -56,3 +56,14 @@ void ubifs_warn(const struct ubifs_info *c, const char *fmt, ...)
 
        va_end(args);
 }
+
+static char *assert_names[] = {
+       [ASSACT_REPORT] = "report",
+       [ASSACT_RO] = "read-only",
+       [ASSACT_PANIC] = "panic",
+};
+
+const char *ubifs_assert_action_name(struct ubifs_info *c)
+{
+       return assert_names[c->assert_action];
+}
index f5d180c..21d35d7 100644 (file)
@@ -287,4 +287,6 @@ static inline int ubifs_next_log_lnum(const struct ubifs_info *c, int lnum)
        return lnum;
 }
 
+const char *ubifs_assert_action_name(struct ubifs_info *c);
+
 #endif /* __UBIFS_MISC_H__ */
index df73b0e..c31e7b4 100644 (file)
@@ -445,6 +445,7 @@ static int ubifs_show_options(struct seq_file *s, struct dentry *root)
                           ubifs_compr_name(c, c->mount_opts.compr_type));
        }
 
+       seq_printf(s, ",assert=%s", ubifs_assert_action_name(c));
        seq_printf(s, ",ubi=%d,vol=%d", c->vi.ubi_num, c->vi.vol_id);
 
        return 0;
@@ -922,6 +923,7 @@ static int check_volume_empty(struct ubifs_info *c)
  * Opt_chk_data_crc: check CRCs when reading data nodes
  * Opt_no_chk_data_crc: do not check CRCs when reading data nodes
  * Opt_override_compr: override default compressor
+ * Opt_assert: set ubifs_assert() action
  * Opt_err: just end of array marker
  */
 enum {
@@ -932,6 +934,7 @@ enum {
        Opt_chk_data_crc,
        Opt_no_chk_data_crc,
        Opt_override_compr,
+       Opt_assert,
        Opt_ignore,
        Opt_err,
 };
@@ -946,6 +949,7 @@ static const match_table_t tokens = {
        {Opt_override_compr, "compr=%s"},
        {Opt_ignore, "ubi=%s"},
        {Opt_ignore, "vol=%s"},
+       {Opt_assert, "assert=%s"},
        {Opt_err, NULL},
 };
 
@@ -1046,6 +1050,26 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options,
                        c->default_compr = c->mount_opts.compr_type;
                        break;
                }
+               case Opt_assert:
+               {
+                       char *act = match_strdup(&args[0]);
+
+                       if (!act)
+                               return -ENOMEM;
+                       if (!strcmp(act, "report"))
+                               c->assert_action = ASSACT_REPORT;
+                       else if (!strcmp(act, "read-only"))
+                               c->assert_action = ASSACT_RO;
+                       else if (!strcmp(act, "panic"))
+                               c->assert_action = ASSACT_PANIC;
+                       else {
+                               ubifs_err(c, "unknown assert action \"%s\"", act);
+                               kfree(act);
+                               return -EINVAL;
+                       }
+                       kfree(act);
+                       break;
+               }
                case Opt_ignore:
                        break;
                default: