Btrfs-progs: add ability to replace missing dir item/dir indexes
If we have everything except the dir item and dir index we can easily replace them, so add this ability to btrfsck. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
parent
2d80d0d645
commit
2dc4c0015f
1 changed files with 27 additions and 0 deletions
27
cmds-check.c
27
cmds-check.c
|
@ -1772,6 +1772,33 @@ static int repair_inode_backrefs(struct btrfs_root *root,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!delete && (!backref->found_dir_index &&
|
||||||
|
!backref->found_dir_item &&
|
||||||
|
backref->found_inode_ref)) {
|
||||||
|
struct btrfs_trans_handle *trans;
|
||||||
|
struct btrfs_key location;
|
||||||
|
|
||||||
|
location.objectid = rec->ino;
|
||||||
|
location.type = BTRFS_INODE_ITEM_KEY;
|
||||||
|
location.offset = 0;
|
||||||
|
|
||||||
|
trans = btrfs_start_transaction(root, 1);
|
||||||
|
if (IS_ERR(trans)) {
|
||||||
|
ret = PTR_ERR(trans);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "adding missing dir index/item pair "
|
||||||
|
"for inode %llu\n",
|
||||||
|
(unsigned long long)rec->ino);
|
||||||
|
ret = btrfs_insert_dir_item(trans, root, backref->name,
|
||||||
|
backref->namelen,
|
||||||
|
backref->dir, &location,
|
||||||
|
imode_to_type(rec->imode),
|
||||||
|
backref->index);
|
||||||
|
BUG_ON(ret);
|
||||||
|
btrfs_commit_transaction(trans, root);
|
||||||
|
repaired++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret ? ret : repaired;
|
return ret ? ret : repaired;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue