All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Burton <paul.burton@imgtec.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 3/3] cmd_ubi: add write.part command, to write a volume in multiple parts
Date: Tue, 20 Aug 2013 10:55:52 +0100	[thread overview]
Message-ID: <52133D28.4060803@imgtec.com> (raw)
In-Reply-To: <5211E06F.50100@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 <paul.burton@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
>

  reply	other threads:[~2013-08-20  9:55 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-06 10:13 [U-Boot] [PATCH 0/3] MTD & UBI fixes Paul Burton
2013-08-06 10:13 ` [U-Boot] [PATCH 1/3] mtd: driver _read() returns max_bitflips; mtd_read() returns -EUCLEAN Paul Burton
2013-08-19  8:55   ` Stefan Roese
2013-08-19 16:22     ` Scott Wood
2013-08-20  9:53     ` Paul Burton
2013-08-06 10:13 ` [U-Boot] [PATCH 2/3] cmd_mtdparts: use 64 bits for flash size, partition size & offset Paul Burton
2013-08-06 10:13 ` [U-Boot] [PATCH 3/3] cmd_ubi: add write.part command, to write a volume in multiple parts Paul Burton
2013-08-19  9:07   ` Stefan Roese
2013-08-20  9:55     ` Paul Burton [this message]
2013-08-27 11:53       ` Stefan Roese

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52133D28.4060803@imgtec.com \
    --to=paul.burton@imgtec.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.