public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH 0/3] Add support for ubi environment to auto create volumes
@ 2026-04-17  2:35 Weijie Gao
  2026-04-17  2:35 ` [PATCH 1/3] cmd: ubi: expose more APIs to public Weijie Gao
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Weijie Gao @ 2026-04-17  2:35 UTC (permalink / raw)
  To: u-boot; +Cc: GSS_MTK_Uboot_upstream, Tom Rini, Marek Vasut, Weijie Gao

This patch series expose more ubi helpers to allow the ubi environment to
create ubi env volumes if not exist.

Weijie Gao (3):
  cmd: ubi: expose more APIs to public
  cmd: ubi: allow creating volume with all free spaces in ubi_create_vol
  env: ubi: add support to create environment volume if it does not
    exist

 cmd/ubi.c           | 16 ++++++++++------
 env/Kconfig         |  6 ++++++
 env/ubi.c           | 20 ++++++++++++++++++++
 include/ubi_uboot.h |  5 +++++
 4 files changed, 41 insertions(+), 6 deletions(-)

-- 
2.45.2


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

* [PATCH 1/3] cmd: ubi: expose more APIs to public
  2026-04-17  2:35 [PATCH 0/3] Add support for ubi environment to auto create volumes Weijie Gao
@ 2026-04-17  2:35 ` Weijie Gao
  2026-04-18  0:47   ` Simon Glass
  2026-04-17  2:35 ` [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol Weijie Gao
  2026-04-17  2:35 ` [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist Weijie Gao
  2 siblings, 1 reply; 7+ messages in thread
From: Weijie Gao @ 2026-04-17  2:35 UTC (permalink / raw)
  To: u-boot; +Cc: GSS_MTK_Uboot_upstream, Tom Rini, Marek Vasut, Weijie Gao

Export ubi_detach/ubi_create_vol/ubi_find_volume/ubi_remove_vol to
public for better ubi manipulation used by other modules.

Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
 cmd/ubi.c           | 10 +++++-----
 include/ubi_uboot.h |  5 +++++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/cmd/ubi.c b/cmd/ubi.c
index 93de6f3aea2..e7fd7165457 100644
--- a/cmd/ubi.c
+++ b/cmd/ubi.c
@@ -213,8 +213,8 @@ bad:
 	return err;
 }
 
-static int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
-			  bool skipcheck)
+int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
+		   bool skipcheck)
 {
 	struct ubi_mkvol_req req;
 	int err;
@@ -247,7 +247,7 @@ static int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
 	return ubi_create_volume(ubi, &req);
 }
 
-static struct ubi_volume *ubi_find_volume(char *volume)
+struct ubi_volume *ubi_find_volume(char *volume)
 {
 	struct ubi_volume *vol;
 	int i;
@@ -262,7 +262,7 @@ static struct ubi_volume *ubi_find_volume(char *volume)
 	return NULL;
 }
 
-static int ubi_remove_vol(char *volume)
+int ubi_remove_vol(char *volume)
 {
 	int err, reserved_pebs, i;
 	struct ubi_volume *vol;
@@ -635,7 +635,7 @@ static int ubi_set_skip_check(char *volume, bool skip_check)
 	return ubi_change_vtbl_record(ubi, vol->vol_id, &vtbl_rec);
 }
 
-static int ubi_detach(void)
+int ubi_detach(void)
 {
 #ifdef CONFIG_CMD_UBIFS
 	/*
diff --git a/include/ubi_uboot.h b/include/ubi_uboot.h
index ea0db69c72a..36b5b69dbfd 100644
--- a/include/ubi_uboot.h
+++ b/include/ubi_uboot.h
@@ -47,9 +47,14 @@
 extern int ubi_mtd_param_parse(const char *val, struct kernel_param *kp);
 extern int ubi_init(void);
 extern void ubi_exit(void);
+extern int ubi_detach(void);
 extern int ubi_part(char *part_name, const char *vid_header_offset);
 extern int ubi_volume_write(char *volume, void *buf, loff_t offset, size_t size);
 extern int ubi_volume_read(char *volume, char *buf, loff_t offset, size_t size);
+extern int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
+			  bool skipcheck);
+extern struct ubi_volume *ubi_find_volume(char *volume);
+extern int ubi_remove_vol(char *volume);
 
 extern struct ubi_device *ubi_devices[];
 int cmd_ubifs_mount(char *vol_name);
-- 
2.45.2


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

* [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol
  2026-04-17  2:35 [PATCH 0/3] Add support for ubi environment to auto create volumes Weijie Gao
  2026-04-17  2:35 ` [PATCH 1/3] cmd: ubi: expose more APIs to public Weijie Gao
@ 2026-04-17  2:35 ` Weijie Gao
  2026-04-18  0:47   ` Simon Glass
  2026-04-17  2:35 ` [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist Weijie Gao
  2 siblings, 1 reply; 7+ messages in thread
From: Weijie Gao @ 2026-04-17  2:35 UTC (permalink / raw)
  To: u-boot; +Cc: GSS_MTK_Uboot_upstream, Tom Rini, Marek Vasut, Weijie Gao

Although the ubi command itself supports creating volume with all
free spaces, the api ubi_create_vol() does not.

Since negative size in invalid, this patch replaces negative size
with all free space size in ubi_create_vol().

Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
 cmd/ubi.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/cmd/ubi.c b/cmd/ubi.c
index e7fd7165457..3a1d47d1942 100644
--- a/cmd/ubi.c
+++ b/cmd/ubi.c
@@ -226,7 +226,11 @@ int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
 
 	req.vol_id = vol_id;
 	req.alignment = 1;
-	req.bytes = size;
+
+	if (size < 0)
+		req.bytes = ubi->avail_pebs * ubi->leb_size;
+	else
+		req.bytes = size;
 
 	strcpy(req.name, volume);
 	req.name_len = strlen(volume);
-- 
2.45.2


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

* [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist
  2026-04-17  2:35 [PATCH 0/3] Add support for ubi environment to auto create volumes Weijie Gao
  2026-04-17  2:35 ` [PATCH 1/3] cmd: ubi: expose more APIs to public Weijie Gao
  2026-04-17  2:35 ` [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol Weijie Gao
@ 2026-04-17  2:35 ` Weijie Gao
  2026-04-18  0:47   ` Simon Glass
  2 siblings, 1 reply; 7+ messages in thread
From: Weijie Gao @ 2026-04-17  2:35 UTC (permalink / raw)
  To: u-boot; +Cc: GSS_MTK_Uboot_upstream, Tom Rini, Marek Vasut, Weijie Gao

Add an option to allow environment volume being auto created if not
exist.

Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
 env/Kconfig |  6 ++++++
 env/ubi.c   | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/env/Kconfig b/env/Kconfig
index 7abd82ab6f3..cec1bf0bb11 100644
--- a/env/Kconfig
+++ b/env/Kconfig
@@ -716,6 +716,12 @@ config ENV_UBI_VOLUME_REDUND
 	help
 	  Name of the redundant volume that you want to store the environment in.
 
+config ENV_UBI_VOLUME_CREATE
+	bool "Create UBI volume if not exist"
+	depends on ENV_IS_IN_UBI
+	help
+	  Create the UBI volume if it does not exist.
+
 config ENV_UBI_VID_OFFSET
 	int "ubi environment VID offset"
 	depends on ENV_IS_IN_UBI
diff --git a/env/ubi.c b/env/ubi.c
index e9865b45ebc..bbd86adf176 100644
--- a/env/ubi.c
+++ b/env/ubi.c
@@ -103,6 +103,18 @@ static int env_ubi_save(void)
 }
 #endif /* CONFIG_ENV_REDUNDANT */
 
+int __weak env_ubi_volume_create(const char *volume)
+{
+	struct ubi_volume *vol;
+
+	vol = ubi_find_volume((char *)volume);
+	if (vol)
+		return 0;
+
+	return ubi_create_vol((char *)volume, CONFIG_ENV_SIZE, true,
+			      UBI_VOL_NUM_AUTO, false);
+}
+
 #ifdef CONFIG_ENV_REDUNDANT
 static int env_ubi_load(void)
 {
@@ -132,6 +144,11 @@ static int env_ubi_load(void)
 		return -EIO;
 	}
 
+	if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE)) {
+		env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
+		env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME_REDUND);
+	}
+
 	read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1, 0,
 				     CONFIG_ENV_SIZE);
 	if (read1_fail)
@@ -169,6 +186,9 @@ static int env_ubi_load(void)
 		return -EIO;
 	}
 
+	if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE))
+		env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
+
 	if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, buf, 0, CONFIG_ENV_SIZE)) {
 		printf("\n** Unable to read env from %s:%s **\n",
 		       CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
-- 
2.45.2


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

* Re: [PATCH 1/3] cmd: ubi: expose more APIs to public
  2026-04-17  2:35 ` [PATCH 1/3] cmd: ubi: expose more APIs to public Weijie Gao
@ 2026-04-18  0:47   ` Simon Glass
  0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2026-04-18  0:47 UTC (permalink / raw)
  To: weijie.gao; +Cc: u-boot

Hi Weijie,

On 2026-04-17T02:35:14, Weijie Gao <weijie.gao@mediatek.com> wrote:
> cmd: ubi: expose more APIs to public
>
> Export ubi_detach/ubi_create_vol/ubi_find_volume/ubi_remove_vol to
> public for better ubi manipulation used by other modules.
>
> Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
>
> cmd/ubi.c           | 10 +++++-----
>  include/ubi_uboot.h |  5 +++++
>  2 files changed, 10 insertions(+), 5 deletions(-)

> diff --git a/include/ubi_uboot.h b/include/ubi_uboot.h
> @@ -47,9 +47,14 @@
> +extern int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
> +                       bool skipcheck);
> +extern struct ubi_volume *ubi_find_volume(char *volume);
> +extern int ubi_remove_vol(char *volume);

The volume parameter should be const char * since these functions do
not modify the string. In patch 3/3, env_ubi_volume_create() receives
a const char * and has to cast away const when calling these
functions. Please can you fix the signatures in both cmd/ubi.c and
ubi_uboot.h to take const char *volume.

Regards,
Simon

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

* Re: [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol
  2026-04-17  2:35 ` [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol Weijie Gao
@ 2026-04-18  0:47   ` Simon Glass
  0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2026-04-18  0:47 UTC (permalink / raw)
  To: weijie.gao; +Cc: u-boot

Hi Weijie,

On 2026-04-17T02:35:14, Weijie Gao <weijie.gao@mediatek.com> wrote:
> cmd: ubi: allow creating volume with all free spaces in ubi_create_vol
>
> Although the ubi command itself supports creating volume with all
> free spaces, the api ubi_create_vol() does not.
>
> Since negative size in invalid, this patch replaces negative size

is invalid

> with all free space size in ubi_create_vol().
>
> Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
>
> cmd/ubi.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)

> diff --git a/cmd/ubi.c b/cmd/ubi.c
> @@ -226,7 +226,11 @@ int ubi_create_vol(char *volume, int64_t size, int dynamic, int vol_id,
> +     if (size < 0)
> +             req.bytes = ubi->avail_pebs * ubi->leb_size;
> +     else
> +             req.bytes = size;

When size is negative, the printf() below still prints the original
negative size rather than the computed req.bytes

Regards,
Simon

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

* Re: [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist
  2026-04-17  2:35 ` [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist Weijie Gao
@ 2026-04-18  0:47   ` Simon Glass
  0 siblings, 0 replies; 7+ messages in thread
From: Simon Glass @ 2026-04-18  0:47 UTC (permalink / raw)
  To: weijie.gao; +Cc: u-boot

Hi Weijie,

On 2026-04-17T02:35:14, Weijie Gao <weijie.gao@mediatek.com> wrote:
> env: ubi: add support to create environment volume if it does not exist
>
> Add an option to allow environment volume being auto created if not
> exist.
>
> Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
>
> env/Kconfig |  6 ++++++
>  env/ubi.c   | 20 ++++++++++++++++++++
>  2 files changed, 26 insertions(+)

Could you beef up the Kconfig help text for ENV_UBI_VOLUME_CREATE -
e.g. mention when users might want to enable this, such as on first
boot of a fresh device where the UBI partition exists but no volumes
have been created yet.

> diff --git a/env/ubi.c b/env/ubi.c
> @@ -105,6 +105,18 @@ static int env_ubi_save(void)
> +int __weak env_ubi_volume_create(const char *volume)
> +{
> +     struct ubi_volume *vol;
> +
> +     vol = ubi_find_volume((char *)volume);

Does this function need to be weak?

ubi_find_volume() prints "Volume %s not found!" when the volume does
not exist. Since the whole point of this function is to handle missing
volumes, this message will appear every time auto-creation is used.
Please can you either add a quiet variant of ubi_find_volume(), or
suppress the message here?

> diff --git a/env/ubi.c b/env/ubi.c
> @@ -134,6 +146,11 @@ static int env_ubi_load(void)
> +     if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE)) {
> +             env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
> +             env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME_REDUND);
> +     }

The return value from env_ubi_volume_create() is not checked. If
volume creation fails (e.g. no space left), the subsequent
ubi_volume_read() will also fail, but the error message will not
indicate the underlying problem. Please can you check the return value
and print an appropriate message if creation fails?

Regards,
Simon

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

end of thread, other threads:[~2026-04-18  0:47 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-17  2:35 [PATCH 0/3] Add support for ubi environment to auto create volumes Weijie Gao
2026-04-17  2:35 ` [PATCH 1/3] cmd: ubi: expose more APIs to public Weijie Gao
2026-04-18  0:47   ` Simon Glass
2026-04-17  2:35 ` [PATCH 2/3] cmd: ubi: allow creating volume with all free spaces in ubi_create_vol Weijie Gao
2026-04-18  0:47   ` Simon Glass
2026-04-17  2:35 ` [PATCH 3/3] env: ubi: add support to create environment volume if it does not exist Weijie Gao
2026-04-18  0:47   ` Simon Glass

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