[PATCH mtd-utils v2 000/102] Add fsck.ubifs support
Zhihao Cheng
chengzhihao1 at huawei.com
Mon Nov 11 01:30:26 PST 2024
在 2024/11/11 15:02, Zhihao Cheng 写道:
Please ignore this series, I marked it as 'Superseded' in patchwork. The
newest version is
https://patchwork.ozlabs.org/project/linux-mtd/list/?series=432199.
> Changes
> =======
>
> v1->v2:
> 1. fsck tests(powercut test, cycle powercut test, cycle mount test):
> Ignore 'fsck -a' failure if ltab has corrupted empty space, which
> could be caused by [15].
> 2. check space step(Patch 81 "fsck.ubifs: check and correct the space
> statistics"): Function rename, claer_lp_lists_and_heaps ->
> clear_lp_lists_and_heaps; Clear %LPROPS_TAKEN flag for all LEBs if
> space statistices is ever corrected.
> 3. Display symbols(function name + addr) in dump_stack(), store
> '-rdynamic' into variable 'DUMP_STACK_LD' in configure.ac.
> 4. Support Address-Sanitizier debugging for fsck.ubifs/mkfs.ubifs, so
> we can detect invalid memory accessing problems without external
> tools(for example, valgrind).
> 5. Fix some spelling mistakes in README.txt and commit message.
> 6. Rebase v1 to solve conflicts based on v2.2.1.
>
> Introduction
> ============
>
> The fsck.ubifs provides a way to fix inconsistent UBIFS image(which is
> corrupted by hardware exceptions or UBIFS realization bugs) and makes
> filesystem become consistent, just like fsck tools(eg. fsck.ext4,
> fsck.f2fs, fsck.fat, etc.) do.
>
> Why do we need fsck.ubifs?
> --------------------------
>
> The inconsistent UBIFS image is produced by mainly two aspects:
> - *Hardware exceptions*: Some of them are ecc uncorrectable errors(eg.
> [1][2]), some of them are caused by intermittent writing protection
> (unstable voltage).
> - *UBIFS realization bugs*: Some of them are known bugs which are
> fixable (eg. [3][4][5][6][7][8][9][10][11][12][13], etc.), some of
> them are unknown bugs(eg. [14]), some of them are hard to fix(eg. [15]).
> Once the UBIFS image becomes inconsistent, userspace applications won't
> work properly, as we all know, UBIFS is mainly applied in embedded
> system, which could affect many domains(eg. communications, IoT, family
> network, etc.). The only way to rescue device is formating UBI device
> and mkfs, which will lost all userdata, and it could be intolerable for
> some important situations.
> So, the fsck.ubifs is urgent for UBIFS, even it has been born for 15
> years, and it's not too late to do it for there will be more embedded
> devices in the future IOT world.
>
> Manuals
> =======
>
> There are four modes for fsck.ubifs:
> 1. normal mode(no options): Check the filesystem, ask user whether to
> fix the problem as long as inconsistent data is found during fs
> checking.
> 2. safe mode(-a option): Check and automatic safely repair the
> filesystem, if there are any data dropping operations needed by
> fixing, fsck will fail.
> 3. danger mode(-y option): Answer 'yes' to all questions. There are two
> sub modes:
> a) Default submode(no options): Check and automatic repair the
> filesystem according to TNC, data dropping will be reported. If
> TNC/master/log is corrupted, fsck will fail.
> b) rebuild submode(-b option): Check and automatic forcibly repair
> the filesystem, turns to rebuild filesystem if TNC/master/log is
> corrupted. Always make fsck successful.
> 4. check mode(-n option): Make no changes to the filesystem, only check
> the filesystem. This mode doesn't check space, because unclean LEBs
> cannot be rewritten in read-only mode.
>
> The exit code returned by fsck.ubifs is compatible with FSCK(8), which
> is the sum of the following conditions:
> 0 - No errors
> 1 - File system errors corrected
> 2 - System should be rebooted
> 4 - File system errors left uncorrected
> 8 - Operational error
> 16 - Usage or syntax error
> 32 - Fsck canceled by user request
> 128 - Shared library error
>
> Designment
> ==========
>
> There are 2 working modes for fsck: rebuild mode and non-rebuild mode.
> The main idea is that construct all files by scanning the entire
> filesystem, then check the consistency of metadata(file meta information,
> space statistics, etc.) according to the files. The file(xattr is treated
> as a file) is organized as:
> file tree(rbtree, inum indexed)
> / \
> file1 file2
> / \
> file3 file4
> file {
> inode node // each file has 1 inode node
> dentry (sub rb_tree, sqnum indexed)
> // '/' has no dentries, otherwise at least 1 dentry is required.
> trun node // the newest one truncation node
> data (sub rb_tree, block number indexed)
> // Each file may have 0 or many data nodes
> xattrs (sub rb_tree, inum indexed)
> // Each file may have 0 or many xattr files
> }
>
> Step 0. Both two modes need to read the superblock firstly, fsck fails if
> superblock is corrupted, because fsck has no idea about the location
> of each area(master, log, main, etc.) when the layout is lost.
>
> A. Rebuild mode(Similar to [16]):
> Step 1. Scan nodes(inode node/dentry node/data node/truncation node) from all
> LEBs.
> a) Corrupted LEBs(eg. garbage data, corrupted empty space) are dropped
> during scanning.
> b) Corrupted nodes(eg. incorrect crc, bad inode size, bad dentry name
> length, etc.) are dropped during scanning.
> c) Valid inode nodes(nlink > 0) and dentry nodes(inum != 0) are put
> into two valid trees(valid_inos & valid_dents) separately.
> d) Deleted inode nodes (nlink is 0) and deleted dentry nodes(inum is 0)
> are put into two deleted trees(del_inos & del_dents) separately.
> e) Other nodes(data nodes/truncation node) are put into corresponding
> file, if the file doesn't exist, insert a new file into the file
> tree.
> Step 2. Traverse nodes from deleted trees, remove inode nodes and dentry nodes
> with smaller sqnum from valid trees. valid_inos - del_inos = left_inos,
> valid_dents - del_dents = left_dents.
> This step handles the deleting case, for example, file A is deleted,
> deleted inode node and deleted dentry node are written, if we ignore
> the deleted nodes, file A can be recovered after rebuilding because
> undeleted inode node and undeleted dentry node can be scanned. There's
> an exception, if deleted inode node and deleted dentry node are
> reclaimed(by gc) after deletion, file A is recovered. So deleted data
> or files could be recovered by rebuild mode.
> Step 3. Traverse left_inos and left_dents, insert inode node and dentry nodes
> into the corresponding file.
> Step 4. Traverse all files, drop invalid files, move xattr files into the
> corresponding host file's subtree. Invalid files such as:
> a) File has no inode node or inode nlink is zero
> b) Non-consistent file types between inode node and dentry nodes
> c) File has no dentry nodes(excepts '/')
> d) Encrypted file has no xattr information
> e) Non regular file has data nodes
> f) Directory/xattr file has more than one dentries
> g) Xattr file has no host inode, or the host inode is a xattr
> h) Non-xattr file's parent is not a directory
> i) etc.
> Step 5. Extract reachable directory entries tree. Make sure that all files can
> be searched from '/', unreachable file is deleted. Since all xattr
> files are attached to the corresponding host file, only non-xattr
> files should be checked. Luckily, directory file only has one dentry,
> the reachable checking of a dentry becomes easy. Traverse all
> dentries for each file, check whether the dentry is reachable, if not,
> remove dentry from the file. If the file has no dentries, the file is
> unreachable.
> Step 6. Correct the file information. Traverse all files and calculate
> information(nlink, size, xattr_cnt, etc.) for each file just like
> check_leaf(in linux kernel) does, correct the inode node based on the
> calculated information.
> Step 7. Record used LEBs. Traverse all files'(including effective nodes from
> deletion trees in step 2) position, after this step fsck knows which
> LEB is empty.
> Step 8. Re-write data. Read data from LEB and write back data, make sure that
> all LEB is ended with empty data(0xFF). It will prevent failed gc
> scanning in the next mounting.
> Step 9. Build TNC. Construct TNC according to all files' nodes, just like mkfs
> does(refer to add_to_index in mkfs), then write TNC(refer to
> write_index in mkfs) on flash. (If there are no files, create a new
> root dir file.)
> Step 10.Build LPT. Construct LPT according to all nodes' position and length,
> just like mkfs does, then write LPT(refer to write_lpt) on flash.
> Step 11.Clean up log area and orphan area. Log area and orphan area can be
> erased.
> Step 12.Write master node. Since all meta areas are ready, master node can be
> updated.
>
> B. Non-rebuild mode:
> Step 1. Read master & init lpt.
> a) Scan master nodes failed or master node is invalid (which is not
> caused by invalid space statistics), danger mode with rebuild_fs and
> normal mode with 'yes' answer will turn to rebuild mode, other modes
> will exit. Fsck cannot find the right TNC/LPT if the master node is
> invalid, which affects subsequent steps, so this problem must be
> fixed.
> b) Invalid space statistics in master node, set %FR_LPT_INCORRECT for
> for lpt status and ignore the error.
> c) LPT node is corrupted, set %FR_LPT_CORRUPTED for lpt status and
> ignore the error.
> Step 2. Replay journal.
> I. Scan log LEBs to get all buds.
> a) Nodes in log LEBs are invalid/corrupted, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to rebuild
> mode, other modes will exit. Corrupted log LEB could fail
> ubifs_consolidate_log, which may lead to commit failure by out of
> space in the log area, so this problem must be fixed.
> II. Scan bud LEBs to get all nodes.
> a) Nodes in bud LEBs are invalid/corrupted, danger mode and normal
> mode with 'yes' answer will drop bud LEB and set
> %FR_LPT_INCORRECT for lpt status, other modes will exit.
> Corrupted LEB will make gc failed, so this problem must be
> fixed.
> III. Record isize into size tree according to data/truncation/inode
> nodes.
> IV. Apply nodes to TNC & LPT, update property for bud LEBs.
> a) Corrupted/Invalid node searched from TNC, skip node and set
> %FR_LPT_INCORRECT in lpt status for danger mode and normal mode
> with 'yes' answer, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> b) Corrupted/Invalid index node read from TNC, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> c) Corrupted/Invalid lpt node, Set %FR_LPT_CORRUPTED for lpt status
> and ignore the error.
> d) Incorrect LEB property: Set %FR_LPT_INCORRECT for lpt status and
> ignore the error.
> e) If lpt status is not empty, skip updating lpt, because incorrect
> LEB property could trigger assertion failure in ubifs_change_lp.
> Step 3. Handle orphan nodes.
> I. Scan orphan LEB to get all orphan nodes.
> a) Corrupted/Invalid orphan node: danger mode and normal mode with
> 'yes' answer will drop orphan LEB, other modes will exit.
> Corrupted orphan area could lead to mounting/committing failure,
> so this problem must be fixed.
> II. Parse orphan node, find the original inode for each inum.
> a) Corrupted/Invalid node searched from TNC, skip node for danger
> mode and normal mode with 'yes' answer, other modes will exit.
> b) Corrupted/Invalid index node read from TNC, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> III. Remove inode for each inum, update TNC & LPT.
> a) Corrupted/Invalid node searched from TNC, skip node for danger
> mode and normal mode with 'yes' answer, other modes will exit.
> b) Corrupted/Invalid index node read from TNC, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> c) Corrupted/Invalid lpt node, Set %FR_LPT_CORRUPTED for lpt
> status and ignore the error.
> d) Incorrect LEB property: Set %FR_LPT_INCORRECT for lpt status
> and ignore the error.
> e) If lpt status is not empty, skip updating lpt, because
> incorrect LEB property could trigger assertion failure in
> ubifs_change_lp.
> Step 4. Consolidate log area.
> a) Corrupted data in log LEBs, danger mode with rebuild_fs and normal
> mode with 'yes' answer will turn to rebuild filesystem, other modes
> will exit. It could make commit failed by out of space in log area,
> so this problem must be fixed.
> Step 5. Recover isize.
> I. Traverse size tree, lookup corresponding inode from TNC.
> a) Corrupted/Invalid node searched from TNC, skip node for danger
> mode and normal mode with 'yes' answer, other modes will exit.
> b) Corrupted/Invalid index node read from TNC, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> II. Update isize for inode. Keep <inum, isize> in size tree for check
> mode, remove <inum, isize> from the size tree and update inode
> node in place for other modes.
> Step 6. Traverse TNC and construct files.
> I. Traverse TNC, check whether the leaf node is valid, remove invalid
> nodes, construct file for valid node and insert the file into the
> file tree.
> a) Corrupted/Invalid node searched from TNC, remove corresponding
> TNC branch for danger mode and normal mode with 'yes' answer,
> other modes will exit. The space statistics depend on a valid
> TNC, so this problem must be fixed.
> b) Corrupted/Invalid index node read from TNC, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. The space statistics
> depend on a valid TNC, so this problem must be fixed.
> II. Scan all LEBs(contain TNC) for non check mode(unclean LEBs cannot
> be fixed in read-only mode, so scanning may fail in check mode,
> then space statistics won't be checked in check mode), remove TNC
> branch which points to corrupted LEB.
> a) Corrupted data is found by scanning. If the current node is
> index node, danger mode with rebuild_fs and normal mode with
> 'yes' answer will turn to rebuild filesystem, other modes will
> exit; If the current node is non-index node, danger mode and
> normal mode with 'yes' answer will remove all TNC branches which
> point to the corrupted LEB, other modes will exit. The space
> statistics depend on valid LEB scanning, so this problem must
> be fixed.
> b) LEB contains both index and non-index nodes, danger mode with
> rebuild_fs and normal mode with 'yes' answer will turn to
> rebuild filesystem, other modes will exit. Invalid LEB will make
> gc failed, so this problem must be fixed.
> Step 7. Update files' size for check mode. Update files' size according to the
> size tree for check mode.
> Step 8. Check and handle invalid files. Similar to rebuild mode, but the
> methods of handling are different:
> a) Move unattached(file has no dentries) regular file into disconnected
> list for safe mode, danger mode and normal mode with 'yes' answer,
> let subsequent steps to handle them with lost+found. Other modes
> will exit. Disconnected file affects the result of calculated
> information(which will be used in subsequent steps) for its' parent
> file(eg. nlink, size), so this problem must be fixed.
> b) Make file type be consistent between inode, detries and data nodes
> by deleting dentries or data nodes, for danger mode and normal mode
> with 'yes' answer, other modes will exit.
> c) Delete file for other invalid cases(eg. file has no inode) in
> danger mode and normal mode with 'yes' answer, other modes will
> exit.
> Step 9. Extract reachable directory entries tree. Similar to rebuild mode, but
> the methods of handling are different:
> a) Remove unreachable dentry for danger mode and normal mode with 'yes'
> answer, other modes will exit. Unreachable dentry affects the
> calculated information(which will be used in subsequent steps) for
> its' file(eg. nlink), so this problem must be fixed.
> b) Delete unreachable non-regular file for danger mode and normal mode
> with 'yes' answer, other modes will exit. Unreachable file affects
> the calculated information(which will be used in subsequent steps)
> for its' parent file(eg. nlink, size), so this problem must be
> fixed.
> c) Move unreachable regular file into disconnected list for safe mode,
> danger mode and normal mode with 'yes' answer, let subsequent steps
> to handle them with lost+found. Other modes will exit. Disconnected
> file affects the calculated information(which will be used in
> subsequent steps) for its' parent file(eg. nlink, size), so this
> problem must be fixed.
> Step 10.Correct the file information. Similar to rebuild mode, but the methods
> of handling are different:
> a) Correct the file information for safe mode, danger mode and normal
> mode with 'yes' answer, other modes will exit. Incorrect file
> information affects the new creations(which will be used in handling
> lost+found), so this problem must be fixed.
> Step 11.Check whether the TNC is empty. Empty TNC is equal to corrupted TNC,
> which means that zero child count for root znode. If TNC is empty(All
> nodes are invalid and are deleted from TNC), turn to rebuild mode for
> danger mode with rebuild_fs and normal mode with 'yes' answer, other
> modes will exit.
> Step 12.Check and correct the space statistics.
> I. Exit for check mode, if %FR_LPT_CORRUPTED or %FR_LPT_INCORRECT is
> set in lpt status, the exit code should have %FSCK_UNCORRECTED.
> II. Check lpt status, if %FR_LPT_CORRUPTED is set in lpt status, normal
> mode with 'no' answer will exit, other modes will rebuild lpt. New
> creations could be done in subsequent steps, which depends on
> correct space statistics, so this problem must be fixed.
> III. Traverse LPT nodes, check the correctness of nnode and pnode,
> compare LEB scanning result with LEB properties.
> a) LPT node is corrupted, normal mode with 'no' answer will exit,
> rebuild lpt for other modes. New creations could be done in
> subsequent steps, which depends on the correct space
> statistics, so this problem must be fixed.
> b) Incorrect nnode/pnode, normal mode with 'no' answer will exit,
> other modes will correct the nnode/pnode. New creations could
> be done in subsequent steps, which depends on correct space
> statistics, so this problem must be fixed.
> c) Inconsistent comparing result, normal mode with 'no' answer
> will exit, other modes will correct the space statistics. New
> creations could be done in subsequent steps, which depends on
> correct space statistics, so this problem must be fixed.
> IV. Compare LPT area scanning result with lprops table information.
> a) LPT area is corrupted, normal mode with 'no' answer will exit,
> rebuild lpt for other modes. Commit could fail in doing LPT gc
> caused by scanning corrupted data, so this problem must be
> fixed.
> b) Inconsistent comparing result, normal mode with 'no' answer
> will exit, other modes will correct the lprops table
> information. Commit could fail in writing LPT with %ENOSPC
> return code caused by incorrect space statistics in the LPT
> area, so this problem must be fixed.
> Step 13.Do commit, commit problem fixing modifications to disk. The index size
> checking depends on this step.
> Step 14.Check and correct the index size. Check and correct the index size by
> traversing TNC just like dbg_check_idx_size does. This step should be
> executed after first committing, because 'c->calc_idx_sz' can be
> changed in 'ubifs_tnc_start_commit' and the initial value of
> 'c->calc_idx_sz' read from the disk is untrusted. Correct the index
> size for safe mode, danger mode and normal mode with 'yes' answer,
> other modes will exit. New creations could be done in subsequent steps,
> which depends on the correct index size, so this problem must be fixed.
> Step 15.Check and create the root dir. Check whether the root dir exists,
> create a new one if it is not found, for safe mode, danger mode and
> normal mode with 'yes' answer, other modes will exit. Mounting depends
> on the root dir, so this problem must be fixed.
> Step 16.Check and create the lost+found.
> I. If the root dir is encrypted, set lost+found as invalid. Because it
> is impossible to check whether the lost+found exists in an encrypted
> directory.
> II. Search the lost+found under root dir.
> a) Found a lost+found, lost+found is a non-encrypted directory, set
> lost+found as valid, otherwise set lost+found as invalid.
> b) Not found the lost+found, create a new one. If creation is
> failed by %ENOSPC, set lost+found as invalid.
> Step 17.Handle each file from the disconnected list.
> I. If lost+found is invalid, delete file for danger mode and normal
> mode with 'yes' answer, other modes will skip and set the exit code
> with %FSCK_UNCORRECTED.
> II. If lost+found is valid, link disconnected file under lost+found
> directory with the name of the corresponding inode number
> (INO_<inum>_<index>, index(starts from 0) is used to handle the
> conflicted names).
> a) Fails in handling conflicted file names, delete file for danger
> mode and normal mode with 'yes' answer, other modes will skip
> and set the exit code with %FSCK_UNCORRECTED.
> b) Fails in linking caused by %ENOSPC, delete file for danger mode
> and normal mode with 'yes' answer, other modes will skip and set
> the exit code with %FSCK_UNCORRECTED.
> Step 18.Do final commit, commit problem fixing modifications to disk and clear
> %UBIFS_MST_DIRTY flag for master node.
>
>
> Advantages
> ==========
> 1. Can be used for any UBIFS image, fsck has nothing to do with kernel version.
> 2. Fsck is tolerant with power-cut, fsck will always succeed in a certain mode
> without changing mode even power-cut happens in checking and repairing. In
> other words, fsck won't let UBIFS image become worse in abnormal situations.
> 3. It is compatible with FSCK(8), the exit code returned by fsck.ubifs is same
> as FSCK, the command options used by fsck are supported in fsck.ubifs too.
> 4. The UBIFS image can be fixed as long as the super block is not corrupted.
> 5. Encrypted UBIFS image is supported, because dentry name and data content of
> file are not necessary for fsck.
>
>
> Limitations
> ===========
> 1. UBIFS image file is not supported(Not like ext4). The UBIFS image file is
> not equal to UBI volume, empty LEBs are not included in image file, so UBIFS
> cannot allocate empty space when file recovering is needed. Another reason
> is that atomic LEB changing is not supported by image file.
> 2. Authenticated UBIFS image is not supported, UBIFS metadata(TNC/LPT) parsing
> depends on the authentication key which is not supported in fsck options.
>
>
> Testing
> =======
>
> We have seven testcases for fsck.ubifs on encryption/non-encryption
> situations(See details in tests/ubifs_tools-tests/README.txt):
> 1) authentication_refuse: Currently authenticated UBIFS image is not
> supported for fsck.ubifs.
> 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.
> I have run this case with valgrind[17] in my local machine to
> check kinds of memory errors(eg. rw OOB, null-ptr-def).
> 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 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.
>
> Besides, I fix all corrupted UBIFS images(history problems in our
> product line) by fsck.ubifs.
>
> Environment: qemu, -smp 4, -m 16384/32768, nandsim/mtdram
> Code coverage[18]:
> fsck - Line 87.4%, functions 98.0%
> libubifs - Line 78.4%, functions 89.1%
> mkfs - Line 71.6%, functions 97.8%
>
> Notice
> ------
>
> Before running testcases, please make sure that your linux kernel is
> updated to the latest version(v6.12-rc6).
>
> Patches
> =======
> 1~8: Some cleanups for mkfs.ubifs, split common libs into 'common'
> directory.
> 9: Import linux kernel implementations into ubifs-utils/libubifs.
> Prepare to replace implementations of UBIFS with linux kernel.
> 10~23: Add some basic libs(bitops, mutex, rwsem, etc.) which will be used
> by libubifs.
> 24: Add README for common directory to describe where these basic
> libs come from.
> 25~47: Adapt libubifs to userspace, delete codes which won't be used by
> fsck/mkfs.
> 48~53: Add basic framework fsck.
> 54~66: Implement rebuild mode for fsck.
> 67~88: Implement other modes(normal, danger, check) for fsck.
> 89: Add docs for fsck.
> 90~100:Add testcases for fsck/mkfs.
> 101 :Add docs for testcases.
> 102 :Address-Sanitizier debug support for ubifs-utils.
>
>
> Links
> =====
>
> [1] https://lore.kernel.org/linux-mtd/1582293853-136727-1-git-send-email-chengzhihao1@huawei.com/
> [2] https://lore.kernel.org/linux-mtd/CAMxq0fNSWrUFMmmTs8Ri9gFOvS+KQJvZN3-_KuiqXi9bbmCB0Q@mail.gmail.com/
> [3] https://lore.kernel.org/linux-mtd/20211227032246.2886878-6-chengzhihao1@huawei.com/
> [4] https://lore.kernel.org/linux-mtd/1638777819.2925845.1695222544742.JavaMail.zimbra@robart.cc/T/#u
> [5] https://lore.kernel.org/linux-mtd/20190515203113.19398-1-richard@nod.at/
> [6] https://lore.kernel.org/linux-mtd/20190404223438.29408-1-richard@nod.at/
> [7] https://lore.kernel.org/linux-mtd/20210316085214.25024-1-guochun.mao@mediatek.com/
> [8] https://lore.kernel.org/linux-mtd/20180611225228.28931-1-richard@nod.at/
> [9] https://lore.kernel.org/linux-mtd/20180611214109.14424-1-richard@nod.at/
> [10] https://lore.kernel.org/linux-mtd/1476823591-6137-1-git-send-email-richard@nod.at/
> [11] https://lore.kernel.org/linux-mtd/1474495050-13529-1-git-send-email-pascal.eberhard@gmail.com/
> [12] https://lore.kernel.org/linux-mtd/1342340237-29656-1-git-send-email-dedekind1@gmail.com/
> [13] https://lore.kernel.org/linux-mtd/20240410073751.2522830-1-chengzhihao1@huawei.com/
> [14] https://linux-mtd.infradead.narkive.com/bfcHzD0j/ubi-ubifs-corruptions-during-random-power-cuts
> [15] https://lore.kernel.org/linux-mtd/97ca7fe4-4ad4-edd1-e97a-1d540aeabe2d@huawei.com/T/#u
> [16] https://lore.kernel.org/linux-mtd/20231228014112.2836317-1-chengzhihao1@huawei.com/
> [17] https://valgrind.org/
> [18] https://bugzilla.kernel.org/show_bug.cgi?id=218924
>
>
> Huang Xiaojia (1):
> fsck.ubifs: Check and create the lost+found
>
> Xiang Yang (1):
> fsck.ubifs: Check and correct files' information
>
> Zhihao Cheng (100):
> ubifs-utils: Split common source files from mkfs.ubifs
> ubifs-utils: Decouple mkfs.ubifs.h out of other modules
> ubifs-utils: Define PROGRAM_NAME as variable
> ubifs-utils: Clean up error message printing functions
> ubifs-utils: Move 'debug_level' into ubifs_info structure
> ubifs-utils: Add 'dev_name' into 'ubifs_info' structure
> ubifs-utils: Add 'dev_fd' and 'libubi' into 'ubifs_info' structure
> ubifs-utils: Extract UBI opening/closing/volume_check_empty functions
> into a new source file
> ubifs-utils: Import UBIFS libs from linux kernel
> ubifs-utils: Add compiler attributes implementations
> ubifs-utils: Add linux type definitions
> ubifs-utils: Add linux kernel error conversion definitions
> ubifs-utils: Add linux kernel memory allocation implementations
> ubifs-utils: Add atomic implementations
> ubifs-utils: Add bit operations implementations
> ubifs-utils: Add spinlock implementations
> ubifs-utils: Add mutexlock implementations
> ubifs-utils: Add rwsem implementations
> ubifs-utils: Add sorting implementations
> ubifs-utils: Add implementations for linux kernel printing functions
> ubifs-utils: Add linux hexdump implementations lib
> libubi: Add new interface ubi_leb_map()
> ubifs-utils: Add common definitions in linux kernel
> ubifs-utils: Add descriptions for new lib files in common/README
> ubifs-utils: Adapt ubifs header file in libubifs
> ubifs-utils: Adapt super.c in libubifs
> ubifs-utils: Adapt io.c in libubifs
> ubifs-utils: Adapt lpt subsystem in libubifs
> ubifs-utils: Adapt tnc subsystem in libubifs
> ubifs-utils: Adapt log.c in libubifs
> ubifs-utils: Adapt recovery subsystem in libubifs
> ubifs-utils: Adapt sb.c in libubifs
> ubifs-utils: Adapt auth.c in libubifs
> ubifs-utils: Adapt dir.c in libubifs
> ubifs-utils: Adapt journal.c in libubifs
> ubifs-utils: Adapt budget.c in libubifs
> ubifs-utils: Adapt commit.c in libubifs
> ubifs-utils: Adapt debug subsystem in libubifs
> ubifs-utils: Adapt key.h in libubifs
> ubifs-utils: Adapt master.c in libubifs
> ubifs-utils: Adapt misc.h in libubifs
> ubifs-utils: Adapt orphan.c in libubifs
> ubifs-utils: Adapt gc subsystem in libubifs
> ubifs-utils: Move ubifs-media.h in libubifs
> ubifs-utils: Add descriptions for new lib files in libubifs/README
> ubifs-utils: Replace ubifs related source code with linux kernel
> implementation
> ubifs-utils: open_ubi: Set errno if the target is not char device
> fsck.ubifs: Add fsck support
> fsck.ubifs: Add inconsistent problem handling asking function
> fsck.ubifs: Distinguish reasons when certain failures happen
> fsck.ubifs: Load filesystem information from UBI volume
> fsck.ubifs: Add node parsing functions
> fsck.ubifs: Add file organization realization
> fsck.ubifs: Add rebuilding filesystem support
> fsck.ubifs: rebuild_fs: Remove deleted nodes from valid node tree
> fsck.ubifs: rebuild_fs: Add valid nodes into file
> fsck.ubifs: rebuild_fs: Filter invalid files
> fsck.ubifs: rebuild_fs: Extract reachable directory entries tree
> fsck.ubifs: rebuild_fs: Check and correct files' information
> fsck.ubifs: rebuild_fs: Record used LEBs
> fsck.ubifs: rebuild_fs: Re-write data
> fsck.ubifs: rebuild_fs: Create new root dir if there are no scanned
> files
> fsck.ubifs: rebuild_fs: Build TNC
> fsck.ubifs: rebuild_fs: Build LPT
> fsck.ubifs: rebuild_fs: Clean up log and orphan area
> fsck.ubifs: rebuild_fs: Write master node
> fsck.ubifs: Read master node & init lpt
> fsck.ubifs: Replay journal
> fsck.ubifs: Handle orphan nodes
> fsck.ubifs: Consolidate log
> fsck.ubifs: Recover isize
> fsck.ubifs: Move common functions and data structures into
> fsck.ubifs.c
> fsck.ubifs: Traverse TNC and construct files
> fsck.ubifs: Ensure that TNC LEB can be scanned successful
> fsck.ubifs: Update files' size for check mode
> fsck.ubifs: Check and handle invalid files
> fsck.ubifs: Check and handle unreachable files
> fsck.ubifs: Check whether the TNC is empty
> fsck.ubifs: Move common functions and data structures into
> check_space.c
> fsck.ubifs: check and correct the space statistics
> fsck.ubifs: Commit problem fixing modifications to disk
> fsck.ubifs: Check and correct the index size
> ubifs-utils: libubifs: Support some file operations
> fsck.ubifs: Check and create the root dir
> fsck.ubifs: Handle disconnected files
> fsck.ubifs: Do final committing
> fsck.ubifs: Add README to describe fsck
> tests: Add common libs for testing fsck.ubifs/mkfs.ubifs
> tests: ubifs_tools: fsck_tests: Add authentication refusing test
> tests: ubifs_tools: fsck_tests: Add cycle mount+fsck test
> tests: ubifs_tools: fsck_tests: Add powercut+fsck+mount test
> tests: ubifs_tools: fsck_tests: Add corrupt+fsck+fault_inject test
> tests: ubifs_tools: fsck_tests: Add cycle_powercut+fsck test
> tests: ubifs_tools: fsck_tests: Add random_corrupt+fsck test
> tests: ubifs_tools: fsck_tests: Add corrupted images
> tests: ubifs_tools: fsck_tests: Add bad images fixing test
> tests: ubifs_tools: mkfs_tests: Add fs content check test
> tests: ubifs_tools: Add run_all script
> tests: ubifs_tools: Add README
> ubifs-utils: Support Address-Sanitizier debug
>
> .gitignore | 11 +
> Makefile.am | 2 +
> configure.ac | 28 +-
> include/crc32.h | 5 +
> include/libubi.h | 15 +
> lib/libubi.c | 10 +
> tests/ubifs_tools-tests/Makemodule.am | 66 +
> tests/ubifs_tools-tests/README.txt | 303 ++
> .../fsck_tests/authentication_refuse.sh.in | 66 +
> .../cycle_corrupted_fsck_fault_inject.sh.in | 225 ++
> .../fsck_tests/cycle_mount_fsck_check.sh.in | 154 +
> .../fsck_tests/cycle_powercut_mount_fsck.sh.in | 148 +
> .../fsck_tests/fsck_bad_image.sh.in | 355 +++
> .../fsck_tests/powercut_fsck_mount.sh.in | 148 +
> .../fsck_tests/random_corrupted_fsck.sh.in | 206 ++
> .../ubifs_tools-tests/images/corrupted_data_leb.gz | Bin 0 -> 9536 bytes
> .../ubifs_tools-tests/images/corrupted_idx_leb.gz | Bin 0 -> 5082 bytes
> tests/ubifs_tools-tests/images/dentry_key.gz | Bin 0 -> 5088 bytes
> tests/ubifs_tools-tests/images/dentry_nlen.gz | Bin 0 -> 5113 bytes
> tests/ubifs_tools-tests/images/dentry_type.gz | Bin 0 -> 5115 bytes
> tests/ubifs_tools-tests/images/dir_lost.gz | Bin 0 -> 5088 bytes
> .../images/dir_lost_duplicated.gz | Bin 0 -> 5347 bytes
> .../images/dir_lost_not_recover.gz | Bin 0 -> 5396 bytes
> tests/ubifs_tools-tests/images/dir_many_dentry.gz | Bin 0 -> 5114 bytes
> tests/ubifs_tools-tests/images/empty_tnc.gz | Bin 0 -> 4954 bytes
> tests/ubifs_tools-tests/images/good.gz | Bin 0 -> 4960 bytes
> tests/ubifs_tools-tests/images/index_size.gz | Bin 0 -> 5070 bytes
> tests/ubifs_tools-tests/images/inode_data.gz | Bin 0 -> 5015 bytes
> tests/ubifs_tools-tests/images/inode_mode.gz | Bin 0 -> 5109 bytes
> tests/ubifs_tools-tests/images/inode_nlink.gz | Bin 0 -> 5110 bytes
> tests/ubifs_tools-tests/images/inode_size.gz | Bin 0 -> 5113 bytes
> tests/ubifs_tools-tests/images/inode_xcnt.gz | Bin 0 -> 5115 bytes
> tests/ubifs_tools-tests/images/journal_bud.gz | Bin 0 -> 5015 bytes
> tests/ubifs_tools-tests/images/journal_log.gz | Bin 0 -> 4927 bytes
> tests/ubifs_tools-tests/images/lpt_dirty.gz | Bin 0 -> 5056 bytes
> tests/ubifs_tools-tests/images/lpt_flags.gz | Bin 0 -> 5060 bytes
> tests/ubifs_tools-tests/images/lpt_free.gz | Bin 0 -> 5046 bytes
> tests/ubifs_tools-tests/images/lpt_pos.gz | Bin 0 -> 5070 bytes
> tests/ubifs_tools-tests/images/ltab_dirty.gz | Bin 0 -> 5104 bytes
> tests/ubifs_tools-tests/images/ltab_free.gz | Bin 0 -> 5072 bytes
> .../images/master_highest_inum.gz | Bin 0 -> 4813 bytes
> tests/ubifs_tools-tests/images/master_lpt.gz | Bin 0 -> 4808 bytes
> tests/ubifs_tools-tests/images/master_tnc.gz | Bin 0 -> 4805 bytes
> .../ubifs_tools-tests/images/master_total_dead.gz | Bin 0 -> 4817 bytes
> .../ubifs_tools-tests/images/master_total_dirty.gz | Bin 0 -> 4814 bytes
> .../ubifs_tools-tests/images/master_total_free.gz | Bin 0 -> 4813 bytes
> tests/ubifs_tools-tests/images/orphan_node.gz | Bin 0 -> 5379 bytes
> tests/ubifs_tools-tests/images/root_dir.gz | Bin 0 -> 5058 bytes
> tests/ubifs_tools-tests/images/sb_fanout.gz | Bin 0 -> 5031 bytes
> tests/ubifs_tools-tests/images/sb_fmt_version.gz | Bin 0 -> 5032 bytes
> tests/ubifs_tools-tests/images/sb_leb_size.gz | Bin 0 -> 5033 bytes
> tests/ubifs_tools-tests/images/sb_log_lebs.gz | Bin 0 -> 5031 bytes
> tests/ubifs_tools-tests/images/sb_min_io_size.gz | Bin 0 -> 5035 bytes
> .../ubifs_tools-tests/images/soft_link_data_len.gz | Bin 0 -> 5112 bytes
> .../images/soft_link_inode_mode.gz | Bin 0 -> 5121 bytes
> tests/ubifs_tools-tests/images/tnc_lv0_key.gz | Bin 0 -> 5118 bytes
> tests/ubifs_tools-tests/images/tnc_lv0_len.gz | Bin 0 -> 5130 bytes
> tests/ubifs_tools-tests/images/tnc_lv0_pos.gz | Bin 0 -> 5118 bytes
> tests/ubifs_tools-tests/images/tnc_noleaf_key.gz | Bin 0 -> 5140 bytes
> tests/ubifs_tools-tests/images/tnc_noleaf_len.gz | Bin 0 -> 5145 bytes
> tests/ubifs_tools-tests/images/tnc_noleaf_pos.gz | Bin 0 -> 5125 bytes
> tests/ubifs_tools-tests/images/xent_host.gz | Bin 0 -> 5108 bytes
> tests/ubifs_tools-tests/images/xentry_key.gz | Bin 0 -> 5085 bytes
> tests/ubifs_tools-tests/images/xentry_nlen.gz | Bin 0 -> 5115 bytes
> tests/ubifs_tools-tests/images/xentry_type.gz | Bin 0 -> 5113 bytes
> tests/ubifs_tools-tests/images/xinode_flags.gz | Bin 0 -> 5112 bytes
> tests/ubifs_tools-tests/images/xinode_key.gz | Bin 0 -> 5110 bytes
> tests/ubifs_tools-tests/images/xinode_mode.gz | Bin 0 -> 5112 bytes
> tests/ubifs_tools-tests/lib/common.sh.in | 359 +++
> .../mkfs_tests/build_fs_from_dir.sh.in | 174 ++
> tests/ubifs_tools-tests/ubifs_tools_run_all.sh.in | 65 +
> ubifs-utils/Makemodule.am | 123 +-
> ubifs-utils/common/README | 14 +
> ubifs-utils/common/atomic.h | 133 +
> ubifs-utils/common/bitops.c | 37 +
> ubifs-utils/common/bitops.h | 152 +
> ubifs-utils/common/compiler_attributes.h | 79 +
> ubifs-utils/{mkfs.ubifs => common}/compr.c | 19 +-
> ubifs-utils/{mkfs.ubifs => common}/compr.h | 8 -
> ubifs-utils/{mkfs.ubifs => common}/crc16.c | 0
> ubifs-utils/{mkfs.ubifs => common}/crc16.h | 0
> ubifs-utils/{mkfs.ubifs => common}/crypto.c | 6 +-
> ubifs-utils/{mkfs.ubifs => common}/crypto.h | 0
> ubifs-utils/common/defs.h | 123 +
> ubifs-utils/{mkfs.ubifs => common}/devtable.c | 94 +-
> .../{mkfs.ubifs/mkfs.ubifs.h => common/devtable.h} | 85 +-
> ubifs-utils/{mkfs.ubifs => common}/fscrypt.c | 29 +-
> ubifs-utils/{mkfs.ubifs => common}/fscrypt.h | 19 +-
> .../{mkfs.ubifs => common}/hashtable/hashtable.c | 10 +-
> .../{mkfs.ubifs => common}/hashtable/hashtable.h | 0
> .../hashtable/hashtable_itr.c | 0
> .../hashtable/hashtable_itr.h | 0
> .../hashtable/hashtable_private.h | 0
> ubifs-utils/common/hexdump.c | 218 ++
> ubifs-utils/common/kmem.c | 64 +
> ubifs-utils/common/kmem.h | 56 +
> ubifs-utils/common/linux_err.h | 62 +
> ubifs-utils/common/linux_types.h | 92 +
> ubifs-utils/common/mutex.h | 18 +
> ubifs-utils/common/rwsem.h | 19 +
> ubifs-utils/{mkfs.ubifs => common}/sign.c | 177 +-
> ubifs-utils/common/sign.h | 39 +
> ubifs-utils/common/sort.c | 274 ++
> ubifs-utils/common/sort.h | 20 +
> ubifs-utils/common/spinlock.h | 14 +
> ubifs-utils/fsck.ubifs/.gitignore | 1 +
> ubifs-utils/fsck.ubifs/README.txt | 388 +++
> ubifs-utils/fsck.ubifs/check_files.c | 555 ++++
> ubifs-utils/fsck.ubifs/check_space.c | 690 +++++
> ubifs-utils/fsck.ubifs/extract_files.c | 1574 ++++++++++
> ubifs-utils/fsck.ubifs/fsck.ubifs.c | 636 ++++
> ubifs-utils/fsck.ubifs/fsck.ubifs.h | 392 +++
> ubifs-utils/fsck.ubifs/handle_disconnected.c | 197 ++
> ubifs-utils/fsck.ubifs/load_fs.c | 261 ++
> ubifs-utils/fsck.ubifs/problem.c | 377 +++
> ubifs-utils/fsck.ubifs/rebuild_fs.c | 1453 +++++++++
> ubifs-utils/libubifs/README | 30 +
> ubifs-utils/libubifs/auth.c | 175 ++
> ubifs-utils/libubifs/budget.c | 595 ++++
> ubifs-utils/libubifs/commit.c | 383 +++
> ubifs-utils/libubifs/debug.c | 1033 +++++++
> ubifs-utils/libubifs/debug.h | 172 ++
> ubifs-utils/libubifs/dir.c | 390 +++
> ubifs-utils/libubifs/find.c | 970 +++++++
> ubifs-utils/libubifs/gc.c | 1021 +++++++
> ubifs-utils/libubifs/io.c | 1088 +++++++
> ubifs-utils/libubifs/journal.c | 633 ++++
> ubifs-utils/libubifs/key.h | 492 ++++
> ubifs-utils/libubifs/log.c | 750 +++++
> ubifs-utils/libubifs/lprops.c | 864 ++++++
> ubifs-utils/libubifs/lpt.c | 2337 +++++++++++++++
> ubifs-utils/libubifs/lpt_commit.c | 1812 ++++++++++++
> ubifs-utils/libubifs/master.c | 489 ++++
> ubifs-utils/libubifs/misc.h | 225 ++
> ubifs-utils/libubifs/orphan.c | 644 ++++
> ubifs-utils/libubifs/recovery.c | 1404 +++++++++
> ubifs-utils/libubifs/replay.c | 1229 ++++++++
> ubifs-utils/libubifs/sb.c | 512 ++++
> ubifs-utils/libubifs/scan.c | 372 +++
> ubifs-utils/libubifs/super.c | 702 +++++
> ubifs-utils/libubifs/tnc.c | 3070 ++++++++++++++++++++
> ubifs-utils/libubifs/tnc_commit.c | 1117 +++++++
> ubifs-utils/libubifs/tnc_misc.c | 452 +++
> .../mtd => ubifs-utils/libubifs}/ubifs-media.h | 0
> ubifs-utils/libubifs/ubifs.h | 1924 ++++++++++++
> ubifs-utils/mkfs.ubifs/README | 9 -
> ubifs-utils/mkfs.ubifs/defs.h | 90 -
> ubifs-utils/mkfs.ubifs/key.h | 222 --
> ubifs-utils/mkfs.ubifs/lpt.c | 590 ----
> ubifs-utils/mkfs.ubifs/lpt.h | 28 -
> ubifs-utils/mkfs.ubifs/mkfs.ubifs.c | 613 ++--
> ubifs-utils/mkfs.ubifs/sign.h | 80 -
> ubifs-utils/mkfs.ubifs/ubifs.h | 471 ---
> 153 files changed, 35653 insertions(+), 2183 deletions(-)
> create mode 100644 tests/ubifs_tools-tests/Makemodule.am
> create mode 100644 tests/ubifs_tools-tests/README.txt
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/fsck_bad_image.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in
> create mode 100755 tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh.in
> create mode 100644 tests/ubifs_tools-tests/images/corrupted_data_leb.gz
> create mode 100644 tests/ubifs_tools-tests/images/corrupted_idx_leb.gz
> create mode 100644 tests/ubifs_tools-tests/images/dentry_key.gz
> create mode 100644 tests/ubifs_tools-tests/images/dentry_nlen.gz
> create mode 100644 tests/ubifs_tools-tests/images/dentry_type.gz
> create mode 100644 tests/ubifs_tools-tests/images/dir_lost.gz
> create mode 100644 tests/ubifs_tools-tests/images/dir_lost_duplicated.gz
> create mode 100644 tests/ubifs_tools-tests/images/dir_lost_not_recover.gz
> create mode 100644 tests/ubifs_tools-tests/images/dir_many_dentry.gz
> create mode 100644 tests/ubifs_tools-tests/images/empty_tnc.gz
> create mode 100644 tests/ubifs_tools-tests/images/good.gz
> create mode 100644 tests/ubifs_tools-tests/images/index_size.gz
> create mode 100644 tests/ubifs_tools-tests/images/inode_data.gz
> create mode 100644 tests/ubifs_tools-tests/images/inode_mode.gz
> create mode 100644 tests/ubifs_tools-tests/images/inode_nlink.gz
> create mode 100644 tests/ubifs_tools-tests/images/inode_size.gz
> create mode 100644 tests/ubifs_tools-tests/images/inode_xcnt.gz
> create mode 100644 tests/ubifs_tools-tests/images/journal_bud.gz
> create mode 100644 tests/ubifs_tools-tests/images/journal_log.gz
> create mode 100644 tests/ubifs_tools-tests/images/lpt_dirty.gz
> create mode 100644 tests/ubifs_tools-tests/images/lpt_flags.gz
> create mode 100644 tests/ubifs_tools-tests/images/lpt_free.gz
> create mode 100644 tests/ubifs_tools-tests/images/lpt_pos.gz
> create mode 100644 tests/ubifs_tools-tests/images/ltab_dirty.gz
> create mode 100644 tests/ubifs_tools-tests/images/ltab_free.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_highest_inum.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_lpt.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_tnc.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_total_dead.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_total_dirty.gz
> create mode 100644 tests/ubifs_tools-tests/images/master_total_free.gz
> create mode 100644 tests/ubifs_tools-tests/images/orphan_node.gz
> create mode 100644 tests/ubifs_tools-tests/images/root_dir.gz
> create mode 100644 tests/ubifs_tools-tests/images/sb_fanout.gz
> create mode 100644 tests/ubifs_tools-tests/images/sb_fmt_version.gz
> create mode 100644 tests/ubifs_tools-tests/images/sb_leb_size.gz
> create mode 100644 tests/ubifs_tools-tests/images/sb_log_lebs.gz
> create mode 100644 tests/ubifs_tools-tests/images/sb_min_io_size.gz
> create mode 100644 tests/ubifs_tools-tests/images/soft_link_data_len.gz
> create mode 100644 tests/ubifs_tools-tests/images/soft_link_inode_mode.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_lv0_key.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_lv0_len.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_lv0_pos.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_noleaf_key.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_noleaf_len.gz
> create mode 100644 tests/ubifs_tools-tests/images/tnc_noleaf_pos.gz
> create mode 100644 tests/ubifs_tools-tests/images/xent_host.gz
> create mode 100644 tests/ubifs_tools-tests/images/xentry_key.gz
> create mode 100644 tests/ubifs_tools-tests/images/xentry_nlen.gz
> create mode 100644 tests/ubifs_tools-tests/images/xentry_type.gz
> create mode 100644 tests/ubifs_tools-tests/images/xinode_flags.gz
> create mode 100644 tests/ubifs_tools-tests/images/xinode_key.gz
> create mode 100644 tests/ubifs_tools-tests/images/xinode_mode.gz
> create mode 100755 tests/ubifs_tools-tests/lib/common.sh.in
> create mode 100755 tests/ubifs_tools-tests/mkfs_tests/build_fs_from_dir.sh.in
> create mode 100755 tests/ubifs_tools-tests/ubifs_tools_run_all.sh.in
> create mode 100644 ubifs-utils/common/README
> create mode 100644 ubifs-utils/common/atomic.h
> create mode 100644 ubifs-utils/common/bitops.c
> create mode 100644 ubifs-utils/common/bitops.h
> create mode 100644 ubifs-utils/common/compiler_attributes.h
> rename ubifs-utils/{mkfs.ubifs => common}/compr.c (95%)
> rename ubifs-utils/{mkfs.ubifs => common}/compr.h (91%)
> rename ubifs-utils/{mkfs.ubifs => common}/crc16.c (100%)
> rename ubifs-utils/{mkfs.ubifs => common}/crc16.h (100%)
> rename ubifs-utils/{mkfs.ubifs => common}/crypto.c (98%)
> rename ubifs-utils/{mkfs.ubifs => common}/crypto.h (100%)
> create mode 100644 ubifs-utils/common/defs.h
> rename ubifs-utils/{mkfs.ubifs => common}/devtable.c (84%)
> rename ubifs-utils/{mkfs.ubifs/mkfs.ubifs.h => common/devtable.h} (53%)
> rename ubifs-utils/{mkfs.ubifs => common}/fscrypt.c (90%)
> rename ubifs-utils/{mkfs.ubifs => common}/fscrypt.h (91%)
> rename ubifs-utils/{mkfs.ubifs => common}/hashtable/hashtable.c (99%)
> rename ubifs-utils/{mkfs.ubifs => common}/hashtable/hashtable.h (100%)
> rename ubifs-utils/{mkfs.ubifs => common}/hashtable/hashtable_itr.c (100%)
> rename ubifs-utils/{mkfs.ubifs => common}/hashtable/hashtable_itr.h (100%)
> rename ubifs-utils/{mkfs.ubifs => common}/hashtable/hashtable_private.h (100%)
> create mode 100644 ubifs-utils/common/hexdump.c
> create mode 100644 ubifs-utils/common/kmem.c
> create mode 100644 ubifs-utils/common/kmem.h
> create mode 100644 ubifs-utils/common/linux_err.h
> create mode 100644 ubifs-utils/common/linux_types.h
> create mode 100644 ubifs-utils/common/mutex.h
> create mode 100644 ubifs-utils/common/rwsem.h
> rename ubifs-utils/{mkfs.ubifs => common}/sign.c (66%)
> create mode 100644 ubifs-utils/common/sign.h
> create mode 100644 ubifs-utils/common/sort.c
> create mode 100644 ubifs-utils/common/sort.h
> create mode 100644 ubifs-utils/common/spinlock.h
> create mode 100644 ubifs-utils/fsck.ubifs/.gitignore
> create mode 100644 ubifs-utils/fsck.ubifs/README.txt
> create mode 100644 ubifs-utils/fsck.ubifs/check_files.c
> create mode 100644 ubifs-utils/fsck.ubifs/check_space.c
> create mode 100644 ubifs-utils/fsck.ubifs/extract_files.c
> create mode 100644 ubifs-utils/fsck.ubifs/fsck.ubifs.c
> create mode 100644 ubifs-utils/fsck.ubifs/fsck.ubifs.h
> create mode 100644 ubifs-utils/fsck.ubifs/handle_disconnected.c
> create mode 100644 ubifs-utils/fsck.ubifs/load_fs.c
> create mode 100644 ubifs-utils/fsck.ubifs/problem.c
> create mode 100644 ubifs-utils/fsck.ubifs/rebuild_fs.c
> create mode 100644 ubifs-utils/libubifs/README
> create mode 100644 ubifs-utils/libubifs/auth.c
> create mode 100644 ubifs-utils/libubifs/budget.c
> create mode 100644 ubifs-utils/libubifs/commit.c
> create mode 100644 ubifs-utils/libubifs/debug.c
> create mode 100644 ubifs-utils/libubifs/debug.h
> create mode 100644 ubifs-utils/libubifs/dir.c
> create mode 100644 ubifs-utils/libubifs/find.c
> create mode 100644 ubifs-utils/libubifs/gc.c
> create mode 100644 ubifs-utils/libubifs/io.c
> create mode 100644 ubifs-utils/libubifs/journal.c
> create mode 100644 ubifs-utils/libubifs/key.h
> create mode 100644 ubifs-utils/libubifs/log.c
> create mode 100644 ubifs-utils/libubifs/lprops.c
> create mode 100644 ubifs-utils/libubifs/lpt.c
> create mode 100644 ubifs-utils/libubifs/lpt_commit.c
> create mode 100644 ubifs-utils/libubifs/master.c
> create mode 100644 ubifs-utils/libubifs/misc.h
> create mode 100644 ubifs-utils/libubifs/orphan.c
> create mode 100644 ubifs-utils/libubifs/recovery.c
> create mode 100644 ubifs-utils/libubifs/replay.c
> create mode 100644 ubifs-utils/libubifs/sb.c
> create mode 100644 ubifs-utils/libubifs/scan.c
> create mode 100644 ubifs-utils/libubifs/super.c
> create mode 100644 ubifs-utils/libubifs/tnc.c
> create mode 100644 ubifs-utils/libubifs/tnc_commit.c
> create mode 100644 ubifs-utils/libubifs/tnc_misc.c
> rename {include/mtd => ubifs-utils/libubifs}/ubifs-media.h (100%)
> create mode 100644 ubifs-utils/libubifs/ubifs.h
> delete mode 100644 ubifs-utils/mkfs.ubifs/README
> delete mode 100644 ubifs-utils/mkfs.ubifs/defs.h
> delete mode 100644 ubifs-utils/mkfs.ubifs/key.h
> delete mode 100644 ubifs-utils/mkfs.ubifs/lpt.c
> delete mode 100644 ubifs-utils/mkfs.ubifs/lpt.h
> delete mode 100644 ubifs-utils/mkfs.ubifs/sign.h
> delete mode 100644 ubifs-utils/mkfs.ubifs/ubifs.h
>
More information about the linux-mtd
mailing list