diff options
Diffstat (limited to 'target/linux/generic/patches-3.14/552-ubifs-respect-silent-mount-flag.patch')
-rw-r--r-- | target/linux/generic/patches-3.14/552-ubifs-respect-silent-mount-flag.patch | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.14/552-ubifs-respect-silent-mount-flag.patch b/target/linux/generic/patches-3.14/552-ubifs-respect-silent-mount-flag.patch new file mode 100644 index 0000000000..ab89b98705 --- /dev/null +++ b/target/linux/generic/patches-3.14/552-ubifs-respect-silent-mount-flag.patch @@ -0,0 +1,176 @@ +From 248b89b95d27659c5360ef5b68cca21d096ee909 Mon Sep 17 00:00:00 2001 +From: Daniel Golle <daniel@makrotopia.org> +Date: Sat, 17 May 2014 03:16:54 +0200 +Subject: [PATCH 3/5] ubifs: respect MS_SILENT mount flag +To: dedekind1@gmail.com, + linux-mtd@lists.infradead.org + +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 checking the MS_SILENT flag in ubifs_read_sb_node and +passing it down to ubifs_read_node, which now got an additional +parameter for that purpose. + +Signed-off-by: Daniel Golle <daniel@makrotopia.org> +--- + fs/ubifs/commit.c | 4 ++-- + fs/ubifs/io.c | 23 ++++++++++++++--------- + fs/ubifs/sb.c | 5 +++-- + fs/ubifs/tnc_misc.c | 4 ++-- + fs/ubifs/ubifs.h | 2 +- + 5 files changed, 22 insertions(+), 16 deletions(-) + +diff --git a/fs/ubifs/commit.c b/fs/ubifs/commit.c +index ff82293..865d13f 100644 +--- a/fs/ubifs/commit.c ++++ b/fs/ubifs/commit.c +@@ -542,7 +542,7 @@ int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot) + if (!idx) + return -ENOMEM; + +- err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); ++ err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs, 0); + if (err) + goto out; + +@@ -610,7 +610,7 @@ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot) + list_add_tail(&i->list, &list); + /* Read the index node */ + idx = &i->idx; +- err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); ++ err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs, 0); + if (err) + goto out_free; + /* Validate index node */ +diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c +index e18b988..51c4072 100644 +--- a/fs/ubifs/io.c ++++ b/fs/ubifs/io.c +@@ -912,7 +912,7 @@ int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len, + if (!overlap) { + /* We may safely unlock the write-buffer and read the data */ + spin_unlock(&wbuf->lock); +- return ubifs_read_node(c, buf, type, len, lnum, offs); ++ return ubifs_read_node(c, buf, type, len, lnum, offs, 0); + } + + /* Don't read under wbuf */ +@@ -966,13 +966,14 @@ out: + * @len: node length (not aligned) + * @lnum: logical eraseblock number + * @offs: offset within the logical eraseblock ++ * @silent: suppress error messages + * + * This function reads a node of known type and and length, checks it and + * stores in @buf. Returns zero in case of success, %-EUCLEAN if CRC mismatched + * and a negative error code in case of failure. + */ + int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len, +- int lnum, int offs) ++ int lnum, int offs, int silent) + { + int err, l; + struct ubifs_ch *ch = buf; +@@ -988,30 +989,34 @@ 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)", ++ if (!silent) ubifs_err("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); ++ if (!silent) ++ ubifs_err("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); ++ if (!silent) ++ ubifs_err("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(); ++ if (!silent) { ++ 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(); ++ } + return -EINVAL; + } + +diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c +index 4c37607..b46847d 100644 +--- a/fs/ubifs/sb.c ++++ b/fs/ubifs/sb.c +@@ -482,14 +482,15 @@ failed: + struct ubifs_sb_node *ubifs_read_sb_node(struct ubifs_info *c) + { + struct ubifs_sb_node *sup; +- int err; ++ int silent, err; + + sup = kmalloc(ALIGN(UBIFS_SB_NODE_SZ, c->min_io_size), GFP_NOFS); + if (!sup) + return ERR_PTR(-ENOMEM); + ++ silent = !!(c->vfs_sb->s_flags & MS_SILENT); + err = ubifs_read_node(c, sup, UBIFS_SB_NODE, UBIFS_SB_NODE_SZ, +- UBIFS_SB_LNUM, 0); ++ UBIFS_SB_LNUM, 0, silent); + if (err) { + kfree(sup); + return ERR_PTR(err); +diff --git a/fs/ubifs/tnc_misc.c b/fs/ubifs/tnc_misc.c +index f6bf899..e128689 100644 +--- a/fs/ubifs/tnc_misc.c ++++ b/fs/ubifs/tnc_misc.c +@@ -280,7 +280,7 @@ static int read_znode(struct ubifs_info *c, int lnum, int offs, int len, + if (!idx) + return -ENOMEM; + +- err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs); ++ err = ubifs_read_node(c, idx, UBIFS_IDX_NODE, len, lnum, offs, 0); + if (err < 0) { + kfree(idx); + return err; +@@ -472,7 +472,7 @@ int ubifs_tnc_read_node(struct ubifs_info *c, struct ubifs_zbranch *zbr, + zbr->lnum, zbr->offs); + else + err = ubifs_read_node(c, node, type, zbr->len, zbr->lnum, +- zbr->offs); ++ zbr->offs, 0); + + if (err) { + dbg_tnck(key, "key "); +diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h +index e8c8cfe..85fdd11 100644 +--- a/fs/ubifs/ubifs.h ++++ b/fs/ubifs/ubifs.h +@@ -1481,7 +1481,7 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); + int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs); + int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf); + int ubifs_read_node(const struct ubifs_info *c, void *buf, int type, int len, +- int lnum, int offs); ++ int lnum, int offs, int silent); + int ubifs_read_node_wbuf(struct ubifs_wbuf *wbuf, void *buf, int type, int len, + int lnum, int offs); + int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum, +-- +1.9.2 + |