enum lockdep_ok lockdep_ok)
 {
        add_taint(flag, lockdep_ok);
-       mod->taints |= (1U << flag);
+       set_bit(flag, &mod->taints);
 }
 
 /*
 static size_t module_flags_taint(struct module *mod, char *buf)
 {
        size_t l = 0;
+       int i;
+
+       for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
+               if (taint_flags[i].module && test_bit(i, &mod->taints))
+                       buf[l++] = taint_flags[i].true;
+       }
 
-       if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE))
-               buf[l++] = 'P';
-       if (mod->taints & (1 << TAINT_OOT_MODULE))
-               buf[l++] = 'O';
-       if (mod->taints & (1 << TAINT_FORCED_MODULE))
-               buf[l++] = 'F';
-       if (mod->taints & (1 << TAINT_CRAP))
-               buf[l++] = 'C';
-       if (mod->taints & (1 << TAINT_UNSIGNED_MODULE))
-               buf[l++] = 'E';
-       if (mod->taints & (1 << TAINT_LIVEPATCH))
-               buf[l++] = 'K';
-       /*
-        * TAINT_FORCED_RMMOD: could be added.
-        * TAINT_CPU_OUT_OF_SPEC, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
-        * apply to modules.
-        */
        return l;
 }
 
 }
 #endif /* CONFIG_KALLSYMS */
 
+/* Maximum number of characters written by module_flags() */
+#define MODULE_FLAGS_BUF_SIZE (TAINT_FLAGS_COUNT + 4)
+
+/* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */
 static char *module_flags(struct module *mod, char *buf)
 {
        int bx = 0;
 static int m_show(struct seq_file *m, void *p)
 {
        struct module *mod = list_entry(p, struct module, list);
-       char buf[8];
+       char buf[MODULE_FLAGS_BUF_SIZE];
 
        /* We always ignore unformed modules. */
        if (mod->state == MODULE_STATE_UNFORMED)
 void print_modules(void)
 {
        struct module *mod;
-       char buf[8];
+       char buf[MODULE_FLAGS_BUF_SIZE];
 
        printk(KERN_DEFAULT "Modules linked in:");
        /* Most callers should already have preempt disabled, but make sure */
 
 
 EXPORT_SYMBOL(panic);
 
-
-struct tnt {
-       u8      bit;
-       char    true;
-       char    false;
-};
-
-static const struct tnt tnts[] = {
-       { TAINT_PROPRIETARY_MODULE,     'P', 'G' },
-       { TAINT_FORCED_MODULE,          'F', ' ' },
-       { TAINT_CPU_OUT_OF_SPEC,        'S', ' ' },
-       { TAINT_FORCED_RMMOD,           'R', ' ' },
-       { TAINT_MACHINE_CHECK,          'M', ' ' },
-       { TAINT_BAD_PAGE,               'B', ' ' },
-       { TAINT_USER,                   'U', ' ' },
-       { TAINT_DIE,                    'D', ' ' },
-       { TAINT_OVERRIDDEN_ACPI_TABLE,  'A', ' ' },
-       { TAINT_WARN,                   'W', ' ' },
-       { TAINT_CRAP,                   'C', ' ' },
-       { TAINT_FIRMWARE_WORKAROUND,    'I', ' ' },
-       { TAINT_OOT_MODULE,             'O', ' ' },
-       { TAINT_UNSIGNED_MODULE,        'E', ' ' },
-       { TAINT_SOFTLOCKUP,             'L', ' ' },
-       { TAINT_LIVEPATCH,              'K', ' ' },
+/*
+ * TAINT_FORCED_RMMOD could be a per-module flag but the module
+ * is being removed anyway.
+ */
+const struct taint_flag taint_flags[TAINT_FLAGS_COUNT] = {
+       { 'P', 'G', true },     /* TAINT_PROPRIETARY_MODULE */
+       { 'F', ' ', true },     /* TAINT_FORCED_MODULE */
+       { 'S', ' ', false },    /* TAINT_CPU_OUT_OF_SPEC */
+       { 'R', ' ', false },    /* TAINT_FORCED_RMMOD */
+       { 'M', ' ', false },    /* TAINT_MACHINE_CHECK */
+       { 'B', ' ', false },    /* TAINT_BAD_PAGE */
+       { 'U', ' ', false },    /* TAINT_USER */
+       { 'D', ' ', false },    /* TAINT_DIE */
+       { 'A', ' ', false },    /* TAINT_OVERRIDDEN_ACPI_TABLE */
+       { 'W', ' ', false },    /* TAINT_WARN */
+       { 'C', ' ', true },     /* TAINT_CRAP */
+       { 'I', ' ', false },    /* TAINT_FIRMWARE_WORKAROUND */
+       { 'O', ' ', true },     /* TAINT_OOT_MODULE */
+       { 'E', ' ', true },     /* TAINT_UNSIGNED_MODULE */
+       { 'L', ' ', false },    /* TAINT_SOFTLOCKUP */
+       { 'K', ' ', true },     /* TAINT_LIVEPATCH */
 };
 
 /**
  */
 const char *print_tainted(void)
 {
-       static char buf[ARRAY_SIZE(tnts) + sizeof("Tainted: ")];
+       static char buf[TAINT_FLAGS_COUNT + sizeof("Tainted: ")];
 
        if (tainted_mask) {
                char *s;
                int i;
 
                s = buf + sprintf(buf, "Tainted: ");
-               for (i = 0; i < ARRAY_SIZE(tnts); i++) {
-                       const struct tnt *t = &tnts[i];
-                       *s++ = test_bit(t->bit, &tainted_mask) ?
+               for (i = 0; i < TAINT_FLAGS_COUNT; i++) {
+                       const struct taint_flag *t = &taint_flags[i];
+                       *s++ = test_bit(i, &tainted_mask) ?
                                        t->true : t->false;
                }
                *s = 0;