A f2fs partition on my Android phone has recently become corrupted. It will still mount fine; however, I completely lost access to one directory (/data/media/0
), which now shows as empty. Yet the disk space hasn't changed at all.
When running fsck.f2fs
from the terminal, it refuses to check on a mounted filesystem. I cannot unmount the data partition or remount it as read-only. Fine. After rebooting under recovery mode, where the partition is not mounted, I get this when running fsck.f2fs
:
~ # fsck.f2fs /dev/block/mmcblk0p39
Info: sector size = 512
Info: total sectors = 21425920 (in 512bytes)
Assertion failed!
[fsck_chk_dentry_blk: 563] le32_to_cpu(de_blk->dentry[i].hash_code) == hash_code
So it still refuses to help me and it now fails with an obscure error… stat
ing the directory gives me:
root@victara:/ # stat /data/media/0
File: `/data/media/0'
Size: 4096 Blocks: 24 IO Blocks: 4096 directory
Device: 10307h/66311d Inode: 4 Links: 35
Access: (770/drwxrwx---) Uid: (1023/media_rw) Gid: (1023/media_rw)
Access: 2016-04-04 16:55:56.800148001
Modify: 2016-04-05 02:47:44.314999998
Change: 2016-04-05 02:47:44.314999998
The inode (number?) seemed to be quite low… So I checked other directories:
root@victara:/ # stat /data/media/
File: '/data/media/'
Size: 4096 Blocks: 16 IO Block: 4096 directory
Device: 10307h/66311d Inode: 4078 Links: 4
Access: (0770/drwxrwx---) Uid: ( 1023/media_rw) Gid: ( 1023/media_rw)
__bionic_open_tzdata: couldn't find any tzdata when looking for localtime!
__bionic_open_tzdata: couldn't find any tzdata when looking for GMT!
__bionic_open_tzdata: couldn't find any tzdata when looking for posixrules!
Access: 2016-04-04 14:48:25.000000000
Modify: 1970-01-01 02:27:21.000000000
Change: 1970-02-07 02:30:36.000000000
root@victara:/ # stat /data/media/obb
File: `/data/media/obb'
Size: 4096 Blocks: 16 IO Blocks: 4096 directory
Device: 10307h/66311d Inode: 4080 Links: 3
Access: (775/drwxrwxr-x) Uid: (1023/media_rw) Gid: (1023/media_rw)
Access: 1970-01-01 03:27:21.519999999
Modify: 2016-03-17 22:38:30.505748550
Change: 2016-04-04 17:42:31.569999988
It looks like the parent dir (/data/media
) has inode 4078, another child of the parent (/data/media/obb
) has inode 4080. So, logically, /data/media/0
should have inode 4079, but stat
tells me it has inode 4.
So it looks like the filesystem metadata got corrupted. Without help from fsck.f2fs
and debugfs
(which sadly doesn't exist for f2fs), and in a pretty minimal Linux environment (Android recovery), is there a way I can correct the inode number or something else I can do to recover access to my data?
Interestingly, the directory still seems to be taking up disk space, and it is considered as "not empty" so I cannot remove it.
root@victara:/data/media # rm -rf 0
rm: 0: Directory not empty
1|root@victara:/data/media # ls
0 obb
root@victara:/data/media # ls -al 0
total 0
IMPORTANT: I cannot test solutions anymore since I need the phone and the storage space and reformatted the partition.
Best Answer
"Assertion failed" means an internal error in the program, in this case in
fsck.f2fs
. Basically it means that something the programmer expected to be always true, wasn't.A production-grade program should always deal with errors with something better than "assertion failed" messages - at minimum, it should give a more descriptive error message. Sometimes an "assertion failed" error means you're hitting a rare corner case the developer is aware of, but hasn't implemented yet.
In this case, the only option is to see if there is a newer version of the program available, and hope that it's been updated to handle situations like this in some sensible fashion. If a newer version is only available in source code form from the upstream developer, and it fixes the problem, it might be necessary to send a bug report to the maintainer of your Linux distribution, indicating that the distribution should either package the updated version, or backport the relevant patch.
If the newest source code version from the upstream developer cannot handle this either, it's definitely time to send a bug report to the developer.