Patchwork [RFC,MTD-UTILS] : flash_lock: fix length being passed

login
register
mail settings
Submitter vimal singh
Date Dec. 2, 2009, 2:28 p.m.
Message ID <ce9ab5790912020628n5e91f811haa56b6380a71ab32@mail.gmail.com>
Download mbox | patch
Permalink /patch/40046/
State RFC
Headers show

Comments

vimal singh - Dec. 2, 2009, 2:28 p.m.
This patch fixes the 'length' calculation.
Making it:
+       mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
Rather:
-       mtdLockInfo.length = num_sectors * mtdInfo.erasesize;

Say there are 240 blocks present in the device. Then:
offset starts from: 0x0
and full size of device: 0x1E00000

doing: 240 * 0x20000 gives -> 0x1E00000
But last block address should be 0x1DE0000 (which spans for 0x20000
bytes, adding upto size of 0x1E00000)

Signed-off-by: Vimal Singh <vimalsingh@ti.com>
---
Artem Bityutskiy - Dec. 4, 2009, 8:41 a.m.
On Wed, 2009-12-02 at 19:58 +0530, Vimal Singh wrote:
> This patch fixes the 'length' calculation.
> Making it:
> +       mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
> Rather:
> -       mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
> 
> Say there are 240 blocks present in the device. Then:
> offset starts from: 0x0
> and full size of device: 0x1E00000
> 
> doing: 240 * 0x20000 gives -> 0x1E00000
> But last block address should be 0x1DE0000 (which spans for 0x20000
> bytes, adding upto size of 0x1E00000)
> 
> Signed-off-by: Vimal Singh <vimalsingh@ti.com>
> ---
> 
> --- flash_lock.c.org	2009-11-24 19:33:18.000000000 +0530
> +++ flash_lock.c	2009-11-24 19:33:13.000000000 +0530
> @@ -71,7 +71,7 @@ int main(int argc, char *argv[])
>  	}
> 
>  	mtdLockInfo.start = ofs;
> -	mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
> +	mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
>  	if(ioctl(fd, MEMLOCK, &mtdLockInfo))
>  	{
>  		fprintf(stderr, "Could not lock MTD device: %s\n", argv[1]);
> @@ -81,4 +81,3 @@ int main(int argc, char *argv[])

So if num_sectors is 1, mtdLockInfo.length is 0 - is it expected?
vimal singh - Dec. 7, 2009, 6:54 a.m.
On Fri, Dec 4, 2009 at 2:11 PM, Artem Bityutskiy <dedekind1@gmail.com> wrote:
> On Wed, 2009-12-02 at 19:58 +0530, Vimal Singh wrote:
>> This patch fixes the 'length' calculation.
>> Making it:
>> +       mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
>> Rather:
>> -       mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
>>
>> Say there are 240 blocks present in the device. Then:
>> offset starts from: 0x0
>> and full size of device: 0x1E00000
>>
>> doing: 240 * 0x20000 gives -> 0x1E00000
>> But last block address should be 0x1DE0000 (which spans for 0x20000
>> bytes, adding upto size of 0x1E00000)
>>
>> Signed-off-by: Vimal Singh <vimalsingh@ti.com>
>> ---
>>
>> --- flash_lock.c.org  2009-11-24 19:33:18.000000000 +0530
>> +++ flash_lock.c      2009-11-24 19:33:13.000000000 +0530
>> @@ -71,7 +71,7 @@ int main(int argc, char *argv[])
>>       }
>>
>>       mtdLockInfo.start = ofs;
>> -     mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
>> +     mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
>>       if(ioctl(fd, MEMLOCK, &mtdLockInfo))
>>       {
>>               fprintf(stderr, "Could not lock MTD device: %s\n", argv[1]);
>> @@ -81,4 +81,3 @@ int main(int argc, char *argv[])
>
> So if num_sectors is 1, mtdLockInfo.length is 0 - is it expected?

I think so. Suppose you want to lock 1st block: 'start' will be '0x0' and
if you pass 'length' as one block size then boundaries will be:

start: 0x0 ('0'th block)
end: 0x20000 (1st block)        if 0x20000 is the block size

so you will lock 2 blocks here.

While passing 'length' as '0' for this case will lock only 1st block
(0th block).
Artem Bityutskiy - Dec. 8, 2009, 12:19 p.m.
On Wed, 2009-12-02 at 19:58 +0530, Vimal Singh wrote:
> This patch fixes the 'length' calculation.
> Making it:
> +       mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
> Rather:
> -       mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
> 
> Say there are 240 blocks present in the device. Then:
> offset starts from: 0x0
> and full size of device: 0x1E00000
> 
> doing: 240 * 0x20000 gives -> 0x1E00000
> But last block address should be 0x1DE0000 (which spans for 0x20000
> bytes, adding upto size of 0x1E00000)
> 
> Signed-off-by: Vimal Singh <vimalsingh@ti.com>

Pushed, thanks!

Patch

--- flash_lock.c.org	2009-11-24 19:33:18.000000000 +0530
+++ flash_lock.c	2009-11-24 19:33:13.000000000 +0530
@@ -71,7 +71,7 @@  int main(int argc, char *argv[])
 	}

 	mtdLockInfo.start = ofs;
-	mtdLockInfo.length = num_sectors * mtdInfo.erasesize;
+	mtdLockInfo.length = (num_sectors - 1) * mtdInfo.erasesize;
 	if(ioctl(fd, MEMLOCK, &mtdLockInfo))
 	{
 		fprintf(stderr, "Could not lock MTD device: %s\n", argv[1]);
@@ -81,4 +81,3 @@  int main(int argc, char *argv[])

 	return 0;
 }
-