diff mbox series

[mtd-utils,v2,RESEND,101/102] tests: ubifs_tools: Add README

Message ID 20241111090832.2093596-32-chengzhihao1@huawei.com
State Accepted
Delegated to: David Oberhollenzer
Headers show
Series Add fsck.ubifs support | expand

Commit Message

Zhihao Cheng Nov. 11, 2024, 9:08 a.m. UTC
Add document for fsck.ubifs and mkfs.ubifs testcases, explain all
testcases and how to run them.

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
---
 tests/ubifs_tools-tests/README.txt | 303 +++++++++++++++++++++++++++++++++++++
 1 file changed, 303 insertions(+)
 create mode 100644 tests/ubifs_tools-tests/README.txt
diff mbox series

Patch

diff --git a/tests/ubifs_tools-tests/README.txt b/tests/ubifs_tools-tests/README.txt
new file mode 100644
index 00000000..9e94c22c
--- /dev/null
+++ b/tests/ubifs_tools-tests/README.txt
@@ -0,0 +1,303 @@ 
+
+ ubifs_tools tests
+ ==================
+
+ There are seven testcases for fsck.ubifs on encryption/non-encryption
+ situations:
+   1) authentication_refuse: Currently authenticated UBIFS image is not
+      supported for fsck.ubifs, check whether fsck.ubifs can refuse the
+      authenticated UBIFS image.
+   2) random_corrupted_fsck: Inject random corruption on UBIFS image
+      by writing random data on kinds of mtd devices (eg. nand, nor),
+      check the consistency of UBIFS after fsck.
+      This testcase simulate random bad UBIFS image caused by hardware
+      exceptions(eg. ecc uncorrectable, unwritten), and makes sure that
+      fsck.ubifs could make UBIFS be consistent after repairing UBIFS
+      image.
+   3) cycle_corrupted_fsck_fault_inject: Inject memory/io fault while
+      doing fsck for corrupted UBIFS images.
+      This testcase mainly checks whether fsck.ubifs has problems (eg.
+      UAF, null-ptr-def, etc.) in random error paths. Besides, it
+      provides a similar way to simulate powercut during fsck, and
+      checks whether the fsck.ubifs can fix an UBIFS image after many
+      rounds interrupted by kinds of errors.
+   4) cycle_powercut_mount_fsck: Inject powercut while doing fsstress
+      on mounted UBIFS, check the consistency of UBIFS after fsck.
+      This testscase mainly makes sure that fsck.ubifs can make UBIFS
+      image be consistent in common stress cases and powercut cases.
+   5) powercut_fsck_mount: Inject powercut while doing fsstress on
+      mounted UBIFS for kinds of flashes (eg. nand, nor).
+      This testcase mainly makes sure that fsck.ubifs can make UBIFS
+      image be consistent on different flashes (eg. nand, nor). Because
+      the min_io_size of nor flash is 1, the UBIFS image on nor flash
+      will be different from nand flash after doing powercut, so we need
+      make sure fsck.ubifs can handle these two types of flash.
+   6) cycle_mount_fsck_check: Do fsstress and fsck ubifs image, make
+      sure all files(and their data) are not lost after fsck.
+      This testcase mainly checks whether fsck.ubifs could corrupt the
+      filesystem content in common case.
+   7) fsck_bad_image: For kinds of inconsistent UBIFS images(which
+      can simulate corruptions caused by some potentional UBIFS bug), check
+      the result of fsck.
+      This testcase mainly checks whether the behavior is in expected after
+      repairing specific inconsistent UBIFS image. There is no debugfs tools
+      (for example: debugfs[ext4], xfs_db) for UBIFS, so no way to inject
+      precise corruption into UBIFS image, we have to prepare inconsistent
+      UBIFS images in advance like e2fsprogs[1] does. (Goto [2] to see how to
+      generate inconsistent UBIFS images).
+      Original UBIFS image content:
+      /
+      ├── corrupt_file (xattr - user.corrupt:123, 2K data)
+      ├── dir
+      │   ├── block_dev
+      │   ├── char_dev
+      │   ├── dir
+      │   └── file (content: '123')
+      ├── hardl_corrupt_file => corrupt_file
+      └── softl_corrupt_file -> corrupt_file
+      Here's a descriptons of the various test images:
+      =========================================================================
+            image         |     Description     |          expectancy
+      -------------------------------------------------------------------------
+      good                | good image contains | fsck success, fs content is
+                          | kinds of files.     | not changed.
+      -------------------------------------------------------------------------
+      sb_fanout           | invalid fanout in   | fsck failed.
+                          | superblock.         |
+      -------------------------------------------------------------------------
+      sb_fmt_version      | invalid fmt_version | fsck failed.
+                          | in superblock.      |
+      -------------------------------------------------------------------------
+      sb_leb_size         | invalid leb_size in | fsck failed.
+                          | superblock.         |
+      -------------------------------------------------------------------------
+      sb_log_lebs         | invalid log lebs in | fsck failed.
+                          | superblock.         |
+      -------------------------------------------------------------------------
+      sb_min_io_size      | invalid min_io_size | fsck failed.
+                          | in superblock.      |
+      -------------------------------------------------------------------------
+      master_highest_inum | invalid highest_inum| fsck success, fs content is
+                          | in master nodes.    | not changed.
+      -------------------------------------------------------------------------
+      master_lpt          | bad lpt pos in      | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      master_tnc          | bad tnc pos in      | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      master_total_dead   | bad total_dead in   | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      master_total_dirty  | bad total_dirty in  | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      master_total_free   | bad total_free in   | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      journal_log         | corrupted log area. | fsck success, fs content is
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      journal_bud         | corrupted bud area. | fsck success, file data is
+                          |                     | lost.
+      -------------------------------------------------------------------------
+      orphan_node         | bad orphan node.    | fsck success, file is
+                          |                     | deleted as expected.
+      -------------------------------------------------------------------------
+      lpt_dirty           | bad dirty in pnode. | fsck success, fs content is
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      lpt_flags           | bad flags in pnode  | fsck success, fs content is
+                          | (eg. index).        | not changed.
+      -------------------------------------------------------------------------
+      lpt_free            | bad free in pnode.  | fsck success, fs content is
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      lpt_pos             | bad pos in nnode.   | fsck success, fs content is
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      ltab_dirty          | bad dirty in lprops | fsck success, fs content is
+                          | table.              | not changed.
+      -------------------------------------------------------------------------
+      ltab_free           | bad free in lprops  | fsck success, fs content is
+                          | table.              | not changed.
+      -------------------------------------------------------------------------
+      index_size          | bad index size in   | fsck success, fs content is
+                          | master nodes.       | not changed.
+      -------------------------------------------------------------------------
+      tnc_lv0_key         | bad key in lv0      | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      tnc_lv0_len         | bad len in lv0      | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      tnc_lv0_pos         | bad pos in lv0      | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      tnc_noleaf_key      | bad key in non-leaf | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      tnc_noleaf_len      | bad len in non-leaf | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      tnc_noleaf_pos      | bad pos in non-leaf | fsck success, fs content is
+                          | znode.              | not changed.
+      -------------------------------------------------------------------------
+      corrupted_data_leb  | corrupted data leb. | fsck success, partial data of
+                          |                     | file is lost.
+      -------------------------------------------------------------------------
+      corrupted_idx_leb   | corrupted index leb.| fsck success, fs content is
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      inode_data          | bad data node.      | fsck success, file content
+                          |                     | is changed, other files are
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      inode_mode          | bad inode mode for  | fsck success, file is
+                          | file.               | dropped, other files are not
+                          |                     | changed.
+      -------------------------------------------------------------------------
+      inode_nlink         | wrong nlink for     | fsck success, nlink is
+                          | file.               | corrected, fs content is not
+                          |                     | changed.
+      -------------------------------------------------------------------------
+      inode_size          | wrong inode size    | fsck success, inode size is
+                          | for file.           | corrected, fs content is not
+                          |                     | changed.
+      -------------------------------------------------------------------------
+      inode_xcnt          | wrong inode         | fsck success, xattr_cnt is
+                          | xattr_cnt for file. | corrected, fs content is not
+                          |                     | changed.
+      -------------------------------------------------------------------------
+      soft_link_inode_mode| bad inode mode for  | fsck success, soft link
+                          | solf link file.     | file is dropped, other files
+                          |                     | are not changed.
+      -------------------------------------------------------------------------
+      soft_link_data_len  | bad inode data_len  | fsck success, soft link
+                          | for solt link file. | file is dropped, other files
+                          |                     | are not changed.
+      -------------------------------------------------------------------------
+      dentry_key          | bad dentry key for  | fsck success, dentry is
+                          | file.               | removed, other files are
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      dentry_nlen         | inconsistent nlen   | fsck success, dentry is
+                          | and name in dentry  | removed, other files are
+                          | for file.           | not changed.
+      -------------------------------------------------------------------------
+      dentry_type         | inconsistent type   | fsck success, dentry is
+                          | between dentry and  | removed, other files are
+                          | inode for file.     | not changed.
+      -------------------------------------------------------------------------
+      xinode_flags        | lost UBIFS_XATTR_FL | fsck success, xattr is
+                          | in xattr inode      | removed, other files are
+                          | flags for file.     | not changed.
+      -------------------------------------------------------------------------
+      xinode_key          | bad xattr inode key | fsck success, xattr is
+                          | for file.           | removed, other files are
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      xinode_mode         | bad xattr inode     | fsck success, xattr is
+                          | mode for file.      | removed, other files are
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      xentry_key          | bad xattr entry key | fsck success, xattr is
+                          | for file.           | removed, other files are
+                          |                     | not changed.
+      -------------------------------------------------------------------------
+      xentry_nlen         | inconsistent nlen   | fsck success, xattr is
+                          | and name in xattr   | removed, other files are
+                          | entry for file.     | not changed.
+      -------------------------------------------------------------------------
+      xentry_type         | inconsistent type   | fsck success, xattr is
+                          | between xattr entry | removed, other files are
+                          | and xattr inode for | not changed.
+                          | file.               |
+      -------------------------------------------------------------------------
+      xent_host           | the xattr's host    | fsck success, file, hard
+                          | is a xattr too, the | link and soft link are
+                          | flag of corrupt_file| dropped, other files are
+                          | inode is modified.  | not changed.
+      -------------------------------------------------------------------------
+      dir_many_dentry     | dir has too many    | fsck success, hard link is
+                          | dentries, the dentry| dropped, other files are not
+                          | of hard link is     | changed.
+                          | modified.           |
+      -------------------------------------------------------------------------
+      dir_lost            | bad dentry for dir. | fsck success, the 'file' is
+                          |                     | recovered under lost+found,
+                          |                     | left files under dir are
+                          |                     | removed, other files are not
+                          |                     | changed.
+      -------------------------------------------------------------------------
+      dir_lost_duplicated | bad inode for dir,  | fsck success, the 'file' is
+                          | there is a file     | recovered with INO_<inum>_1
+                          | under lost+found,   | under lost+found, left files
+                          | which named with the| under dir are removed, other
+                          | inum of the 'file'. | files are not changed.
+      -------------------------------------------------------------------------
+      dir_lost_not_recover| bad inode for dir,  | fsck success, all files
+                          | lost+found is a     | under dir are removed,
+                          | regular file and    | other files are not changed.
+                          | exists under root   |
+                          | dir.                |
+      -------------------------------------------------------------------------
+      root_dir            | bad '/'.            | fsck success, create new
+                          |                     | root dir('/'). All regular
+                          |                     | files are reocovered under
+                          |                     | lost+found, other files are
+                          |                     | removed.
+      -------------------------------------------------------------------------
+      empty_tnc           | all files have bad  | fsck success, fs content
+                          | inode.              | becomes empty.
+      =========================================================================
+
+ There is one testcase for mkfs.ubifs on encryption/non-encryption
+ situations:
+ 1) build_fs_from_dir: Initialize UBIFS image from a given directory, then
+    check whether the fs content in mounted UBIFS is consistent with the
+    original directory. Both UBI volume and file are chosen as storage
+    mediums to test. This testcase mainly ensures that mkfs.ubifs can
+    format an UBIFS image as user expected.
+
+ Dependence
+ ----------
+ kernel configs:
+   CONFIG_MTD_NAND_NANDSIM=m
+   CONFIG_MTD_MTDRAM=m
+   CONFIG_MTD_UBI=m
+   CONFIG_UBIFS_FS=m
+   CONFIG_UBIFS_FS_XATTR=y
+   CONFIG_UBIFS_FS_AUTHENTICATION=y
+   CONFIG_FS_ENCRYPTION=y
+   CONFIG_FAILSLAB=y
+   CONFIG_FAIL_PAGE_ALLOC=y
+
+ tools:
+   fsstress		[3][4]
+   keyctl		[5]
+   fscryptctl		[6]
+   setfattr/getfattr	[7]
+
+ Running
+ -------
+
+ Please build and install mtd-utils first.
+ Run single case:
+   cd $INSTALL_DIR/libexec/mtd-utils
+   ./powercut_fsck_mount.sh
+   ./random_corrupted_fsck.sh
+   ./cycle_mount_fsck_check.sh
+   ./build_fs_from_dir.sh
+ Run all cases: sh $INSTALL_DIR/libexec/mtd-utils/ubifs_tools_run_all.sh
+
+ References
+ ----------
+
+ [1] https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/tests/README
+ [2] https://bugzilla.kernel.org/show_bug.cgi?id=218924
+ [3] https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git/tree/ltp/fsstress.c
+ [4] https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/fs/fsstress/fsstress.c
+ [5] https://github.com/torvalds/linux/blob/master/security/keys/keyctl.c
+ [6] https://github.com/google/fscryptctl
+ [7] https://github.com/philips/attr/tree/master