Hi Paul,

On 06.08.2013 12:13, Paul Burton wrote:
> This allows you to write data to an UBI volume when the amount of memory
> available to write that data from is less than the total size of the
> data. For example, you may split a root filesystem UBIFS image into
> parts, provide the total size of the image to the first write.part
> command and then use multiple write.part commands to write the
> subsequent parts of the volume. This results in a sequence of commands
> akin to:
> 
>   ext4load mmc 0:1 0x80000000 rootfs.ubifs.0
>   ubi write.part 0x80000000 root 0x08000000 0x18000000
>   ext4load mmc 0:1 0x80000000 rootfs.ubifs.1
>   ubi write.part 0x80000000 root 0x08000000
>   ext4load mmc 0:1 0x80000000 rootfs.ubifs.2
>   ubi write.part 0x80000000 root 0x08000000
> 
> This would write 384MiB of data to the UBI volume 'root' whilst only
> requiring 128MiB of said data to be held in memory at a time.

Some coding-style (nitpicking) comments below.

> Signed-off-by: Paul Burton <paul.bur...@imgtec.com>
> ---
>  common/cmd_ubi.c | 62 
> ++++++++++++++++++++++++++++++++++++++++++--------------
>  doc/README.ubi   |  3 +++
>  2 files changed, 50 insertions(+), 15 deletions(-)
> 
> diff --git a/common/cmd_ubi.c b/common/cmd_ubi.c
> index 5ba4feb..dadb27b 100644
> --- a/common/cmd_ubi.c
> +++ b/common/cmd_ubi.c
> @@ -266,28 +266,15 @@ out_err:
>       return err;
>  }
>  
> -int ubi_volume_write(char *volume, void *buf, size_t size)
> +int ubi_volume_continue_write(char *volume, void *buf, size_t size)
>  {
>       int err = 1;
> -     int rsvd_bytes = 0;
>       struct ubi_volume *vol;
>  
>       vol = ubi_find_volume(volume);
>       if (vol == NULL)
>               return ENODEV;
>  
> -     rsvd_bytes = vol->reserved_pebs * (ubi->leb_size - vol->data_pad);
> -     if (size < 0 || size > rsvd_bytes) {
> -             printf("size > volume size! Aborting!\n");
> -             return EINVAL;
> -     }
> -
> -     err = ubi_start_update(ubi, vol, size);
> -     if (err < 0) {
> -             printf("Cannot start volume update\n");
> -             return -err;
> -     }
> -
>       err = ubi_more_update_data(ubi, vol, buf, size);
>       if (err < 0) {
>               printf("Couldnt or partially wrote data\n");
> @@ -314,6 +301,37 @@ int ubi_volume_write(char *volume, void *buf, size_t 
> size)
>       return 0;
>  }
>  
> +int ubi_volume_begin_write(char *volume, void *buf, size_t size,
> +     size_t full_size)
> +{
> +     int err = 1;
> +     int rsvd_bytes = 0;
> +     struct ubi_volume *vol;
> +
> +     vol = ubi_find_volume(volume);
> +     if (vol == NULL)
> +             return ENODEV;
> +
> +     rsvd_bytes = vol->reserved_pebs * (ubi->leb_size - vol->data_pad);
> +     if (size < 0 || size > rsvd_bytes) {
> +             printf("size > volume size! Aborting!\n");
> +             return EINVAL;
> +     }
> +
> +     err = ubi_start_update(ubi, vol, full_size);
> +     if (err < 0) {
> +             printf("Cannot start volume update\n");
> +             return -err;
> +     }
> +
> +     return ubi_volume_continue_write(volume, buf, size);
> +}
> +
> +int ubi_volume_write(char *volume, void *buf, size_t size)
> +{
> +     return ubi_volume_begin_write(volume, buf, size, size);
> +}
> +
>  int ubi_volume_read(char *volume, char *buf, size_t size)
>  {
>       int err, lnum, off, len, tbuf_size;
> @@ -588,7 +606,19 @@ static int do_ubi(cmd_tbl_t *cmdtp, int flag, int argc, 
> char * const argv[])
>               addr = simple_strtoul(argv[2], NULL, 16);
>               size = simple_strtoul(argv[4], NULL, 16);
>  
> -             ret = ubi_volume_write(argv[3], (void *)addr, size);
> +             if (strlen(argv[1]) == 10 &&
> +                 strncmp(argv[1] + 5, ".part", 5) == 0) {
> +                     if (argc < 6)
> +                             ret = ubi_volume_continue_write(argv[3],
> +                                             (void *)addr, size);

Please use braces for multi-line statements.

> +                     else {
> +                             size_t full_size;
> +                             full_size = simple_strtoul(argv[5], NULL, 16);
> +                             ret = ubi_volume_begin_write(argv[3],
> +                                             (void *)addr, size, full_size);
> +                     }

Especially when the other branch also uses braces.

> +             } else
> +                     ret = ubi_volume_write(argv[3], (void *)addr, size);

Here again, please braces since the other branch also uses them.

Thanks,
Stefan

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to