acbcd5f5b5
Similar to the rootfs hacks on NOR flash devices, this series introduces support for auto-attaching (ubi device), auto-creating (ubiblock device) and mounting the "rootfs" (ubifs or squashfs) volume. This is needed so OpenWrt can start without relying on the bootloader to pass the ubi.mtd, ubi.block, rootfs and rootfstype parameters, but instead auto-detect the root filesystem according to a simple convention. OpenWrt-specific: 490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch 491-ubi-auto-create-ubiblock-device-for-rootfs.patch 492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch 493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch sent upstream: 552-ubifs-respect-silent-mount-flag.patch http://lists.infradead.org/pipermail/linux-mtd/2014-May/053893.html v2: actually retry with MS_RDONLY when mounting read-only ubifs root Signed-off-by: Daniel Golle <daniel@makrotopia.org> SVN-Revision: 41119
176 lines
5.7 KiB
Diff
176 lines
5.7 KiB
Diff
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
|
|
|