public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH 1/3] UBIFS, UBI: move volume string parser from UBIFS to UBI
@ 2016-08-27 19:43 Daniel Golle
  2016-08-28 16:42 ` Boris Brezillon
  0 siblings, 1 reply; 2+ messages in thread
From: Daniel Golle @ 2016-08-27 19:43 UTC (permalink / raw)
  To: linux-mtd
  Cc: Richard Weinberger, Ralph Sennhauser, Zoltan HERPAI,
	Hauke Mehrtens, lede-dev, openwrt-devel

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
 drivers/mtd/ubi/kapi.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
 fs/ubifs/super.c        | 64 +-----------------------------------------------
 include/linux/mtd/ubi.h |  1 +
 3 files changed, 67 insertions(+), 63 deletions(-)

diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
index e844887..3dda9c3 100644
--- a/drivers/mtd/ubi/kapi.c
+++ b/drivers/mtd/ubi/kapi.c
@@ -20,6 +20,7 @@
 
 /* This file mostly implements UBI kernel API functions */
 
+#include <linux/ctype.h>
 #include <linux/module.h>
 #include <linux/err.h>
 #include <linux/slab.h>
@@ -329,6 +330,69 @@ struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode)
 EXPORT_SYMBOL_GPL(ubi_open_volume_path);
 
 /**
+ * ubi_open_volume_str - parse UBI device name string and open the UBI device.
+ * @name: UBI volume name
+ * @mode: UBI volume open mode
+ *
+ * The primary method of mounting UBIFS is by specifying the UBI volume
+ * character device node path. However, UBIFS may also be mounted withoug any
+ * character device node using one of the following methods:
+ *
+ * o ubiX_Y    - mount UBI device number X, volume Y;
+ * o ubiY      - mount UBI device number 0, volume Y;
+ * o ubiX:NAME - mount UBI device X, volume with name NAME;
+ * o ubi:NAME  - mount UBI device 0, volume with name NAME.
+ *
+ * Alternative '!' separator may be used instead of ':' (because some shells
+ * like busybox may interpret ':' as an NFS host name separator). This function
+ * returns UBI volume description object in case of success and a negative
+ * error code in case of failure.
+ */
+struct ubi_volume_desc *ubi_open_volume_str(const char *name, int mode)
+{
+	struct ubi_volume_desc *ubi;
+	int dev, vol;
+	char *endptr;
+
+	/* First, try to open using the device node path method */
+	ubi = ubi_open_volume_path(name, mode);
+	if (!IS_ERR(ubi))
+		return ubi;
+
+	/* Try the "nodev" method */
+	if (name[0] != 'u' || name[1] != 'b' || name[2] != 'i')
+		return ERR_PTR(-EINVAL);
+
+	/* ubi:NAME method */
+	if ((name[3] == ':' || name[3] == '!') && name[4] != '\0')
+		return ubi_open_volume_nm(0, name + 4, mode);
+
+	if (!isdigit(name[3]))
+		return ERR_PTR(-EINVAL);
+
+	dev = simple_strtoul(name + 3, &endptr, 0);
+
+	/* ubiY method */
+	if (*endptr == '\0')
+		return ubi_open_volume(0, dev, mode);
+
+	/* ubiX_Y method */
+	if (*endptr == '_' && isdigit(endptr[1])) {
+		vol = simple_strtoul(endptr + 1, &endptr, 0);
+		if (*endptr != '\0')
+			return ERR_PTR(-EINVAL);
+		return ubi_open_volume(dev, vol, mode);
+	}
+
+	/* ubiX:NAME method */
+	if ((*endptr == ':' || *endptr == '!') && endptr[1] != '\0')
+		return ubi_open_volume_nm(dev, ++endptr, mode);
+
+	return ERR_PTR(-EINVAL);
+}
+EXPORT_SYMBOL_GPL(ubi_open_volume_str);
+
+/**
  * ubi_close_volume - close UBI volume.
  * @desc: volume descriptor
  */
@@ -365,6 +429,7 @@ void ubi_close_volume(struct ubi_volume_desc *desc)
 }
 EXPORT_SYMBOL_GPL(ubi_close_volume);
 
+
 /**
  * leb_read_sanity_check - does sanity checks on read requests.
  * @desc: volume descriptor
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index 1fd90c0..a59fa2f 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -1887,68 +1887,6 @@ const struct super_operations ubifs_super_operations = {
 	.sync_fs       = ubifs_sync_fs,
 };
 
-/**
- * open_ubi - parse UBI device name string and open the UBI device.
- * @name: UBI volume name
- * @mode: UBI volume open mode
- *
- * The primary method of mounting UBIFS is by specifying the UBI volume
- * character device node path. However, UBIFS may also be mounted withoug any
- * character device node using one of the following methods:
- *
- * o ubiX_Y    - mount UBI device number X, volume Y;
- * o ubiY      - mount UBI device number 0, volume Y;
- * o ubiX:NAME - mount UBI device X, volume with name NAME;
- * o ubi:NAME  - mount UBI device 0, volume with name NAME.
- *
- * Alternative '!' separator may be used instead of ':' (because some shells
- * like busybox may interpret ':' as an NFS host name separator). This function
- * returns UBI volume description object in case of success and a negative
- * error code in case of failure.
- */
-static struct ubi_volume_desc *open_ubi(const char *name, int mode)
-{
-	struct ubi_volume_desc *ubi;
-	int dev, vol;
-	char *endptr;
-
-	/* First, try to open using the device node path method */
-	ubi = ubi_open_volume_path(name, mode);
-	if (!IS_ERR(ubi))
-		return ubi;
-
-	/* Try the "nodev" method */
-	if (name[0] != 'u' || name[1] != 'b' || name[2] != 'i')
-		return ERR_PTR(-EINVAL);
-
-	/* ubi:NAME method */
-	if ((name[3] == ':' || name[3] == '!') && name[4] != '\0')
-		return ubi_open_volume_nm(0, name + 4, mode);
-
-	if (!isdigit(name[3]))
-		return ERR_PTR(-EINVAL);
-
-	dev = simple_strtoul(name + 3, &endptr, 0);
-
-	/* ubiY method */
-	if (*endptr == '\0')
-		return ubi_open_volume(0, dev, mode);
-
-	/* ubiX_Y method */
-	if (*endptr == '_' && isdigit(endptr[1])) {
-		vol = simple_strtoul(endptr + 1, &endptr, 0);
-		if (*endptr != '\0')
-			return ERR_PTR(-EINVAL);
-		return ubi_open_volume(dev, vol, mode);
-	}
-
-	/* ubiX:NAME method */
-	if ((*endptr == ':' || *endptr == '!') && endptr[1] != '\0')
-		return ubi_open_volume_nm(dev, ++endptr, mode);
-
-	return ERR_PTR(-EINVAL);
-}
-
 static struct ubifs_info *alloc_ubifs_info(struct ubi_volume_desc *ubi)
 {
 	struct ubifs_info *c;
@@ -2105,7 +2043,7 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,
 	 * because this might be a new mount point, and UBI allows only one
 	 * read-write user at a time.
 	 */
-	ubi = open_ubi(name, UBI_READONLY);
+	ubi = ubi_open_volume_str(name, UBI_READONLY);
 	if (IS_ERR(ubi)) {
 		pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d",
 		       current->pid, name, (int)PTR_ERR(ubi));
diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h
index 1e271cb..0b92aa5 100644
--- a/include/linux/mtd/ubi.h
+++ b/include/linux/mtd/ubi.h
@@ -241,6 +241,7 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode);
 struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
 					   int mode);
 struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode);
+struct ubi_volume_desc *ubi_open_volume_str(const char *pathname, int mode);
 
 int ubi_register_volume_notifier(struct notifier_block *nb,
 				 int ignore_existing);
-- 
2.9.3

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

* Re: [PATCH 1/3] UBIFS, UBI: move volume string parser from UBIFS to UBI
  2016-08-27 19:43 [PATCH 1/3] UBIFS, UBI: move volume string parser from UBIFS to UBI Daniel Golle
@ 2016-08-28 16:42 ` Boris Brezillon
  0 siblings, 0 replies; 2+ messages in thread
From: Boris Brezillon @ 2016-08-28 16:42 UTC (permalink / raw)
  To: Daniel Golle
  Cc: linux-mtd, Richard Weinberger, lede-dev, Zoltan HERPAI,
	Hauke Mehrtens, Ralph Sennhauser, openwrt-devel

On Sat, 27 Aug 2016 21:43:53 +0200
Daniel Golle <daniel@makrotopia.org> wrote:

No explanation on why you do that. Please make reviewers life easier
and explain what you're trying to achieve.

This patch on its own is not a problem, as long as you have another FS
base on UBI (I'm not talking about ubiblock) that is making use of it
at some point.

But that's not the purpose of this series: you're not adding any FS,
you're just adding ugly hacks in do_mounts.c (patch 3). But I'll
comment directly in there.

> Signed-off-by: Daniel Golle <daniel@makrotopia.org>
> ---
>  drivers/mtd/ubi/kapi.c  | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/ubifs/super.c        | 64 +-----------------------------------------------
>  include/linux/mtd/ubi.h |  1 +
>  3 files changed, 67 insertions(+), 63 deletions(-)
> 
> diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
> index e844887..3dda9c3 100644
> --- a/drivers/mtd/ubi/kapi.c
> +++ b/drivers/mtd/ubi/kapi.c
> @@ -20,6 +20,7 @@
>  
>  /* This file mostly implements UBI kernel API functions */
>  
> +#include <linux/ctype.h>
>  #include <linux/module.h>
>  #include <linux/err.h>
>  #include <linux/slab.h>
> @@ -329,6 +330,69 @@ struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode)
>  EXPORT_SYMBOL_GPL(ubi_open_volume_path);
>  
>  /**
> + * ubi_open_volume_str - parse UBI device name string and open the UBI device.
> + * @name: UBI volume name
> + * @mode: UBI volume open mode
> + *
> + * The primary method of mounting UBIFS is by specifying the UBI volume
> + * character device node path. However, UBIFS may also be mounted withoug any
> + * character device node using one of the following methods:
> + *
> + * o ubiX_Y    - mount UBI device number X, volume Y;
> + * o ubiY      - mount UBI device number 0, volume Y;
> + * o ubiX:NAME - mount UBI device X, volume with name NAME;
> + * o ubi:NAME  - mount UBI device 0, volume with name NAME.
> + *
> + * Alternative '!' separator may be used instead of ':' (because some shells
> + * like busybox may interpret ':' as an NFS host name separator). This function
> + * returns UBI volume description object in case of success and a negative
> + * error code in case of failure.
> + */
> +struct ubi_volume_desc *ubi_open_volume_str(const char *name, int mode)
> +{
> +	struct ubi_volume_desc *ubi;
> +	int dev, vol;
> +	char *endptr;
> +
> +	/* First, try to open using the device node path method */
> +	ubi = ubi_open_volume_path(name, mode);
> +	if (!IS_ERR(ubi))
> +		return ubi;
> +
> +	/* Try the "nodev" method */
> +	if (name[0] != 'u' || name[1] != 'b' || name[2] != 'i')
> +		return ERR_PTR(-EINVAL);
> +
> +	/* ubi:NAME method */
> +	if ((name[3] == ':' || name[3] == '!') && name[4] != '\0')
> +		return ubi_open_volume_nm(0, name + 4, mode);
> +
> +	if (!isdigit(name[3]))
> +		return ERR_PTR(-EINVAL);
> +
> +	dev = simple_strtoul(name + 3, &endptr, 0);
> +
> +	/* ubiY method */
> +	if (*endptr == '\0')
> +		return ubi_open_volume(0, dev, mode);
> +
> +	/* ubiX_Y method */
> +	if (*endptr == '_' && isdigit(endptr[1])) {
> +		vol = simple_strtoul(endptr + 1, &endptr, 0);
> +		if (*endptr != '\0')
> +			return ERR_PTR(-EINVAL);
> +		return ubi_open_volume(dev, vol, mode);
> +	}
> +
> +	/* ubiX:NAME method */
> +	if ((*endptr == ':' || *endptr == '!') && endptr[1] != '\0')
> +		return ubi_open_volume_nm(dev, ++endptr, mode);
> +
> +	return ERR_PTR(-EINVAL);
> +}
> +EXPORT_SYMBOL_GPL(ubi_open_volume_str);
> +
> +/**
>   * ubi_close_volume - close UBI volume.
>   * @desc: volume descriptor
>   */
> @@ -365,6 +429,7 @@ void ubi_close_volume(struct ubi_volume_desc *desc)
>  }
>  EXPORT_SYMBOL_GPL(ubi_close_volume);
>  
> +
>  /**
>   * leb_read_sanity_check - does sanity checks on read requests.
>   * @desc: volume descriptor
> diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> index 1fd90c0..a59fa2f 100644
> --- a/fs/ubifs/super.c
> +++ b/fs/ubifs/super.c
> @@ -1887,68 +1887,6 @@ const struct super_operations ubifs_super_operations = {
>  	.sync_fs       = ubifs_sync_fs,
>  };
>  
> -/**
> - * open_ubi - parse UBI device name string and open the UBI device.
> - * @name: UBI volume name
> - * @mode: UBI volume open mode
> - *
> - * The primary method of mounting UBIFS is by specifying the UBI volume
> - * character device node path. However, UBIFS may also be mounted withoug any
> - * character device node using one of the following methods:
> - *
> - * o ubiX_Y    - mount UBI device number X, volume Y;
> - * o ubiY      - mount UBI device number 0, volume Y;
> - * o ubiX:NAME - mount UBI device X, volume with name NAME;
> - * o ubi:NAME  - mount UBI device 0, volume with name NAME.
> - *
> - * Alternative '!' separator may be used instead of ':' (because some shells
> - * like busybox may interpret ':' as an NFS host name separator). This function
> - * returns UBI volume description object in case of success and a negative
> - * error code in case of failure.
> - */
> -static struct ubi_volume_desc *open_ubi(const char *name, int mode)
> -{
> -	struct ubi_volume_desc *ubi;
> -	int dev, vol;
> -	char *endptr;
> -
> -	/* First, try to open using the device node path method */
> -	ubi = ubi_open_volume_path(name, mode);
> -	if (!IS_ERR(ubi))
> -		return ubi;
> -
> -	/* Try the "nodev" method */
> -	if (name[0] != 'u' || name[1] != 'b' || name[2] != 'i')
> -		return ERR_PTR(-EINVAL);
> -
> -	/* ubi:NAME method */
> -	if ((name[3] == ':' || name[3] == '!') && name[4] != '\0')
> -		return ubi_open_volume_nm(0, name + 4, mode);
> -
> -	if (!isdigit(name[3]))
> -		return ERR_PTR(-EINVAL);
> -
> -	dev = simple_strtoul(name + 3, &endptr, 0);
> -
> -	/* ubiY method */
> -	if (*endptr == '\0')
> -		return ubi_open_volume(0, dev, mode);
> -
> -	/* ubiX_Y method */
> -	if (*endptr == '_' && isdigit(endptr[1])) {
> -		vol = simple_strtoul(endptr + 1, &endptr, 0);
> -		if (*endptr != '\0')
> -			return ERR_PTR(-EINVAL);
> -		return ubi_open_volume(dev, vol, mode);
> -	}
> -
> -	/* ubiX:NAME method */
> -	if ((*endptr == ':' || *endptr == '!') && endptr[1] != '\0')
> -		return ubi_open_volume_nm(dev, ++endptr, mode);
> -
> -	return ERR_PTR(-EINVAL);
> -}
> -
>  static struct ubifs_info *alloc_ubifs_info(struct ubi_volume_desc *ubi)
>  {
>  	struct ubifs_info *c;
> @@ -2105,7 +2043,7 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,
>  	 * because this might be a new mount point, and UBI allows only one
>  	 * read-write user at a time.
>  	 */
> -	ubi = open_ubi(name, UBI_READONLY);
> +	ubi = ubi_open_volume_str(name, UBI_READONLY);
>  	if (IS_ERR(ubi)) {
>  		pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d",
>  		       current->pid, name, (int)PTR_ERR(ubi));
> diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h
> index 1e271cb..0b92aa5 100644
> --- a/include/linux/mtd/ubi.h
> +++ b/include/linux/mtd/ubi.h
> @@ -241,6 +241,7 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode);
>  struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
>  					   int mode);
>  struct ubi_volume_desc *ubi_open_volume_path(const char *pathname, int mode);
> +struct ubi_volume_desc *ubi_open_volume_str(const char *pathname, int mode);
>  
>  int ubi_register_volume_notifier(struct notifier_block *nb,
>  				 int ignore_existing);

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

end of thread, other threads:[~2016-08-28 16:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-27 19:43 [PATCH 1/3] UBIFS, UBI: move volume string parser from UBIFS to UBI Daniel Golle
2016-08-28 16:42 ` Boris Brezillon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox