summaryrefslogtreecommitdiff
path: root/cmds-check.c
Commit message (Collapse)AuthorAge
* btrfs-progs: remove extra newline from messagesDavid Sterba2016-12-14
| | | | | | The common message helpers add the newline. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: fix NULL pointer dereference for possible memory ↵Qu Wenruo2016-12-14
| | | | | | | | | | | | | | | allocation failure We didn't check 'path' allocated in check_root_ref(), which can cause NULL pointer dereference if the memory allocation failed. Fix it by using stack memory, since the function should return error bitmap not minus error code, we don't want memory allocation to be an exception. Resolves-Coverity-CID: 1372510 Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: fsck: Fix patch allocation check and leak in check_fs_first_inodeQu Wenruo2016-12-14
| | | | | | | | | | | | Allocated 'path' in check_fs_first_inode() is not checked and for btrfs_search_slot() error, it will leak 'path'. Fix it. Resolves-Coverity-CID: 1374098 Resolves-Coverity-CID: 1374099 Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: Enhance leaf traversal function to handle missing inode itemQu Wenruo2016-12-14
| | | | | | | | | | | | | | | | | | | | | The leaf traversal function in lowmem mode will skip to the first inode item of leaf and begin to check the inode. That's designed to avoid checking overlapping part of a leaf. But that will cause problem in fsck/010 test case, as in that case inode item of the first inode(256) is missing. So above traversal will check from inode 257 and found nothing wrong. The fix is done in 2 part: 1) Manually check the first inode To avoid case like fsck/010 2) Check inode if ino changes from the first ino of a leaf To avoid missing inode_item problem. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: skip shared node or leaf check for low_memory modeWang Xiaoguang2016-12-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The basic idea is simple. Assume a middle tree node A is shared and its referencing fs/file tree root ids are 5, 258 and 260, then we only check node A in the tree who has the smallest root id. That means in this case, when checking root tree(5), we check inode A, for root tree 258 and 260, we can just skip it. Notice even with this patch, we still may visit a shared node or leaf multiple times. This happens when a inode metadata occupies multiple leaves. leaf_A leaf_B When checking inode item in leaf_A, assume inode[512] have file extents in leaf_B, and leaf_B is shared. In the case, for inode[512], we must visit leaf_B to have inode item checked. After finishing inode[512] check, here we walk down tree root to leaf_B to check whether node or leaf is shared, if some node or leaf is shared, we can just skip it and below nodes or leaf's check. I also fill a disk partition with linux source codes and create 3 snapshots in it. Before this patch, it averagely took 46s to finish one btrfsck execution, with this patch, it averagely took 15s. Signed-off-by: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: fix the return value bug of cmd_check()Lu Fengqi2016-12-14
| | | | | | | | | | | | The function cmd_check() is called by the main function of btrfs.c, its return value will be returned by exit(). Resulting in the loss of significant bits in some cases, for example this value is greater than 0377. If use a bool value "err" to store all of the return value, this will solve the problem. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce low_memory mode fs_tree checkLu Fengqi2016-12-14
| | | | | | | | | | Introduce a new function check_fs_roots_v2() for check fs_tree in low_memory mode. It call check_fs_root_v2() to check fs_root, and call check_root_ref() to check root_ref. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check root refLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_root_ref() to check root_ref/root_backref. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check fs rootLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_fs_root_v2() to check fs root, and call check_inode_item to check the items in the tree. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check inode itemLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_inode_item() to check INODE_ITEM and related ITEMs that have the same inode id. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check file extentLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_file_extent() to check file extent, such as datasum, hole, size. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check dir_itemLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_dir_item() to check DIR_ITEM/DIR_INDEX, and call find_inode_ref() to find the related INODE_REF/INODE_EXTREF. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to find inode_refLu Fengqi2016-12-14
| | | | | | | | | | Introduce a new function find_inode_ref() to find INODE_REF/INODE_EXTREF for the given key, and check it with the specified DIR_ITEM/DIR_INDEX match. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check inode_extrefLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_inode_extref() to check INODE_EXTREF, and call find_dir_item() to find the related DIR_ITEM/DIR_INDEX. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to check inode_refLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function check_inode_ref() to check INODE_REF, and call find_dir_item() to find the related DIR_ITEM/DIR_INDEX. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: introduce function to find dir_itemLu Fengqi2016-12-14
| | | | | | | | | Introduce a new function find_dir_item() to find DIR_ITEM for the given key, and check it with the specified INODE_REF/INODE_EXTREF match. Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: fix missing newlinesOmar Sandoval2016-11-23
| | | | | | | | | Also, the other progress messages go to stderr, so "checking extents" probably should, as well. Fixes: c7a1f66a205f ("btrfs-progs: check: switch some messages to common helpers") Signed-off-by: Omar Sandoval <osandov@fb.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: implement btrfs check --clear-space-cache v2Omar Sandoval2016-11-23
| | | | | | | Reviewed-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Omar Sandoval <osandov@fb.com> [ adjusted error messages ] Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: return best entry, if it is the first oneGoldwyn Rodrigues2016-11-23
| | | | | | | | | | | | The find_most_right_entry() tends to miss on the best entry if it is the first one on the list and there are only two entries in the list. So, we assign both prev and best to entry. To do this, the selection process (rather the rejection) has to be performed earlier to skip on broken==count. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: remove unused variable in record_extentDavid Sterba2016-11-09
| | | | | | | | In a similar code, it's used for a message. Not used in this code since the beggingin, safe to remove. Resolves-coverity-id: 1364085 Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in repair_root_itemsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in build_roots_info_cacheDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in fill_csum_tree_from_extentDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in fill_csum_tree_from_fsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in fill_csum_tree_from_one_fs_rootDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in delete_bad_itemDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in recow_extent_bufferDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in reset_balanceDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in reset_block_groupsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in fixup_extent_flagsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in fixup_extent_refsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in record_orphan_data_extentsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in delete_duplicate_recordsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in check_extent_existsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in check_extent_csumsDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in verify_space_cacheDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in try_to_fix_bad_blockDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in repair_btreeDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in try_repair_inodeDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in find_normal_file_extentDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in delete_dir_indexDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: use on-stack path buffer in add_missing_dir_indexDavid Sterba2016-11-09
| | | | | | | We don't need to conserve stack space too much unlike kernel, also remove one error condition. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: reorder fields in inode_backref for better packingDavid Sterba2016-11-09
| | | | | | | The structure size went from 56 bytes to 48, which could save some bytes in larger scale. Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: unify type for inode_backref::itemtypeDavid Sterba2016-11-09
| | | | Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: unify type for inode_backref::filetypeDavid Sterba2016-11-09
| | | | Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: add support to clear v1 free space cacheQu Wenruo2016-11-09
| | | | | | | | | | | | | | | | Kernel clear_cache mount option will only rebuild free space cache if the used space of that chunk has changed. So it won't ensure any corrupted free space cache get cleared. So add a new option "--clear-space-cache v1|v2" to btrfsck, to completely wipe out free space cache. So kernel won't complain again. Reported-by: Ivan P <chrnosphered@gmail.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> [ adjusted error messages, doc wording changes ] Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: check: release path after usageGoldwyn Rodrigues2016-10-25
| | | | | | | | While performing an fsck, an assertion failure occurs because of reusing path in a loop. ctree.c:1112: btrfs_search_slot: Warning: assertion `p->nodes[0] != NULL` failed, value 0 Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: Fix wrong tree block alignment for unalianged block groupQu Wenruo2016-10-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 854437ca(btrfs-progs: extent-tree: avoid allocating tree block that crosses stripe boundary) introduces check for logical bytenr not crossing stripe boundary. However that check is not completely correct. It only checks if the logical bytenr and length agaist absolute logical offset. That's to say, it only check if a tree block lies in 64K logical stripe. But in fact, it's possible a block group starts at bytenr unaligned with 64K, just like the following case. Then btrfsck will give false alert. 0 32K 64K 96K 128K 160K ... |--------------- Block group A --------------------- |<-----TB 32K------>| |/Scrub stripe unit/| | WRONG UNIT | In that case, TB(tree block) at bytenr 32K in fact fits into the kernel scrub stripe unit. But doesn't fit into the pure logical 64K stripe. Fix check_crossing_stripes() to compare bytenr to block group start, not to absolute logical bytenr. Reported-by: Jussi Kansanen <jussi.kansanen@gmail.com> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: fix user-facing typos in docs and help stringsNicholas D Steeves2016-10-03
| | | | | Signed-off-by: Nicholas D Steeves <nsteeves@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>
* btrfs-progs: change btrfs_csum_final result param type to u8Domagoj Tršan2016-10-03
| | | | | Signed-off-by: Domagoj Tršan <domagoj.trsan@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>