Hello Heiko,

Sorry for the delay, I was pulled to another project. Just tested your patch 
and it seems to work. The mtd_devs parameter gets zeroed out when I call 
'ubi part <partition>' which calls do_ubi->ubi_part->ubi_exit which clears out 
the parameter, so when further we setup partitions, we start with index 0 in 
the mtd_dev_param[].

Thank you.

Regards,
Konstantyn

-----Original Message-----
From: Heiko Schocher [mailto:h...@denx.de] 
Sent: Thursday, January 29, 2015 4:04 AM
To: Konstantyn Prokopenko
Cc: u-boot@lists.denx.de
Subject: Re: [U-Boot] Problem Mounting/Unmounting several UBI volumes in u-boot.

Hello Konstantyn,

Am 21.01.2015 15:57, schrieb Konstantyn Prokopenko:
> Hello Heiko,
>
> I'll try the patch today.  Thank you very much!

Did you found time for trying it? I want to prepare a pull-request for ubi, and 
it would be nice to have fixed your problem too ;-)

bye,
Heiko
>
> Regards,
> Konstantyn
>
> -----Original Message-----
> From: Heiko Schocher [mailto:h...@denx.de]
> Sent: Wednesday, January 21, 2015 12:57 AM
> To: Konstantyn Prokopenko
> Cc: u-boot@lists.denx.de
> Subject: Re: [U-Boot] Problem Mounting/Unmounting several UBI volumes in 
> u-boot.
>
> Hello Konstantyn,
>
> Am 20.01.2015 17:09, schrieb Konstantyn Prokopenko:
>> Hello,
>>
>> I'm using the latest u-boot on our custom board. The u-boot is located on 
>> the NAND flash in the first 4MB partition. I break 256MB NAND into 4 MTD 
>> partitions: u-boot(4MB), kernel(4MB), rootfs(100MB), safefs(40MB), 
>> varfs(108MB).
>> We are using Freescale iMX6 processor (nitrogen6x BSP in u-boot). I've 
>> modified board support code to include our pad configurations and additional 
>> hardware.
>> Also I added misc driver for our system initialization. The driver would 
>> mount rootfs UBI fs on rootfs MTD partition and validate system. If failed, 
>> it would unmounts it and mount UBI fs on safefs MTD partition and load it.
>> The problem was with unmounting rootfs and initializing safefs partition. 
>> Here is the relevant portion of my initialization script:
>>                   "echo Loading just in case, default kernel from 
>> installation partition...;" \
>>                   "nand read 10800000 400000 400000;" \
>>                   "echo Configuring NAND flash for MTD...;" \
>>                   "mtdparts default; mtdparts;" \
>>                   "echo Mounting Root filesystem;" \
>>                   "ubi part rootfs;" \
>>                   "ubifsmount ubi0:rootfs;" \
>>                   "echo Verifying if filesystem and kernel is OK...;" \
>>                   "parallax validate 1 kernel;" \
>>                   "if test ${parallax_result} = 0; then " \
>>                       "echo Reading kernel file from rootfs....;" \
>>                   "else " \
>>                       "echo ROOTFS or Rootfs Kernel appears to be BAD. 
>> Trying SAFEFS...;" \
>>                       "ubifsumount;" \
>>                       "ubi part safefs;" \
>>                       "ubifsmount ubi0:safefs;" \
>>                       "parallax validate 2 kernel;" \
>>                       "if test ${parallax_result} = 0; then " \
>>                           "echo Reading kernel file from safefs....;" \
>>                       "else " \
>>                           "echo All FILESYSTEMS are bad, booting from MTD1 
>> kernel partition;" \
>>                           "nand read 10800000 400000 400000; bootm 
>> 10800000;" \
>>                       "fi;" \
>>                   "fi;" \
>>                   "ubifsload 10800000 kernel;" \
>>                   "ubifsumount;" \
>>                   "bootm 10800000;\0 " \
>>
>> The parallax module is our own driver which is relevant to our system 
>> operations. It tests for validity currently mounted partition. Nothing 
>> fancy, just a bunch of MD5 checks.
>> OK, I've digged into the MTD/UBI code and found the problem. When mounting 
>> the first partition, no matter which one, the mtd_dev_param[] array is 
>> populated with the MTD device parameters entry (the first mounted 
>> partition). The ubi_init() finds it first and successfully attaches it.
>> When unmounting this partition, the mtd_dev_param[] array still includes the 
>> same entry and when attempting to mount the second partition, the array 
>> includes two mtd_dev_param enties: The first one for already unmounted MTD 
>> partition and the second for the next candidate.
>> The ubi_init start accessing this array from ID0 and after trying to attach 
>> entry 0 errors out ignoring the second entry.
>> I've added a temporary hack to avoid this problem. Because UBIFS can mount 
>> only a signgle partition at a time, I've introduced a global parameter:
>> Char *device_to_attach[] which is populated when ubi_mtd_param_parse() is 
>> called.
>> Now, in ubi_init() I check if the current entry to the mtd_dev_array matches 
>> the device to attach. Also I added check for NULL if we are out of devices.
>> ...........
>>           /* Attach MTD devices */
>>           for (i = 0; i < mtd_devs; i++) {
>>                   struct mtd_dev_param *p = &mtd_dev_param[i];
>>                   struct mtd_info *mtd;
>>
>>                   if(p == NULL) {
>>                       printk(KERN_INFO "UBI_INIT: Could not find device: 
>> %s\n", device_to_attach);
>>                       err = -ENODEV;
>>                       goto out_slab;
>>                   }
>>                   if(strcmp(p->name, device_to_attach) != 0)
>>                           continue;
>> ................
>> This is a temp hack, just to make it work for our needs. Please advice if 
>> there are better ways or maybe we can just clean the mtd_dev_param array 
>> after unmounts being called.
>
> Can you try this patch?
>
> http://patchwork.ozlabs.org/patch/430909/
>
> bye,
> Heiko
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to