Message ID | 20200824140049.28633-1-nborisov@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs-progs: check: Fix error reporting on root inode | expand |
On 8/24/20 10:00 AM, Nikolay Borisov wrote: > If btrfs check detects an error on the root inode of a subvolume it > prints: > > Opening filesystem to check... > Checking filesystem on /dev/vdc > UUID: 4ac7a216-bf97-4c5f-9899-0f203c20d8af > [1/7] checking root items > [2/7] checking extents > [3/7] checking free space cache > [4/7] checking fs roots > root 5 root dir 256 error > ERROR: errors found in fs roots > found 196608 bytes used, error(s) found > total csum bytes: 0 > total tree bytes: 131072 > total fs tree bytes: 32768 > total extent tree bytes: 16384 > btree space waste bytes: 124376 > file data blocks allocated: 65536 > referenced 65536 > > This is not very helpful since there is no specific information about > the exact error. This is due to the fact that check_root_dir doesn't > set inode_record::errors accordingly. This patch rectifies this and now > the output would look like: > > [1/7] checking root items > [2/7] checking extents > [3/7] checking free space cache > [4/7] checking fs roots > root 5 inode 256 errors 2000, link count wrong > ERROR: errors found in fs roots > found 196608 bytes used, error(s) found > total csum bytes: 0 > total tree bytes: 131072 > total fs tree bytes: 32768 > total extent tree bytes: 16384 > btree space waste bytes: 124376 > file data blocks allocated: 65536 > referenced 65536 > > Signed-off-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Thanks, Josef
On Mon, Aug 24, 2020 at 05:00:49PM +0300, Nikolay Borisov wrote: > If btrfs check detects an error on the root inode of a subvolume it > prints: > > Opening filesystem to check... > Checking filesystem on /dev/vdc > UUID: 4ac7a216-bf97-4c5f-9899-0f203c20d8af > [1/7] checking root items > [2/7] checking extents > [3/7] checking free space cache > [4/7] checking fs roots > root 5 root dir 256 error > ERROR: errors found in fs roots > found 196608 bytes used, error(s) found > total csum bytes: 0 > total tree bytes: 131072 > total fs tree bytes: 32768 > total extent tree bytes: 16384 > btree space waste bytes: 124376 > file data blocks allocated: 65536 > referenced 65536 > > This is not very helpful since there is no specific information about > the exact error. This is due to the fact that check_root_dir doesn't > set inode_record::errors accordingly. This patch rectifies this and now > the output would look like: > > [1/7] checking root items > [2/7] checking extents > [3/7] checking free space cache > [4/7] checking fs roots > root 5 inode 256 errors 2000, link count wrong > ERROR: errors found in fs roots > found 196608 bytes used, error(s) found > total csum bytes: 0 > total tree bytes: 131072 > total fs tree bytes: 32768 > total extent tree bytes: 16384 > btree space waste bytes: 124376 > file data blocks allocated: 65536 > referenced 65536 > > Signed-off-by: Nikolay Borisov <nborisov@suse.com> Added to devel, thanks.
diff --git a/check/main.c b/check/main.c index f93bd7d4ca70..c622caa8e04f 100644 --- a/check/main.c +++ b/check/main.c @@ -1885,20 +1885,45 @@ static int check_root_dir(struct inode_record *rec) struct inode_backref *backref; int ret = -1; - if (!rec->found_inode_item || rec->errors) + if (rec->errors) goto out; - if (rec->nlink != 1 || rec->found_link != 0) + + if (!rec->found_inode_item) { + rec->errors |= I_ERR_NO_INODE_ITEM; + goto out; + } + + if (rec->nlink != 1 || rec->found_link != 0) { + rec->errors |= I_ERR_LINK_COUNT_WRONG; goto out; - if (list_empty(&rec->backrefs)) + } + + if (list_empty(&rec->backrefs)) { + rec->errors |= REF_ERR_NO_ROOT_BACKREF; goto out; + } + backref = to_inode_backref(rec->backrefs.next); - if (!backref->found_inode_ref) + if (!backref->found_inode_ref) { + rec->errors |= REF_ERR_NO_INODE_REF; goto out; + } + if (backref->index != 0 || backref->namelen != 2 || - memcmp(backref->name, "..", 2)) + memcmp(backref->name, "..", 2)) { + rec->errors |= I_ERR_ODD_DIR_ITEM; + goto out; + } + + if (backref->found_dir_index) { + rec->errors |= REF_ERR_DUP_DIR_INDEX; goto out; - if (backref->found_dir_index || backref->found_dir_item) + } + + if (backref->found_dir_item) { + rec->errors |= REF_ERR_DUP_DIR_ITEM; goto out; + } ret = 0; out: return ret; @@ -2992,9 +3017,6 @@ static int check_inode_recs(struct btrfs_root *root, } ret = check_root_dir(rec); if (ret) { - fprintf(stderr, "root %llu root dir %llu error\n", - (unsigned long long)root->root_key.objectid, - (unsigned long long)root_dirid); print_inode_error(root, rec); error++; }
If btrfs check detects an error on the root inode of a subvolume it prints: Opening filesystem to check... Checking filesystem on /dev/vdc UUID: 4ac7a216-bf97-4c5f-9899-0f203c20d8af [1/7] checking root items [2/7] checking extents [3/7] checking free space cache [4/7] checking fs roots root 5 root dir 256 error ERROR: errors found in fs roots found 196608 bytes used, error(s) found total csum bytes: 0 total tree bytes: 131072 total fs tree bytes: 32768 total extent tree bytes: 16384 btree space waste bytes: 124376 file data blocks allocated: 65536 referenced 65536 This is not very helpful since there is no specific information about the exact error. This is due to the fact that check_root_dir doesn't set inode_record::errors accordingly. This patch rectifies this and now the output would look like: [1/7] checking root items [2/7] checking extents [3/7] checking free space cache [4/7] checking fs roots root 5 inode 256 errors 2000, link count wrong ERROR: errors found in fs roots found 196608 bytes used, error(s) found total csum bytes: 0 total tree bytes: 131072 total fs tree bytes: 32768 total extent tree bytes: 16384 btree space waste bytes: 124376 file data blocks allocated: 65536 referenced 65536 Signed-off-by: Nikolay Borisov <nborisov@suse.com> --- check/main.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) -- 2.17.1