You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
5.7 KiB
177 lines
5.7 KiB
11 years ago
|
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
|
||
|
|