Skip to content
View in the app

A better way to browse. Learn more.

Armbian Community Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Odroid C2] filesystem corrupted after boot from emmc

Featured Replies

I created a new image for my Odroid C2 with the most current version of Armbian 5.26. Configuration was pretty much standard, except BOOTSIZE=0 and ROOTFS_TYPE=ext4. The image works fine, if dumped to a sdcard. When dumping it to an emmc card, the system boots up, but 'find / > /dev/null' leads to a filesystem error:

 

[   52.799920] EXT4-fs error (device mmcblk0p1): htree_dirblock_to_tree:913: inode #41001: block 12032: comm find: bad entry in directory: rec_len % 4 != 0 - offset=0(0), inode=8213, rec_len=4097, name_len=0
[   52.812862] EXT4-fs (mmcblk0p1): Remounting filesystem read-only

 

Behavior is deterministic - I tried with two different boards and two different emmc cards. I also checked, that the filesystem is initially ok on the emmc.

 

I tracked the problem down to the Amlogic mmc driver in linux kernel 3.14.y. During kernel boot, the function aml_sd_emmc_execute_tuning in drivers/amlogic/mmc/aml_sd_emmc.c is invoked. pdata->need_cali == 1 and aml_sd_emmc_execute_tuning_index is called. At the end, this function writes to the emmc: mmc_write_internal(mmc->card, record_blk, 1, write_buf).

The first two bytes of the written data are 0x2015, 0x1001 - which perfectly corresponds to the inode and rec_len from the error message above.

The position where the data is written at is calculated in emmc_partitions.c (function get_reserve_partition_off) and depends on several constants. The position evaluates to block #98304, which is somewhere in the root partition of the disk. Since in my image, this block is used by a directory inode, the filesystem gets corrupted.

 

On an image with a 64MB boot partition and an ext4 root partition, the write operation goes to the boot partition. It does not seem to have a negative impact on the consistency of the filesystem - at least not in my case.

 

I could imagine different solutions of the problem:

(1) set OFFSET=64 -> write operation will go to the unused space before boot / root partition

(2) change constants in linux kernel -> write operation will go to a different block on emmc (i cannot guess potential side effects of this)

(3) change partition layout on emmc by changing calculation in debootstrap-ng.sh

 

 

Best regards,

Michael

Hi Michael,

 

I have the same trouble with my emmc. Thought it is an hardwarre issue (till today) and bought a new one. Today, I did an apt update && apt upgrade on my Odroid C2 that works as a headless Server. During the update, I got the following entry in the syslog:

 

[1192245.968722] EXT4-fs error (device mmcblk0p1): ext4_find_dest_de:1639: inode #43529: block 12032: comm dpkg: bad entry in directory: rec_len % 4 != 0 - offset=0(0), inode=8213, rec_len=4097, name_len=0
[1192245.985979] Aborting journal on device mmcblk0p1-8.
[1192245.991429] EXT4-fs (mmcblk0p1): Remounting filesystem read-only
[1192245.997249] EXT4-fs error (device mmcblk0p1) in ext4_evict_inode:241: Journal has aborted
[1192246.007682] EXT4-fs error (device mmcblk0p1) in ext4_create:2249: IO failure
 
When I compare it with your log entry, it looks like the same Problem. Hope, there will be a fix soon.

I tracked the problem down to the Amlogic mmc driver in linux kernel 3.14.y. During kernel boot, the function aml_sd_emmc_execute_tuning in drivers/amlogic/mmc/aml_sd_emmc.c is invoked. pdata->need_cali == 1 and aml_sd_emmc_execute_tuning_index is called. At the end, this function writes to the emmc: mmc_write_internal(mmc->card, record_blk, 1, write_buf).

The first two bytes of the written data are 0x2015, 0x1001 - which perfectly corresponds to the inode and rec_len from the error message above.

The position where the data is written at is calculated in emmc_partitions.c (function get_reserve_partition_off) and depends on several constants. The position evaluates to block #98304, which is somewhere in the root partition of the disk. Since in my image, this block is used by a directory inode, the filesystem gets corrupted.

Thanks for investigations. This "calibration" looks strange and it will be disabled if not required for proper eMMC functioning (?), otherwise big OFFSET may work to solve this too.

  • Author

Igor, thanks for the quick change to the board configuration file. Setting an OFFSET seems to be the best solution - at least for new installations.

Unfortunately, OFFSET=12 is too low to solve the issue. The data is written to block #98304, which means that OFFSET has to be greater than 98304 / 2048. So OFFSET must be at least 49.

 

I also reported the issue to the Odroid people: http://forum.odroid.com/viewtopic.php?f=141&t=26097&sid=bdee0ffe9e7193c430136dd2cc2450a3

The promised to have a look at it. I will let you know, if they come up with a fix to the kernel source.

Guest
This topic is now closed to further replies.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.