]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
UBIFS: respect MS_SILENT mount flag
authorDaniel Golle <daniel@makrotopia.org>
Mon, 2 Jun 2014 13:51:10 +0000 (15:51 +0200)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Mon, 2 Jun 2014 15:00:52 +0000 (18:00 +0300)
When attempting to mount a non-ubifs formatted volume, lots of error
messages (including a stack dump) are thrown to the kernel log even if
the MS_SILENT mount flag is set.
Fix this by introducing adding an additional state-variable in
struct ubifs_info and suppress error messages in ubifs_read_node if
MS_SILENT is set.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
fs/ubifs/io.c
fs/ubifs/super.c
fs/ubifs/ubifs.h

index e18b9889a51b77622b19c927bc9f98f4d49221e3..2290d5866725b1cb52543e25aca22680a13b54b1 100644 (file)
@@ -988,30 +988,32 @@ int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len,
                return err;
 
        if (type != ch->node_type) {
-               ubifs_err("bad node type (%d but expected %d)",
-                         ch->node_type, type);
+               ubifs_errc(c, "bad node type (%d but expected %d)",
+                          ch->node_type, type);
                goto out;
        }
 
        err = ubifs_check_node(c, buf, lnum, offs, 0, 0);
        if (err) {
-               ubifs_err("expected node type %d", type);
+               ubifs_errc(c, "expected node type %d", type);
                return err;
        }
 
        l = le32_to_cpu(ch->len);
        if (l != len) {
-               ubifs_err("bad node length %d, expected %d", l, len);
+               ubifs_errc(c, "bad node length %d, expected %d", l, len);
                goto out;
        }
 
        return 0;
 
 out:
-       ubifs_err("bad node at LEB %d:%d, LEB mapping status %d", lnum, offs,
-                 ubi_is_mapped(c->ubi, lnum));
-       ubifs_dump_node(c, buf);
-       dump_stack();
+       ubifs_errc(c, "bad node at LEB %d:%d, LEB mapping status %d", lnum,
+                  offs, ubi_is_mapped(c->ubi, lnum));
+       if (!c->probing) {
+               ubifs_dump_node(c, buf);
+               dump_stack();
+       }
        return -EINVAL;
 }
 
index a81c7b556896115a4afbdea5452523057ccd195f..3904c8574ef931dda6473123ff6299f9c5c513b8 100644 (file)
@@ -1149,6 +1149,9 @@ static int mount_ubifs(struct ubifs_info *c)
        size_t sz;
 
        c->ro_mount = !!(c->vfs_sb->s_flags & MS_RDONLY);
+       /* Suppress error messages while probing if MS_SILENT is set */
+       c->probing = !!(c->vfs_sb->s_flags & MS_SILENT);
+
        err = init_constants_early(c);
        if (err)
                return err;
@@ -1214,6 +1217,8 @@ static int mount_ubifs(struct ubifs_info *c)
        if (err)
                goto out_free;
 
+       c->probing = 0;
+
        /*
         * Make sure the compressor which is set as default in the superblock
         * or overridden by mount options is actually compiled in.
index e8c8cfe1435c5cd05809404ea4de182741cd3bf4..c1f71fe17cc00e72212bf84033117581a5dd04f3 100644 (file)
 #define ubifs_warn(fmt, ...)                                        \
        pr_warn("UBIFS warning (pid %d): %s: " fmt "\n",            \
                current->pid, __func__, ##__VA_ARGS__)
+/*
+ * A variant of 'ubifs_err()' which takes the UBIFS file-sytem description
+ * object as an argument.
+ */
+#define ubifs_errc(c, fmt, ...)                                     \
+       do {                                                        \
+               if (!(c)->probing)                                  \
+                       ubifs_err(fmt, ##__VA_ARGS__);              \
+       } while (0)
 
 /* UBIFS file system VFS magic number */
 #define UBIFS_SUPER_MAGIC 0x24051905
@@ -1209,6 +1218,7 @@ struct ubifs_debug_info;
  * @need_recovery: %1 if the file-system needs recovery
  * @replaying: %1 during journal replay
  * @mounting: %1 while mounting
+ * @probing: %1 while attempting to mount if MS_SILENT mount flag is set
  * @remounting_rw: %1 while re-mounting from R/O mode to R/W mode
  * @replay_list: temporary list used during journal replay
  * @replay_buds: list of buds to replay
@@ -1441,6 +1451,7 @@ struct ubifs_info {
        unsigned int replaying:1;
        unsigned int mounting:1;
        unsigned int remounting_rw:1;
+       unsigned int probing:1;
        struct list_head replay_list;
        struct list_head replay_buds;
        unsigned long long cs_sqnum;