linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
@ 2019-03-21 11:50 David Howells
  2019-03-21 11:50 ` [RFC PATCH 1/6] mtd: Provide fs_context-aware mount_mtd() replacement David Howells
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:50 UTC (permalink / raw)
  To: viro
  Cc: linux-block, squashfs-devel, Richard Weinberger, Marek Vasut,
	Brian Norris, Nicolas Pitre, Boris Brezillon, linux-mtd,
	David Woodhouse, Phillip Lougher, linux-fsdevel, linux-kernel,
	dhowells


Hi Al,

Here's a set of patches that convert romfs, cramfs, jffs2 and squashfs to
use the new fs_context struct and replace mount_mtd().  They have
prerequisite commits (such as replacing mount_bdev()) that can be found in
the branch detailed below.

 (1) Provide a replacement for mount_mtd() that takes an fs_context to
     specify the parameters.

     I also put an mtd device pointer into the fs_context struct for use in
     the sget_fc() test and set functions plus a destructor because
     put_fs_context() can't reach into the mtd module.

 (2) Convert romfs.

 (3) Convert cramfs.

 (4) Convert jffs2.

 (5) Get rid of the now-obsolete mount_mtd() function.

 (6) Convert squashfs.

These can be found in the following branch:

	http://git.kernel.org/cgit/linux/kernel/git/dhowells/linux-fs.git/log/?h=mount-api-viro

Thanks,
David
---
David Howells (6):
      mtd: Provide fs_context-aware mount_mtd() replacement
      romfs: Convert to fs_context
      cramfs: Convert to fs_context
      jffs2: Convert to fs_context
      mtd: Kill off mount_mtd()
      squashfs: Convert to fs_context


 drivers/mtd/mtdcore.h      |    1 
 drivers/mtd/mtdsuper.c     |  181 ++++++++++++++++++++++----------------------
 fs/cramfs/inode.c          |   69 +++++++++--------
 fs/fs_context.c            |    2 
 fs/jffs2/fs.c              |   21 +++--
 fs/jffs2/os-linux.h        |    4 -
 fs/jffs2/super.c           |  172 ++++++++++++++++++++----------------------
 fs/romfs/super.c           |   46 +++++++----
 fs/squashfs/super.c        |  100 +++++++++++++-----------
 include/linux/fs_context.h |    2 
 include/linux/mtd/super.h  |    6 +
 11 files changed, 316 insertions(+), 288 deletions(-)


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [RFC PATCH 1/6] mtd: Provide fs_context-aware mount_mtd() replacement
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
@ 2019-03-21 11:50 ` David Howells
  2019-03-21 11:50 ` [RFC PATCH 2/6] romfs: Convert to fs_context David Howells
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:50 UTC (permalink / raw)
  To: viro
  Cc: David Woodhouse, Brian Norris, Boris Brezillon, Marek Vasut,
	Richard Weinberger, linux-mtd, linux-fsdevel, linux-kernel,
	dhowells

Provide a function, vfs_get_mtd_super(), to replace mount_mtd(), using an
fs_context struct to hold the parameters.  The mtd device pointer is cached
in the struct, along with a destructor pointer as the mtd core may be in a
module and, as such, unreachable by the core code that would release the
fs_context.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: David Woodhouse <dwmw2@infradead.org>
cc: Brian Norris <computersforpeace@gmail.com>
cc: Boris Brezillon <bbrezillon@kernel.org>
cc: Marek Vasut <marek.vasut@gmail.com>
cc: Richard Weinberger <richard@nod.at>
cc: linux-mtd@lists.infradead.org
---

 drivers/mtd/mtdcore.h      |    1 
 drivers/mtd/mtdsuper.c     |  192 ++++++++++++++++++++++++++++++++++++++++++++
 fs/fs_context.c            |    2 
 include/linux/fs_context.h |    2 
 include/linux/mtd/super.h  |    3 +
 5 files changed, 198 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/mtdcore.h b/drivers/mtd/mtdcore.h
index b31c868019ad..b5eefeabf310 100644
--- a/drivers/mtd/mtdcore.h
+++ b/drivers/mtd/mtdcore.h
@@ -5,6 +5,7 @@
  */
 
 extern struct mutex mtd_table_mutex;
+extern struct backing_dev_info *mtd_bdi;
 
 struct mtd_info *__mtd_next_device(int i);
 int __must_check add_mtd_device(struct mtd_info *mtd);
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c
index d58a61c09304..cf223c4aa862 100644
--- a/drivers/mtd/mtdsuper.c
+++ b/drivers/mtd/mtdsuper.c
@@ -19,6 +19,196 @@
 #include <linux/slab.h>
 #include <linux/major.h>
 #include <linux/backing-dev.h>
+#include <linux/fs_context.h>
+#include "mtdcore.h"
+
+static void mtd_fc_destructor(struct fs_context *fc)
+{
+	if (fc->mtd)
+		put_mtd_device(fc->mtd);
+}
+
+/*
+ * compare superblocks to see if they're equivalent
+ * - they are if the underlying MTD device is the same
+ */
+static int mtd_test_super(struct super_block *sb, struct fs_context *fc)
+{
+	struct mtd_info *mtd = fc->mtd;
+
+	if (sb->s_mtd == mtd) {
+		pr_debug("MTDSB: Match on device %d (\"%s\")\n",
+			 mtd->index, mtd->name);
+		return 1;
+	}
+
+	pr_debug("MTDSB: No match, device %d (\"%s\"), device %d (\"%s\")\n",
+		 sb->s_mtd->index, sb->s_mtd->name, mtd->index, mtd->name);
+	return 0;
+}
+
+/*
+ * mark the superblock by the MTD device it is using
+ * - set the device number to be the correct MTD block device for pesuperstence
+ *   of NFS exports
+ */
+static int mtd_set_super(struct super_block *sb, struct fs_context *fc)
+{
+	struct mtd_info *mtd = fc->mtd;
+
+	sb->s_mtd = mtd;
+	sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
+	sb->s_bdi = bdi_get(mtd_bdi);
+	fc->mtd = NULL;
+	return 0;
+}
+
+/*
+ * get a superblock on an MTD-backed filesystem
+ */
+static int mtd_get_sb(struct fs_context *fc,
+		      int (*fill_super)(struct super_block *,
+					struct fs_context *))
+{
+	struct super_block *sb;
+	struct mtd_info *mtd = fc->mtd;
+	int ret;
+
+	sb = sget_fc(fc, mtd_test_super, mtd_set_super);
+	if (IS_ERR(sb))
+		return PTR_ERR(sb);
+
+	if (sb->s_root) {
+		/* new mountpoint for an already mounted superblock */
+		pr_debug("MTDSB: Device %d (\"%s\") is already mounted\n",
+			 mtd->index, mtd->name);
+		put_mtd_device(mtd);
+	} else {
+		/* fresh new superblock */
+		pr_debug("MTDSB: New superblock for device %d (\"%s\")\n",
+			 mtd->index, mtd->name);
+
+		ret = fill_super(sb, fc);
+		if (ret < 0)
+			goto error_sb;
+
+		sb->s_flags |= SB_ACTIVE;
+	}
+
+	BUG_ON(fc->root);
+	fc->root = dget(sb->s_root);
+	return 0;
+
+error_sb:
+	deactivate_locked_super(sb);
+	return ret;
+}
+
+/*
+ * get a superblock on an MTD-backed filesystem by MTD device number
+ */
+static int mtd_get_sb_by_nr(struct fs_context *fc, int mtdnr,
+			    int (*fill_super)(struct super_block *,
+					      struct fs_context *))
+{
+	struct mtd_info *mtd;
+
+	mtd = get_mtd_device(NULL, mtdnr);
+	if (IS_ERR(mtd)) {
+		errorf(fc, "MTDSB: Device #%u doesn't appear to exist\n", mtdnr);
+		return PTR_ERR(mtd);
+	}
+
+	fc->mtd = mtd;
+	fc->destructor = mtd_fc_destructor;
+	return mtd_get_sb(fc, fill_super);
+}
+
+/**
+ * vfs_get_mtd_super - Get a superblock based on a single MTD device
+ * @fc: The filesystem context holding the parameters
+ * @fill_super: Helper to initialise a new superblock
+ */
+int vfs_get_mtd_super(struct fs_context *fc,
+		      int (*fill_super)(struct super_block *sb,
+					struct fs_context *fc))
+{
+#ifdef CONFIG_BLOCK
+	struct block_device *bdev;
+	int ret, major;
+#endif
+	int mtdnr;
+
+	if (!fc->source)
+		return invalf(fc, "No source specified");
+
+	pr_debug("MTDSB: dev_name \"%s\"\n", fc->source);
+
+	/* the preferred way of mounting in future; especially when
+	 * CONFIG_BLOCK=n - we specify the underlying MTD device by number or
+	 * by name, so that we don't require block device support to be present
+	 * in the kernel.
+	 */
+	if (fc->source[0] == 'm' &&
+	    fc->source[1] == 't' &&
+	    fc->source[2] == 'd') {
+		if (fc->source[3] == ':') {
+			struct mtd_info *mtd;
+
+			/* mount by MTD device name */
+			pr_debug("MTDSB: mtd:%%s, name \"%s\"\n",
+				 fc->source + 4);
+
+			mtd = get_mtd_device_nm(fc->source + 4);
+			if (!IS_ERR(mtd)) {
+				fc->mtd = mtd;
+				fc->destructor = mtd_fc_destructor;
+				return mtd_get_sb(fc, fill_super);
+			}
+
+			errorf(fc, "MTD: MTD device with name \"%s\" not found",
+			       fc->source + 4);
+
+		} else if (isdigit(fc->source[3])) {
+			/* mount by MTD device number name */
+			char *endptr;
+
+			mtdnr = simple_strtoul(fc->source + 3, &endptr, 0);
+			if (!*endptr) {
+				/* It was a valid number */
+				pr_debug("MTDSB: mtd%%d, mtdnr %d\n", mtdnr);
+				return mtd_get_sb_by_nr(fc, mtdnr, fill_super);
+			}
+		}
+	}
+
+#ifdef CONFIG_BLOCK
+	/* try the old way - the hack where we allowed users to mount
+	 * /dev/mtdblock$(n) but didn't actually _use_ the blockdev
+	 */
+	bdev = lookup_bdev(fc->source);
+	if (IS_ERR(bdev)) {
+		ret = PTR_ERR(bdev);
+		errorf(fc, "MTD: Couldn't look up '%s': %d", fc->source, ret);
+		return ret;
+	}
+	pr_debug("MTDSB: lookup_bdev() returned 0\n");
+
+	major = MAJOR(bdev->bd_dev);
+	mtdnr = MINOR(bdev->bd_dev);
+	bdput(bdev);
+
+	if (major == MTD_BLOCK_MAJOR)
+		return mtd_get_sb_by_nr(fc, mtdnr, fill_super);
+
+#endif /* CONFIG_BLOCK */
+
+	if (!(fc->sb_flags & SB_SILENT))
+		errorf(fc, "MTD: Attempt to mount non-MTD device \"%s\"",
+		       fc->source);
+	return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(vfs_get_mtd_super);
 
 /*
  * compare superblocks to see if they're equivalent
@@ -39,8 +229,6 @@ static int get_sb_mtd_compare(struct super_block *sb, void *_mtd)
 	return 0;
 }
 
-extern struct backing_dev_info *mtd_bdi;
-
 /*
  * mark the superblock by the MTD device it is using
  * - set the device number to be the correct MTD block device for pesuperstence
diff --git a/fs/fs_context.c b/fs/fs_context.c
index ee727665d7f6..b191d215057d 100644
--- a/fs/fs_context.c
+++ b/fs/fs_context.c
@@ -429,6 +429,8 @@ void put_fs_context(struct fs_context *fc)
 	if (fc->bdev)
 		blkdev_put(fc->bdev, fc->bdev_mode);
 #endif
+	if (fc->destructor)
+		fc->destructor(fc);
 
 	security_free_mnt_opts(&fc->security);
 	put_net(fc->net_ns);
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
index 524963c0cedb..8233c873af73 100644
--- a/include/linux/fs_context.h
+++ b/include/linux/fs_context.h
@@ -77,6 +77,7 @@ struct fs_context {
 	struct file_system_type	*fs_type;
 	void			*fs_private;	/* The filesystem's context */
 	struct block_device	*bdev;		/* The backing blockdev (if applicable) */
+	struct mtd_info		*mtd;		/* The backing mtd (if applicable) */
 	struct dentry		*root;		/* The root and superblock */
 	struct user_namespace	*user_ns;	/* The user namespace for this mount */
 	struct net		*net_ns;	/* The network namespace for this mount */
@@ -92,6 +93,7 @@ struct fs_context {
 	enum fs_context_purpose	purpose:8;
 	bool			need_free:1;	/* Need to call ops->free() */
 	bool			global:1;	/* Goes into &init_user_ns */
+	void (*destructor)(struct fs_context *fc); /* For mtd */
 };
 
 struct fs_context_operations {
diff --git a/include/linux/mtd/super.h b/include/linux/mtd/super.h
index f456230f9330..7ebd69e5c640 100644
--- a/include/linux/mtd/super.h
+++ b/include/linux/mtd/super.h
@@ -18,6 +18,9 @@
 #include <linux/fs.h>
 #include <linux/mount.h>
 
+extern int vfs_get_mtd_super(struct fs_context *fc,
+			     int (*fill_super)(struct super_block *sb,
+					       struct fs_context *fc));
 extern struct dentry *mount_mtd(struct file_system_type *fs_type, int flags,
 		      const char *dev_name, void *data,
 		      int (*fill_super)(struct super_block *, void *, int));


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [RFC PATCH 2/6] romfs: Convert to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
  2019-03-21 11:50 ` [RFC PATCH 1/6] mtd: Provide fs_context-aware mount_mtd() replacement David Howells
@ 2019-03-21 11:50 ` David Howells
  2019-03-21 11:50 ` [RFC PATCH 3/6] cramfs: " David Howells
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:50 UTC (permalink / raw)
  To: viro; +Cc: linux-mtd, linux-block, linux-fsdevel, linux-kernel, dhowells

Signed-off-by: David Howells <dhowells@redhat.com>
cc: linux-mtd@lists.infradead.org
cc: linux-block@vger.kernel.org
---

 fs/romfs/super.c |   46 ++++++++++++++++++++++++++++------------------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/fs/romfs/super.c b/fs/romfs/super.c
index 6ccb51993a76..627c2b64ff03 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -65,7 +65,7 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/blkdev.h>
-#include <linux/parser.h>
+#include <linux/fs_context.h>
 #include <linux/mount.h>
 #include <linux/namei.h>
 #include <linux/statfs.h>
@@ -430,10 +430,10 @@ static int romfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 /*
  * remounting must involve read-only
  */
-static int romfs_remount(struct super_block *sb, int *flags, char *data)
+static int romfs_reconfigure(struct fs_context *fc)
 {
-	sync_filesystem(sb);
-	*flags |= SB_RDONLY;
+	sync_filesystem(fc->root->d_sb);
+	fc->sb_flags |= SB_RDONLY;
 	return 0;
 }
 
@@ -441,7 +441,6 @@ static const struct super_operations romfs_super_ops = {
 	.alloc_inode	= romfs_alloc_inode,
 	.destroy_inode	= romfs_destroy_inode,
 	.statfs		= romfs_statfs,
-	.remount_fs	= romfs_remount,
 };
 
 /*
@@ -464,7 +463,7 @@ static __u32 romfs_checksum(const void *data, int size)
 /*
  * fill in the superblock
  */
-static int romfs_fill_super(struct super_block *sb, void *data, int silent)
+static int romfs_fill_super(struct super_block *sb, struct fs_context *fc)
 {
 	struct romfs_super_block *rsb;
 	struct inode *root;
@@ -511,8 +510,8 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
 
 	if (rsb->word0 != ROMSB_WORD0 || rsb->word1 != ROMSB_WORD1 ||
 	    img_size < ROMFH_SIZE) {
-		if (!silent)
-			pr_warn("VFS: Can't find a romfs filesystem on dev %s.\n",
+		if (!(fc->sb_flags & SB_SILENT))
+			errorf(fc, "VFS: Can't find a romfs filesystem on dev %s.\n",
 			       sb->s_id);
 		goto error_rsb_inval;
 	}
@@ -525,7 +524,7 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
 	storage = sb->s_mtd ? "MTD" : "the block layer";
 
 	len = strnlen(rsb->name, ROMFS_MAXFN);
-	if (!silent)
+	if (!(fc->sb_flags & SB_SILENT))
 		pr_notice("Mounting image '%*.*s' through %s\n",
 			  (unsigned) len, (unsigned) len, rsb->name, storage);
 
@@ -555,23 +554,34 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
 /*
  * get a superblock for mounting
  */
-static struct dentry *romfs_mount(struct file_system_type *fs_type,
-			int flags, const char *dev_name,
-			void *data)
+static int romfs_get_tree(struct fs_context *fc)
 {
-	struct dentry *ret = ERR_PTR(-EINVAL);
+	int ret = -EINVAL;
 
 #ifdef CONFIG_ROMFS_ON_MTD
-	ret = mount_mtd(fs_type, flags, dev_name, data, romfs_fill_super);
+	ret = vfs_get_mtd_super(fc, romfs_fill_super);
 #endif
 #ifdef CONFIG_ROMFS_ON_BLOCK
-	if (ret == ERR_PTR(-EINVAL))
-		ret = mount_bdev(fs_type, flags, dev_name, data,
-				  romfs_fill_super);
+	if (ret == -EINVAL)
+		ret = vfs_get_block_super(fc, romfs_fill_super);
 #endif
 	return ret;
 }
 
+static const struct fs_context_operations romfs_context_ops = {
+	.get_tree	= romfs_get_tree,
+	.reconfigure	= romfs_reconfigure,
+};
+
+/*
+ * Set up the filesystem mount context.
+ */
+static int romfs_init_fs_context(struct fs_context *fc)
+{
+	fc->ops = &romfs_context_ops;
+	return 0;
+}
+
 /*
  * destroy a romfs superblock in the appropriate manner
  */
@@ -594,7 +604,7 @@ static void romfs_kill_sb(struct super_block *sb)
 static struct file_system_type romfs_fs_type = {
 	.owner		= THIS_MODULE,
 	.name		= "romfs",
-	.mount		= romfs_mount,
+	.init_fs_context = romfs_init_fs_context,
 	.kill_sb	= romfs_kill_sb,
 	.fs_flags	= FS_REQUIRES_DEV,
 };


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [RFC PATCH 3/6] cramfs: Convert to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
  2019-03-21 11:50 ` [RFC PATCH 1/6] mtd: Provide fs_context-aware mount_mtd() replacement David Howells
  2019-03-21 11:50 ` [RFC PATCH 2/6] romfs: Convert to fs_context David Howells
@ 2019-03-21 11:50 ` David Howells
  2019-03-21 11:50 ` [RFC PATCH 4/6] jffs2: " David Howells
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:50 UTC (permalink / raw)
  To: viro
  Cc: Nicolas Pitre, linux-mtd, linux-block, linux-fsdevel,
	linux-kernel, dhowells

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Nicolas Pitre <nico@linaro.org>
cc: linux-mtd@lists.infradead.org
cc: linux-block@vger.kernel.org
---

 fs/cramfs/inode.c |   69 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 39 insertions(+), 30 deletions(-)

diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 9352487bd0fc..2ee89a353d64 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -24,6 +24,7 @@
 #include <linux/blkdev.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/super.h>
+#include <linux/fs_context.h>
 #include <linux/slab.h>
 #include <linux/vfs.h>
 #include <linux/mutex.h>
@@ -506,18 +507,19 @@ static void cramfs_kill_sb(struct super_block *sb)
 	kfree(sbi);
 }
 
-static int cramfs_remount(struct super_block *sb, int *flags, char *data)
+static int cramfs_reconfigure(struct fs_context *fc)
 {
-	sync_filesystem(sb);
-	*flags |= SB_RDONLY;
+	sync_filesystem(fc->root->d_sb);
+	fc->sb_flags |= SB_RDONLY;
 	return 0;
 }
 
-static int cramfs_read_super(struct super_block *sb,
-			     struct cramfs_super *super, int silent)
+static int cramfs_read_super(struct super_block *sb, struct fs_context *fc,
+			     struct cramfs_super *super)
 {
 	struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
 	unsigned long root_offset;
+	bool silent = fc->sb_flags & SB_SILENT;
 
 	/* We don't know the real size yet */
 	sbi->size = PAGE_SIZE;
@@ -532,7 +534,7 @@ static int cramfs_read_super(struct super_block *sb,
 		/* check for wrong endianness */
 		if (super->magic == CRAMFS_MAGIC_WEND) {
 			if (!silent)
-				pr_err("wrong endianness\n");
+				errorf(fc, "cramfs: wrong endianness");
 			return -EINVAL;
 		}
 
@@ -544,22 +546,22 @@ static int cramfs_read_super(struct super_block *sb,
 		mutex_unlock(&read_mutex);
 		if (super->magic != CRAMFS_MAGIC) {
 			if (super->magic == CRAMFS_MAGIC_WEND && !silent)
-				pr_err("wrong endianness\n");
+				errorf(fc, "cramfs: wrong endianness");
 			else if (!silent)
-				pr_err("wrong magic\n");
+				errorf(fc, "cramfs: wrong magic");
 			return -EINVAL;
 		}
 	}
 
 	/* get feature flags first */
 	if (super->flags & ~CRAMFS_SUPPORTED_FLAGS) {
-		pr_err("unsupported filesystem features\n");
+		errorf(fc, "cramfs: unsupported filesystem features");
 		return -EINVAL;
 	}
 
 	/* Check that the root inode is in a sane state */
 	if (!S_ISDIR(super->root.mode)) {
-		pr_err("root is not a directory\n");
+		errorf(fc, "cramfs: root is not a directory");
 		return -EINVAL;
 	}
 	/* correct strange, hard-coded permissions of mkcramfs */
@@ -578,12 +580,12 @@ static int cramfs_read_super(struct super_block *sb,
 	sbi->magic = super->magic;
 	sbi->flags = super->flags;
 	if (root_offset == 0)
-		pr_info("empty filesystem");
+		infof(fc, "cramfs: empty filesystem");
 	else if (!(super->flags & CRAMFS_FLAG_SHIFTED_ROOT_OFFSET) &&
 		 ((root_offset != sizeof(struct cramfs_super)) &&
 		  (root_offset != 512 + sizeof(struct cramfs_super))))
 	{
-		pr_err("bad root offset %lu\n", root_offset);
+		errorf(fc, "cramfs: bad root offset %lu", root_offset);
 		return -EINVAL;
 	}
 
@@ -607,8 +609,7 @@ static int cramfs_finalize_super(struct super_block *sb,
 	return 0;
 }
 
-static int cramfs_blkdev_fill_super(struct super_block *sb, void *data,
-				    int silent)
+static int cramfs_blkdev_fill_super(struct super_block *sb, struct fs_context *fc)
 {
 	struct cramfs_sb_info *sbi;
 	struct cramfs_super super;
@@ -623,14 +624,13 @@ static int cramfs_blkdev_fill_super(struct super_block *sb, void *data,
 	for (i = 0; i < READ_BUFFERS; i++)
 		buffer_blocknr[i] = -1;
 
-	err = cramfs_read_super(sb, &super, silent);
+	err = cramfs_read_super(sb, fc, &super);
 	if (err)
 		return err;
 	return cramfs_finalize_super(sb, &super.root);
 }
 
-static int cramfs_mtd_fill_super(struct super_block *sb, void *data,
-				 int silent)
+static int cramfs_mtd_fill_super(struct super_block *sb, struct fs_context *fc)
 {
 	struct cramfs_sb_info *sbi;
 	struct cramfs_super super;
@@ -652,7 +652,7 @@ static int cramfs_mtd_fill_super(struct super_block *sb, void *data,
 
 	pr_info("checking physical address %pap for linear cramfs image\n",
 		&sbi->linear_phys_addr);
-	err = cramfs_read_super(sb, &super, silent);
+	err = cramfs_read_super(sb, fc, &super);
 	if (err)
 		return err;
 
@@ -947,32 +947,41 @@ static const struct inode_operations cramfs_dir_inode_operations = {
 };
 
 static const struct super_operations cramfs_ops = {
-	.remount_fs	= cramfs_remount,
 	.statfs		= cramfs_statfs,
 };
 
-static struct dentry *cramfs_mount(struct file_system_type *fs_type, int flags,
-				   const char *dev_name, void *data)
+static int cramfs_get_tree(struct fs_context *fc)
 {
-	struct dentry *ret = ERR_PTR(-ENOPROTOOPT);
+	int ret = -ENOPROTOOPT;
 
 	if (IS_ENABLED(CONFIG_CRAMFS_MTD)) {
-		ret = mount_mtd(fs_type, flags, dev_name, data,
-				cramfs_mtd_fill_super);
-		if (!IS_ERR(ret))
+		ret = vfs_get_mtd_super(fc, cramfs_mtd_fill_super);
+		if (ret < 0)
 			return ret;
 	}
-	if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV)) {
-		ret = mount_bdev(fs_type, flags, dev_name, data,
-				 cramfs_blkdev_fill_super);
-	}
+	if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV))
+		ret = vfs_get_block_super(fc, cramfs_blkdev_fill_super);
 	return ret;
 }
 
+static const struct fs_context_operations cramfs_context_ops = {
+	.get_tree	= cramfs_get_tree,
+	.reconfigure	= cramfs_reconfigure,
+};
+
+/*
+ * Set up the filesystem mount context.
+ */
+static int cramfs_init_fs_context(struct fs_context *fc)
+{
+	fc->ops = &cramfs_context_ops;
+	return 0;
+}
+
 static struct file_system_type cramfs_fs_type = {
 	.owner		= THIS_MODULE,
 	.name		= "cramfs",
-	.mount		= cramfs_mount,
+	.init_fs_context = cramfs_init_fs_context,
 	.kill_sb	= cramfs_kill_sb,
 	.fs_flags	= FS_REQUIRES_DEV,
 };


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [RFC PATCH 4/6] jffs2: Convert to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
                   ` (2 preceding siblings ...)
  2019-03-21 11:50 ` [RFC PATCH 3/6] cramfs: " David Howells
@ 2019-03-21 11:50 ` David Howells
  2019-03-21 11:52 ` [RFC PATCH 0/6] Convert mount_single-using filesystems " David Howells
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:50 UTC (permalink / raw)
  To: viro; +Cc: David Woodhouse, linux-mtd, linux-fsdevel, linux-kernel, dhowells

Signed-off-by: David Howells <dhowells@redhat.com>
cc: David Woodhouse <dwmw2@infradead.org>
cc: linux-mtd@lists.infradead.org
---

 fs/jffs2/fs.c       |   21 +++---
 fs/jffs2/os-linux.h |    4 +
 fs/jffs2/super.c    |  172 +++++++++++++++++++++++++--------------------------
 3 files changed, 96 insertions(+), 101 deletions(-)

diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index eab04eca95a3..d79734bd7650 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -17,6 +17,7 @@
 #include <linux/sched.h>
 #include <linux/cred.h>
 #include <linux/fs.h>
+#include <linux/fs_context.h>
 #include <linux/list.h>
 #include <linux/mtd/mtd.h>
 #include <linux/pagemap.h>
@@ -184,7 +185,7 @@ int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
 	if (ivalid & ATTR_SIZE && inode->i_size > iattr->ia_size) {
 		truncate_setsize(inode, iattr->ia_size);
 		inode->i_blocks = (inode->i_size + 511) >> 9;
-	}	
+	}
 
 	return 0;
 }
@@ -390,7 +391,7 @@ void jffs2_dirty_inode(struct inode *inode, int flags)
 	jffs2_do_setattr(inode, &iattr);
 }
 
-int jffs2_do_remount_fs(struct super_block *sb, int *flags, char *data)
+int jffs2_do_remount_fs(struct super_block *sb, struct fs_context *fc)
 {
 	struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
 
@@ -408,10 +409,10 @@ int jffs2_do_remount_fs(struct super_block *sb, int *flags, char *data)
 		mutex_unlock(&c->alloc_sem);
 	}
 
-	if (!(*flags & SB_RDONLY))
+	if (!(fc->sb_flags & SB_RDONLY))
 		jffs2_start_garbage_collect_thread(c);
 
-	*flags |= SB_NOATIME;
+	fc->sb_flags |= SB_NOATIME;
 	return 0;
 }
 
@@ -508,7 +509,7 @@ static int calculate_inocache_hashsize(uint32_t flash_size)
 	return hashsize;
 }
 
-int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
+int jffs2_do_fill_super(struct super_block *sb, struct fs_context *fc)
 {
 	struct jffs2_sb_info *c;
 	struct inode *root_i;
@@ -523,11 +524,11 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
 
 #ifndef CONFIG_JFFS2_FS_WRITEBUFFER
 	if (c->mtd->type == MTD_NANDFLASH) {
-		pr_err("Cannot operate on NAND flash unless jffs2 NAND support is compiled in\n");
+		errorf(fc, "Cannot operate on NAND flash unless jffs2 NAND support is compiled in");
 		return -EINVAL;
 	}
 	if (c->mtd->type == MTD_DATAFLASH) {
-		pr_err("Cannot operate on DataFlash unless jffs2 DataFlash support is compiled in\n");
+		errorf(fc, "Cannot operate on DataFlash unless jffs2 DataFlash support is compiled in");
 		return -EINVAL;
 	}
 #endif
@@ -541,12 +542,12 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
 	 */
 	if ((c->sector_size * blocks) != c->flash_size) {
 		c->flash_size = c->sector_size * blocks;
-		pr_info("Flash size not aligned to erasesize, reducing to %dKiB\n",
-			c->flash_size / 1024);
+		infof(fc, "Flash size not aligned to erasesize, reducing to %dKiB",
+		      c->flash_size / 1024);
 	}
 
 	if (c->flash_size < 5*c->sector_size) {
-		pr_err("Too few erase blocks (%d)\n",
+		errorf(fc, "Too few erase blocks (%d)",
 		       c->flash_size / c->sector_size);
 		return -EINVAL;
 	}
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h
index a2dbbb3f4c74..ac23ae5cdb54 100644
--- a/fs/jffs2/os-linux.h
+++ b/fs/jffs2/os-linux.h
@@ -172,8 +172,8 @@ void jffs2_dirty_inode(struct inode *inode, int flags);
 struct inode *jffs2_new_inode (struct inode *dir_i, umode_t mode,
 			       struct jffs2_raw_inode *ri);
 int jffs2_statfs (struct dentry *, struct kstatfs *);
-int jffs2_do_remount_fs(struct super_block *, int *, char *);
-int jffs2_do_fill_super(struct super_block *sb, void *data, int silent);
+int jffs2_do_remount_fs(struct super_block *sb, struct fs_context *fc);
+int jffs2_do_fill_super(struct super_block *sb, struct fs_context *fc);
 void jffs2_gc_release_inode(struct jffs2_sb_info *c,
 			    struct jffs2_inode_info *f);
 struct jffs2_inode_info *jffs2_gc_fetch_inode(struct jffs2_sb_info *c,
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index bb6ae387469f..69dcc4e0b243 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -19,7 +19,8 @@
 #include <linux/fs.h>
 #include <linux/err.h>
 #include <linux/mount.h>
-#include <linux/parser.h>
+#include <linux/fs_context.h>
+#include <linux/fs_parser.h>
 #include <linux/jffs2.h>
 #include <linux/pagemap.h>
 #include <linux/mtd/super.h>
@@ -160,96 +161,77 @@ static const struct export_operations jffs2_export_ops = {
 /*
  * JFFS2 mount options.
  *
+ * Opt_source: The source device
  * Opt_override_compr: override default compressor
  * Opt_rp_size: size of reserved pool in KiB
- * Opt_err: just end of array marker
  */
 enum {
+	Opt_source,
 	Opt_override_compr,
 	Opt_rp_size,
-	Opt_err,
 };
 
-static const match_table_t tokens = {
-	{Opt_override_compr, "compr=%s"},
-	{Opt_rp_size, "rp_size=%u"},
-	{Opt_err, NULL},
+static const struct fs_parameter_spec jffs2_param_specs[] = {
+	fsparam_string	("source",	Opt_source),
+	fsparam_enum	("compr",	Opt_override_compr),
+	fsparam_u32	("rp_size",	Opt_rp_size),
+	{}
 };
 
-static int jffs2_parse_options(struct jffs2_sb_info *c, char *data)
-{
-	substring_t args[MAX_OPT_ARGS];
-	char *p, *name;
-	unsigned int opt;
-
-	if (!data)
-		return 0;
-
-	while ((p = strsep(&data, ","))) {
-		int token;
-
-		if (!*p)
-			continue;
-
-		token = match_token(p, tokens, args);
-		switch (token) {
-		case Opt_override_compr:
-			name = match_strdup(&args[0]);
-
-			if (!name)
-				return -ENOMEM;
-			if (!strcmp(name, "none"))
-				c->mount_opts.compr = JFFS2_COMPR_MODE_NONE;
+static const struct fs_parameter_enum jffs2_param_enums[] = {
+	{ Opt_override_compr,	"none",	JFFS2_COMPR_MODE_NONE },
 #ifdef CONFIG_JFFS2_LZO
-			else if (!strcmp(name, "lzo"))
-				c->mount_opts.compr = JFFS2_COMPR_MODE_FORCELZO;
+	{ Opt_override_compr,	"lzo",	JFFS2_COMPR_MODE_FORCELZO },
 #endif
 #ifdef CONFIG_JFFS2_ZLIB
-			else if (!strcmp(name, "zlib"))
-				c->mount_opts.compr =
-						JFFS2_COMPR_MODE_FORCEZLIB;
+	{ Opt_override_compr,	"zlib",	JFFS2_COMPR_MODE_FORCEZLIB },
 #endif
-			else {
-				pr_err("Error: unknown compressor \"%s\"\n",
-				       name);
-				kfree(name);
-				return -EINVAL;
-			}
-			kfree(name);
-			c->mount_opts.override_compr = true;
-			break;
-		case Opt_rp_size:
-			if (match_int(&args[0], &opt))
-				return -EINVAL;
-			opt *= 1024;
-			if (opt > c->mtd->size) {
-				pr_warn("Too large reserve pool specified, max "
-					"is %llu KB\n", c->mtd->size / 1024);
-				return -EINVAL;
-			}
-			c->mount_opts.rp_size = opt;
-			break;
-		default:
-			pr_err("Error: unrecognized mount option '%s' or missing value\n",
-			       p);
-			return -EINVAL;
-		}
+	{}
+};
+
+const struct fs_parameter_description jffs2_fs_parameters = {
+	.name		= "jffs2",
+	.specs		= jffs2_param_specs,
+	.enums		= jffs2_param_enums,
+};
+
+static int jffs2_parse_param(struct fs_context *fc, struct fs_parameter *param)
+{
+	struct fs_parse_result result;
+	struct jffs2_sb_info *c = fc->s_fs_info;
+	int opt;
+
+	opt = fs_parse(fc, &jffs2_fs_parameters, param, &result);
+	if (opt < 0)
+		return opt;
+
+	switch (opt) {
+	case Opt_override_compr:
+		c->mount_opts.compr = result.uint_32;
+		c->mount_opts.override_compr = true;
+		break;
+	case Opt_rp_size:
+		if (result.uint_32 > UINT_MAX / 1024)
+			return invalf(fc, "jffs2: rp_size unrepresentable");
+		opt = result.uint_32 * 1024;
+		if (opt > c->mtd->size)
+			return invalf(fc, "jffs2: Too large reserve pool specified, max is %llu KB",
+				      c->mtd->size / 1024);
+		c->mount_opts.rp_size = opt;
+		break;
+	default:
+		return -EINVAL;
 	}
 
 	return 0;
 }
 
-static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data)
+static int jffs2_reconfigure(struct fs_context *fc)
 {
-	struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
-	int err;
+	struct super_block *sb = fc->root->d_sb;
 
 	sync_filesystem(sb);
-	err = jffs2_parse_options(c, data);
-	if (err)
-		return -EINVAL;
-
-	return jffs2_do_remount_fs(sb, flags, data);
+	return jffs2_do_remount_fs(sb, fc);
 }
 
 static const struct super_operations jffs2_super_operations =
@@ -258,7 +240,6 @@ static const struct super_operations jffs2_super_operations =
 	.destroy_inode =jffs2_destroy_inode,
 	.put_super =	jffs2_put_super,
 	.statfs =	jffs2_statfs,
-	.remount_fs =	jffs2_remount_fs,
 	.evict_inode =	jffs2_evict_inode,
 	.dirty_inode =	jffs2_dirty_inode,
 	.show_options =	jffs2_show_options,
@@ -268,26 +249,16 @@ static const struct super_operations jffs2_super_operations =
 /*
  * fill in the superblock
  */
-static int jffs2_fill_super(struct super_block *sb, void *data, int silent)
+static int jffs2_fill_super(struct super_block *sb, struct fs_context *fc)
 {
-	struct jffs2_sb_info *c;
-	int ret;
+	struct jffs2_sb_info *c = sb->s_fs_info;
 
 	jffs2_dbg(1, "jffs2_get_sb_mtd():"
 		  " New superblock for device %d (\"%s\")\n",
 		  sb->s_mtd->index, sb->s_mtd->name);
 
-	c = kzalloc(sizeof(*c), GFP_KERNEL);
-	if (!c)
-		return -ENOMEM;
-
 	c->mtd = sb->s_mtd;
 	c->os_priv = sb;
-	sb->s_fs_info = c;
-
-	ret = jffs2_parse_options(c, data);
-	if (ret)
-		return -EINVAL;
 
 	/* Initialize JFFS2 superblock locks, the further initialization will
 	 * be done later */
@@ -305,15 +276,37 @@ static int jffs2_fill_super(struct super_block *sb, void *data, int silent)
 #ifdef CONFIG_JFFS2_FS_POSIX_ACL
 	sb->s_flags |= SB_POSIXACL;
 #endif
-	ret = jffs2_do_fill_super(sb, data, silent);
-	return ret;
+	return jffs2_do_fill_super(sb, fc);
 }
 
-static struct dentry *jffs2_mount(struct file_system_type *fs_type,
-			int flags, const char *dev_name,
-			void *data)
+static int jffs2_get_tree(struct fs_context *fc)
 {
-	return mount_mtd(fs_type, flags, dev_name, data, jffs2_fill_super);
+	return vfs_get_mtd_super(fc, jffs2_fill_super);
+}
+
+static void jffs2_free_fc(struct fs_context *fc)
+{
+	kfree(fc->s_fs_info);
+}
+
+static const struct fs_context_operations jffs2_context_ops = {
+	.free		= jffs2_free_fc,
+	.parse_param	= jffs2_parse_param,
+	.get_tree	= jffs2_get_tree,
+	.reconfigure	= jffs2_reconfigure,
+};
+
+static int jffs2_init_fs_context(struct fs_context *fc)
+{
+	struct jffs2_sb_info *ctx;
+
+	ctx = kzalloc(sizeof(struct jffs2_sb_info), GFP_KERNEL);
+	if (!ctx)
+		return -ENOMEM;
+
+	fc->s_fs_info = ctx;
+	fc->ops = &jffs2_context_ops;
+	return 0;
 }
 
 static void jffs2_put_super (struct super_block *sb)
@@ -350,7 +343,8 @@ static void jffs2_kill_sb(struct super_block *sb)
 static struct file_system_type jffs2_fs_type = {
 	.owner =	THIS_MODULE,
 	.name =		"jffs2",
-	.mount =	jffs2_mount,
+	.init_fs_context = jffs2_init_fs_context,
+	.parameters =	&jffs2_fs_parameters,
 	.kill_sb =	jffs2_kill_sb,
 };
 MODULE_ALIAS_FS("jffs2");


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
                   ` (3 preceding siblings ...)
  2019-03-21 11:50 ` [RFC PATCH 4/6] jffs2: " David Howells
@ 2019-03-21 11:52 ` David Howells
  2019-03-21 12:48 ` Richard Weinberger
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 11:52 UTC (permalink / raw)
  Cc: dhowells, viro, linux-block, squashfs-devel, Richard Weinberger,
	Marek Vasut, Brian Norris, Nicolas Pitre, Boris Brezillon,
	linux-mtd, David Woodhouse, Phillip Lougher, linux-fsdevel,
	linux-kernel

Sorry, I included the wrong cover message with this.  Will repost.

David

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
                   ` (4 preceding siblings ...)
  2019-03-21 11:52 ` [RFC PATCH 0/6] Convert mount_single-using filesystems " David Howells
@ 2019-03-21 12:48 ` Richard Weinberger
  2019-03-21 15:12 ` David Howells
  2019-03-21 15:16 ` David Howells
  7 siblings, 0 replies; 13+ messages in thread
From: Richard Weinberger @ 2019-03-21 12:48 UTC (permalink / raw)
  To: David Howells
  Cc: viro, linux-block, squashfs-devel, Marek Vasut, Brian Norris,
	Nicolas Pitre, Boris Brezillon, linux-mtd, David Woodhouse,
	Phillip Lougher, linux-fsdevel, linux-kernel

Am Donnerstag, 21. März 2019, 12:50:24 CET schrieb David Howells:
> 
> Hi Al,
> 
> Here's a set of patches that convert romfs, cramfs, jffs2 and squashfs to
> use the new fs_context struct and replace mount_mtd().  They have
> prerequisite commits (such as replacing mount_bdev()) that can be found in
> the branch detailed below.
> 
>  (1) Provide a replacement for mount_mtd() that takes an fs_context to
>      specify the parameters.
> 
>      I also put an mtd device pointer into the fs_context struct for use in
>      the sget_fc() test and set functions plus a destructor because
>      put_fs_context() can't reach into the mtd module.
> 
>  (2) Convert romfs.
> 
>  (3) Convert cramfs.
> 
>  (4) Convert jffs2.
> 
>  (5) Get rid of the now-obsolete mount_mtd() function.
> 
>  (6) Convert squashfs.
> 
> These can be found in the following branch:
> 
> 	http://git.kernel.org/cgit/linux/kernel/git/dhowells/linux-fs.git/log/?h=mount-api-viro

Hmm, I pulled this into 5.1-rc1 to test jffs2 but it oopes already while booting:

[    5.999847] BUG: unable to handle kernel NULL pointer dereference at 0000000000000068
[    6.002273] #PF error: [normal kernel read fault]
[    6.002912] PGD 0 P4D 0 
[    6.003241] Oops: 0000 [#1] SMP PTI
[    6.003690] CPU: 3 PID: 1221 Comm: mount Not tainted 5.1.0-rc1+ #372
[    6.004494] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.11.0-0-g63451fc-prebuilt.qemu-project.org 04/01/2014
[    6.004504] RIP: 0010:reconfigure_super+0x17/0x1e0
[    6.004505] Code: 00 01 75 83 48 89 df e8 c7 e5 ff ff e9 76 ff ff ff 66 90 41 56 41 55 41 54 55 53 f7 47 68 ae ff 7f fd 48 8b 47 28 44 8b 77 64 <48> 8b 68 68 0f 85 a2 01 00 00 8b 95 38 02 00 00 85 d2 0f 85 89 01
[    6.004506] RSP: 0018:ffffb43cc0dafdf0 EFLAGS: 00010246
[    6.004507] RAX: 0000000000000000 RBX: ffff9d21b925cb00 RCX: ffff9d21b973009c
[    6.004508] RDX: 0000000000000001 RSI: ffff9d21b925cb00 RDI: ffff9d21b925cb00
[    6.004508] RBP: ffff9d21b9730000 R08: 0000000000200000 R09: 0000000000000000
[    6.004509] R10: ffffb43cc0dafe78 R11: 61c8864680b583eb R12: ffff9d21ba0cd000
[    6.004509] R13: ffffffff8d95a460 R14: 0000000000000000 R15: 0000000000000020
[    6.004512] FS:  00007fad96cea480(0000) GS:ffff9d21bab80000(0000) knlGS:0000000000000000
[    6.004514] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    6.004515] CR2: 0000000000000068 CR3: 0000000178dec000 CR4: 00000000000006e0
[    6.004516] Call Trace:
[    6.004530]  ? debugfs_get_inode+0x50/0x50
[    6.022494]  vfs_get_super+0x9c/0xe0
[    6.022973]  vfs_get_tree+0x38/0xf0
[    6.023451]  do_mount+0x728/0xd20
[    6.023905]  ? _copy_from_user+0x37/0x60
[    6.024436]  ? memdup_user+0x39/0x60
[    6.024917]  ksys_mount+0x7b/0xd0
[    6.025368]  __x64_sys_mount+0x1c/0x20
[    6.025876]  do_syscall_64+0x43/0xf0
[    6.026375]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
 
Do I miss some other fix?

Thanks,
//richard



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
                   ` (5 preceding siblings ...)
  2019-03-21 12:48 ` Richard Weinberger
@ 2019-03-21 15:12 ` David Howells
  2019-03-21 15:16 ` David Howells
  7 siblings, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 15:12 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: dhowells, viro, linux-block, squashfs-devel, Marek Vasut,
	Brian Norris, Nicolas Pitre, Boris Brezillon, linux-mtd,
	David Woodhouse, Phillip Lougher, linux-fsdevel, linux-kernel

Richard Weinberger <richard@nod.at> wrote:

> [    6.004504] RIP: 0010:reconfigure_super+0x17/0x1e0

Can you load the kernel into gdb and do:

	i li *reconfigure_super+0x17

and disassemble the first 32 bytes of that function for me?

> Do I miss some other fix?

Don't think so - I hadn't noticed that it had oopsed since the crash was lost
in the log and it seemed to have booted otherwise normally.

Note that I don't know if a lot of the filesystems I've converted work because
I don't have a way to test all of them.


David

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
                   ` (6 preceding siblings ...)
  2019-03-21 15:12 ` David Howells
@ 2019-03-21 15:16 ` David Howells
  2019-03-21 15:41   ` Richard Weinberger
  2019-03-21 15:45   ` David Howells
  7 siblings, 2 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 15:16 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: dhowells, viro, linux-block, squashfs-devel, Marek Vasut,
	Brian Norris, Nicolas Pitre, Boris Brezillon, linux-mtd,
	David Woodhouse, Phillip Lougher, linux-fsdevel, linux-kernel

Bah.  The problem is that vfs_get_super() doesn't set fc->root before calling
reconfigure_super().

David

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 15:16 ` David Howells
@ 2019-03-21 15:41   ` Richard Weinberger
  2019-03-21 15:45   ` David Howells
  1 sibling, 0 replies; 13+ messages in thread
From: Richard Weinberger @ 2019-03-21 15:41 UTC (permalink / raw)
  To: David Howells
  Cc: viro, linux-block, squashfs-devel, Marek Vasut, Brian Norris,
	Nicolas Pitre, Boris Brezillon, linux-mtd, David Woodhouse,
	Phillip Lougher, linux-fsdevel, linux-kernel

Am Donnerstag, 21. März 2019, 16:16:26 CET schrieb David Howells:
> Bah.  The problem is that vfs_get_super() doesn't set fc->root before calling
> reconfigure_super().

Do you still need the disassembly?

Thanks,
//richard




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 15:16 ` David Howells
  2019-03-21 15:41   ` Richard Weinberger
@ 2019-03-21 15:45   ` David Howells
  2019-03-21 16:34     ` Richard Weinberger
  2019-03-21 17:06     ` David Howells
  1 sibling, 2 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 15:45 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: dhowells, viro, linux-block, squashfs-devel, Marek Vasut,
	Brian Norris, Nicolas Pitre, Boris Brezillon, linux-mtd,
	David Woodhouse, Phillip Lougher, linux-fsdevel, linux-kernel

Richard Weinberger <richard@nod.at> wrote:

> > Bah.  The problem is that vfs_get_super() doesn't set fc->root before
> > calling reconfigure_super().
> 
> Do you still need the disassembly?

Thanks, but no.  I've pushed replacement patches to my git branch.

David

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 15:45   ` David Howells
@ 2019-03-21 16:34     ` Richard Weinberger
  2019-03-21 17:06     ` David Howells
  1 sibling, 0 replies; 13+ messages in thread
From: Richard Weinberger @ 2019-03-21 16:34 UTC (permalink / raw)
  To: David Howells
  Cc: viro, linux-block, squashfs-devel, Marek Vasut, Brian Norris,
	Nicolas Pitre, Boris Brezillon, linux-mtd, David Woodhouse,
	Phillip Lougher, linux-fsdevel, linux-kernel

Am Donnerstag, 21. März 2019, 16:45:02 CET schrieb David Howells:
> Richard Weinberger <richard@nod.at> wrote:
> 
> > > Bah.  The problem is that vfs_get_super() doesn't set fc->root before
> > > calling reconfigure_super().
> > 
> > Do you still need the disassembly?
> 
> Thanks, but no.  I've pushed replacement patches to my git branch.

Just gave it a try, jffs2 does not mount anymore. The problem is that you define
an Opt_source in super.c, but never evaluate it -> jffs2_parse_param() returns
-EINVAL.

What I really don't get is the new logging stuff in include/linux/fs_context.h.
printk() is already an overloaded beat, why another layer?

The log output seems very odd to me:
[   13.117593] e MTD: Couldn't look up '/dev/mtd0': -15

Please notice the "e" before MTD, first I though this is a memory
corruption, but is your log level?!

Thanks,
//richard



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context
  2019-03-21 15:45   ` David Howells
  2019-03-21 16:34     ` Richard Weinberger
@ 2019-03-21 17:06     ` David Howells
  1 sibling, 0 replies; 13+ messages in thread
From: David Howells @ 2019-03-21 17:06 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: dhowells, viro, linux-block, squashfs-devel, Marek Vasut,
	Brian Norris, Nicolas Pitre, Boris Brezillon, linux-mtd,
	David Woodhouse, Phillip Lougher, linux-fsdevel, linux-kernel

Richard Weinberger <richard@nod.at> wrote:

> Just gave it a try, jffs2 does not mount anymore. The problem is that you
> define an Opt_source in super.c, but never evaluate it ->
> jffs2_parse_param() returns -EINVAL.

Will fix.

> What I really don't get is the new logging stuff in
> include/linux/fs_context.h.  printk() is already an overloaded beat, why
> another layer?

Because there are some patches that aren't upstream yet that allow you to read
these out through the file descriptor you control the mount process through
rather than them going into dmesg.

> The log output seems very odd to me:
> [   13.117593] e MTD: Couldn't look up '/dev/mtd0': -15
> 
> Please notice the "e" before MTD, first I though this is a memory
> corruption, but is your log level?!

Thanks - I'll fix that.

David

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-03-21 17:06 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-21 11:50 [RFC PATCH 0/6] Convert mount_single-using filesystems to fs_context David Howells
2019-03-21 11:50 ` [RFC PATCH 1/6] mtd: Provide fs_context-aware mount_mtd() replacement David Howells
2019-03-21 11:50 ` [RFC PATCH 2/6] romfs: Convert to fs_context David Howells
2019-03-21 11:50 ` [RFC PATCH 3/6] cramfs: " David Howells
2019-03-21 11:50 ` [RFC PATCH 4/6] jffs2: " David Howells
2019-03-21 11:52 ` [RFC PATCH 0/6] Convert mount_single-using filesystems " David Howells
2019-03-21 12:48 ` Richard Weinberger
2019-03-21 15:12 ` David Howells
2019-03-21 15:16 ` David Howells
2019-03-21 15:41   ` Richard Weinberger
2019-03-21 15:45   ` David Howells
2019-03-21 16:34     ` Richard Weinberger
2019-03-21 17:06     ` David Howells

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).