mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-16 11:25:31 +00:00
btrfs-progs: check: lowmem: Fix false alert about orphan inode
Btrfs can delay inode deletion and in that case btrfs will unlink the victim inode from its parent dir, and insert a marker to info btrfs to delete it later. In that case, such victim inode will have nlinks == 0, but is still completely valid. Original mode won't report such problem, but lowmem mode doesn't check the ORPHAN_ITEM key for such inode, and can report false alert like: ------ ERROR: root 257 INODE[28891726] is orphan item ------ Fix such false alert by checking orphan item for inode whose nlink is 0. Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Su Yue <suy.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
89f5a8f97c
commit
8d6c444782
@ -1861,6 +1861,24 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool has_orphan_item(struct btrfs_root *root, u64 ino)
|
||||
{
|
||||
struct btrfs_path path;
|
||||
struct btrfs_key key;
|
||||
int ret;
|
||||
|
||||
btrfs_init_path(&path);
|
||||
key.objectid = BTRFS_ORPHAN_OBJECTID;
|
||||
key.type = BTRFS_ORPHAN_ITEM_KEY;
|
||||
key.offset = ino;
|
||||
|
||||
ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
|
||||
btrfs_release_path(&path);
|
||||
if (ret == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check INODE_ITEM and related ITEMs (the same inode number)
|
||||
* 1. check link count
|
||||
@ -1890,6 +1908,7 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path,
|
||||
u64 extent_size = 0;
|
||||
unsigned int dir;
|
||||
unsigned int nodatasum;
|
||||
bool is_orphan = false;
|
||||
int slot;
|
||||
int ret;
|
||||
int err = 0;
|
||||
@ -2040,10 +2059,11 @@ out:
|
||||
root->objectid, inode_id, nlink, refs);
|
||||
}
|
||||
} else if (!nlink) {
|
||||
if (repair)
|
||||
is_orphan = has_orphan_item(root, inode_id);
|
||||
if (!is_orphan && repair)
|
||||
ret = repair_inode_orphan_item_lowmem(root,
|
||||
path, inode_id);
|
||||
if (!repair || ret) {
|
||||
if (!is_orphan && (!repair || ret)) {
|
||||
err |= ORPHAN_ITEM;
|
||||
error("root %llu INODE[%llu] is orphan item",
|
||||
root->objectid, inode_id);
|
||||
|
Loading…
Reference in New Issue
Block a user