[PATCH 0/1] ubifs: ubifs to export filesystem error counters

From: Stefan Schaeckeler
Date: Tue Sep 07 2021 - 17:41:12 EST


Not all ubifs filesystem errors are propagated to userspace, here is one
that is not propagaged to ls:

[node0_RP0_CPU0:~]$ls -la /mnt/mtd0
[562009.111309] UBIFS error (ubi0:0 pid 21670): ubifs_check_node [ubifs]: bad CRC: calculated 0x1b205ba3, read 0xb6eff0d9
[562009.123231] UBIFS error (ubi0:0 pid 21670): ubifs_check_node [ubifs]: bad node at LEB 112:29768
[562009.133042] magic 0x6101831
[562009.137312] crc 0xb6eff0d9
[562009.141678] node_type 2 (direntry node)
[562009.146706] group_type 1 (in node group)
[562009.151734] sqnum 334966
[562009.155709] len 82
[562009.159304] key (1, direntry, 0xe933a79)
[562009.164999] inum 546
[562009.168687] type 0
[562009.172186] nlen 25
[562009.175779] name inventor\xffffffff\xffffffff\xffffffff\xffffffffcal_log_4.txt
[562009.185308] CPU: 1 PID: 21670 Comm: ls Tainted: G O 4.8.28-WR9.0.0.20_cgl #1
[562009.185309] Hardware name: Insyde Harrisonville/Type2 - Board Product Name1, BIOS 00.01.017 10/26/2018
[562009.185312] 0000000000000286 00000000f877ad2e ffffbb5b8e357c50 ffffffff9b3cfaab
[562009.185316] 00000000ffffff8b 0000000000007448 ffffbb5b8e357c90 ffffffffc022c0dd
[562009.185320] 00000000687aa008 0000000000007448 0000000000000070 0000000000000052
[562009.185324] Call Trace:
[562009.185332] [<ffffffff9b3cfaab>] dump_stack+0x63/0x88
[562009.185345] [<ffffffffc022c0dd>] ubifs_check_node+0xbd/0x270 [ubifs]
[562009.185357] [<ffffffffc022db25>] ubifs_read_node+0x285/0x300 [ubifs]
[562009.185370] [<ffffffffc024dfc7>] ubifs_tnc_read_node+0x127/0x1c0 [ubifs]
[562009.185382] [<ffffffffc0230115>] ? matches_name+0x45/0xf0 [ubifs]
[562009.185394] [<ffffffffc022ed9a>] tnc_read_node_nm+0xfa/0x220 [ubifs]
[562009.185407] [<ffffffffc02330a4>] ubifs_tnc_next_ent+0x1f4/0x2a0 [ubifs]
[562009.185411] [<ffffffff9b1f405e>] ? filldir+0xce/0x150
[562009.185422] [<ffffffffc02244f8>] ubifs_readdir+0x188/0x4d0 [ubifs]
[562009.185425] [<ffffffff9b1f3e62>] iterate_dir+0x172/0x190
[562009.185429] [<ffffffff9b124e4a>] ? __audit_syscall_entry+0xba/0x100
[562009.185432] [<ffffffff9b1f4399>] SyS_getdents+0x99/0x120
[562009.185434] [<ffffffff9b1f3f90>] ? fillonedir+0x110/0x110
[562009.185437] [<ffffffff9b002b76>] do_syscall_64+0x66/0x180
[562009.185441] [<ffffffff9b8b9fce>] entry_SYSCALL_64_after_swapgs+0x58/0xc6
[562009.185454] UBIFS error (ubi0:0 pid 21670): ubifs_read_node [ubifs]: expected node type 2
[562009.194705] UBIFS error (ubi0:0 pid 21670): ubifs_readdir [ubifs]: cannot find next direntry, error -117
total 1080
drwxr-xr-x. 2 root root 3728 Jul 3 10:36 .
drwxrwxrwt. 5 root root 120 Jul 3 10:36 ..
-rw-rw-rw-. 1 root root 5413 May 24 10:59 alarm_0_PM1_remote_log_1.txt
-rw-rw-rw-. 1 root root 1 Sep 19 2020 alarm_banner.txt
-rw-rw-rw-. 1 root root 65465 Nov 5 2020 alarm_local_log_29.txt
-rw-rw-rw-. 1 root root 55441 Dec 18 2020 alarm_local_log_30.txt
-rw-rw-rw-. 1 root root 64826 Sep 20 2020 alarm_local_log_31.txt
-rw-rw-rw-. 1 root root 65019 Oct 25 2020 alarm_local_log_32.txt
-rw-rw-rw-. 1 root root 65880 Oct 26 2020 alarm_local_log_33.txt
-rw-rw-rw-. 1 root root 66296 Apr 17 10:35 alarm_local_log_34.txt
-rw-rw-rw-. 1 root test 64734 May 5 20:35 alarm_local_log_35.txt
-rw-rw-rw-. 1 root root 64924 Jun 4 07:39 alarm_local_log_36.txt
-rw-rw-rw-. 1 root root 50830 Jul 8 13:21 alarm_local_log_37.txt
-rw-rw-rw-. 1 root root 1 Sep 21 2020 fpd_banner.txt
-rw-rw-rw-. 1 root root 28518 Jul 2 23:19 fpd_local_log_2.txt
-rw-rw-rw-. 1 root root 96 Jul 9 22:37 int_uptime_dashboard.dat
-rw-rw-rw-. 1 root iosxr 540 Jun 8 00:06 inventory_local_log_1.txt
-rw-rw-rw-. 1 root iosxr 540 Jul 2 23:26 inventory_local_log_2.txt
-rw-rw-rw-. 1 root root 79293 Jul 3 10:37 inventory_local_log_3.txt
-rw-rw-rw-. 1 root test 4 Apr 17 10:33 obfl_data_version.dat
-rw-rw-rw-. 1 root root 364 Sep 19 2020 temperature_banner.txt
-rw-rw-rw-. 1 root root 19567 Dec 18 2020 temperature_local_log_3.txt
-rw-rw-rw-. 1 root root 65607 Sep 20 2020 temperature_local_log_4.txt
-rw-rw-rw-. 1 root root 66410 Apr 17 10:34 temperature_local_log_5.txt
-rw-rw-rw-. 1 root test 65607 Jun 1 21:26 temperature_local_log_6.txt
-rw-rw-rw-. 1 root root 54097 Jul 3 10:37 temperature_local_log_7.txt
-rw-rw-rw-. 1 root root 65160 Jun 25 23:56 voltage_local_log_10.txt
-rw-rw-rw-. 1 root root 28236 Jul 3 10:37 voltage_local_log_11.txt
[node0_RP0_CPU0:~]$echo $?
0

A direntry node got corrupted. The filename inventory_local_log_4.txt got
corrupted to inventor\xffffffff\xffffffff\xffffffff\xffffffffcal_log_4.txt
and is not passed down to ls. ls exits with a clean exit code of 0.

We can't really detect this corruption from user space. This is required to
take action such as for a fresh start with re-creating the filesystem.

Every access to the mounted filesystem results in a kernel backtrace. This
trashes the dmesg buffer and the systemd journal over time.


This patch introduces a sysfs filesystem for ubifs. The first three sysfs
nodes are error counters:

/sys/fs/ubifs/ubiX_Y/errors_magic
/sys/fs/ubifs/ubiX_Y/errors_node
/sys/fs/ubifs/ubiX_Y/errors_crc

This allows userspace to notice filesystem corruption. Over time, more
sysfs nodes can be added.

Stefan Schaeckeler (1):
ubifs: ubifs to export filesystem error counters

fs/ubifs/Makefile | 2 +-
fs/ubifs/io.c | 6 ++
fs/ubifs/super.c | 17 ++++-
fs/ubifs/sysfs.c | 187 ++++++++++++++++++++++++++++++++++++++++++++++
fs/ubifs/sysfs.h | 39 ++++++++++
fs/ubifs/ubifs.h | 11 +++
6 files changed, 260 insertions(+), 2 deletions(-)
create mode 100644 fs/ubifs/sysfs.c
create mode 100644 fs/ubifs/sysfs.h

--
2.32.0