[PATCH v2 0/2] ubifs: add KUnit tests for scan and key helpers

Zhihao Cheng chengzhihao1 at huawei.com
Fri Sep 11 03:20:35 PDT 2026


在 2026/9/11 11:09, lichen.wang 写道:
> This series adds KUnit tests for fs/ubifs/scan.c and for the helpers in
> fs/ubifs/key.h, so that the node parsing code can be validated offline
> without an MTD device, a UBI volume or a development board.
> 
> Changes in v2:
>   - Use KUNIT_ASSERT_EQ() instead of KUNIT_EXPECT_EQ() for the
>     ubifs_add_snod() return value checks.  On -ENOMEM the function leaves
>     sleb->nodes empty, and list_first_entry()/list_next_entry() on an empty
>     list yield a pointer before the sleb allocation, so continuing after a
>     failed add would read out of bounds.  This affects expect_snod_keyed(),
>     add_snod_pad_node_gets_invalid_key(), add_snod_trun_node_gets_invalid_key()
>     and add_snod_appends_nodes_in_order().
>   - Assert on sleb->nodes_cnt in add_snod_appends_nodes_in_order() as well,
>     because the following list_next_entry() is only safe when both nodes were
>     really linked.
>   - Value checks that cannot be followed by a crash keep using KUNIT_EXPECT_*()
>     so that a single run still reports every mismatch.
>   - Link to v1: https://lore.kernel.org/all/178909365090.247910.11265261850560199708.p0-of-2@gmail.com/
> 
> Baseline:
> 
>    commit df2908090cda368b01ff43709f51890076c56157 ("Linux 7.3-rc2")
>    git describe --always of that commit: v7.3-rc2
>    (the describe string is that of the base commit itself; the patch
>    commits sit on top of it, so a describe run at their tip reports
>    v7.3-rc2-2-g3bcc6fa04 instead)
> 
> Motivation:
> 
> UBIFS has no test coverage for its on-flash parsing code: checking a
> change to scan.c or key.h currently means bringing up a real NAND
> device, a UBI volume and a board. KUnit makes the same checks run in a
> plain QEMU boot within seconds, and it is the established in-tree
> framework for this kind of unit testing, so the tests are reusable by
> anyone touching this code.

Hi lichen,
UBIFS testing can be deployed on QEMU with a nandsim or mtdram.
Current xfstests-dev and mtd-utils/tests/fs-tests could cover scanning 
and kinds ot processes. I am thinking that the ubifs scan logic(actually 
  it depends on disk data structure) hasn't been updated for a long 
time, do we still need to maintain a kunit test to detect issues arising 
from future code changes in ubifs scan?
> 
> Approach:
> 
>   - The tests are compiled into the ubifs module itself (ubifs-y) so
>     that they can call the non-exported ubifs_scan_a_node(),
>     ubifs_check_node(), ubifs_add_snod() and ubifs_end_scan() directly.
>     No EXPORT_SYMBOL() is added to production code.
>   - kunit_helpers.h builds a minimal fake struct ubifs_info with
>     kunit_kzalloc(); only the fields read by the tested paths are
>     initialised. The node length ranges mirror init_constants_early()
>     in super.c, because a zeroed range means "fixed length" for
>     ubifs_check_node() and would make the length checks pass for the
>     wrong reason.
>   - The node constructor fills the common header and payload first and
>     computes the CRC last with the kernel crc32(), over exactly the
>     bytes that ubifs_check_node() checksums.
> 
> Testing:
> 
> The whole suite runs with a single command:
> 
>    ./tools/testing/kunit/kunit.py run --arch=x86_64 --timeout=300 'ubifs*'
> 
> kunit.py exits 0 on the final tree and reports 5 suites and 80 cases,
> all passing:
> 
>    Testing complete. Ran 80 tests: passed: 80
> 
> with zero "not ok" lines in the KTAP output.
> 
> The fake ubifs_info environment was additionally checked against the
> real stack: a nandsim smoke test booted a kernel built from the
> baseline over a complete MTD -> UBI -> UBIFS stack, attached mtd0,
> created and mounted the volume and wrote and read back a file
> successfully.
> 
> Known limitations:
> 
>   - ubifs_scan() and ubifs_start_scan() are not covered by KUnit: the
>     UBI layer is not stubbed, so they would read from a real UBI volume
>     through ubi_leb_read(). They are exercised by the nandsim smoke test
>     instead.
>   - The tests build nodes in memory, so they cannot catch bugs in the
>     on-media layout itself; they only pin down the behaviour of the
>     parsing code for the layouts that UBIFS currently writes.
> 
> Notes:
> 
> checkpatch.pl --strict reports 0 errors for both patches. Each patch
> also carries the generic "added, moved or deleted file(s), does
> MAINTAINERS need updating?" warning; that reminder is emitted for every
> patch that adds a file, and the new files live under fs/ubifs/, which
> is already covered by the "UBI FILE SYSTEM (UBIFS)" entry in
> MAINTAINERS ("F: fs/ubifs/"), so no MAINTAINERS change is needed.
> 
> The cover letter itself draws one more warning from checkpatch.pl, a
> "Prefer a maximum 75 chars per line (possible unwrapped commit
> description?)" hint for a single line of the Changes in v2 list. That
> line is left unwrapped so that the four affected test names stay on
> one line and the list stays easy to scan; it is prose in the cover
> letter, not code or a changelog entry that a tool will reformat.
> 
> Signed-off-by: lichen.wang <wanglichen9110 at gmail.com>
> 
> lichen.wang (2):
>    ubifs: add KUnit test scaffolding for scan.c
>    ubifs: add KUnit tests for key helpers
> 
>   fs/ubifs/Kconfig               |  16 +
>   fs/ubifs/Makefile              |   1 +
>   fs/ubifs/tests/key_kunit.c     | 555 ++++++++++++++++++
>   fs/ubifs/tests/kunit_helpers.h | 222 ++++++++
>   fs/ubifs/tests/scan_kunit.c    | 988 +++++++++++++++++++++++++++++++++
>   5 files changed, 1782 insertions(+)
>   create mode 100644 fs/ubifs/tests/key_kunit.c
>   create mode 100644 fs/ubifs/tests/kunit_helpers.h
>   create mode 100644 fs/ubifs/tests/scan_kunit.c
> 
> --
> 2.43.0
> 
> 
> .
> 




More information about the linux-mtd mailing list