From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Burton Date: Tue, 20 Aug 2013 10:55:52 +0100 Subject: [U-Boot] [PATCH 3/3] cmd_ubi: add write.part command, to write a volume in multiple parts In-Reply-To: <5211E06F.50100@denx.de> References: <1375784029-9310-1-git-send-email-paul.burton@imgtec.com> <1375784029-9310-4-git-send-email-paul.burton@imgtec.com> <5211E06F.50100@denx.de> Message-ID: <52133D28.4060803@imgtec.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Thanks, I'll fix the style issues and send v2 soon. Paul On 19/08/13 10:07, Stefan Roese wrote: > 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 >> --- >> 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 >