From 15bc913158710ce6c5bc9e48d902b36ff89f8d18 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Tue, 9 Dec 2014 16:27:28 +0800 Subject: [PATCH] btrfs-progs: Add helper function find_file_name/type for nlink and inode_item repair. Add find_file_name() and find_file_type() function for later nlink and inode_item repair. Later nlink repair will use both function and and inode_item repair will use find_file_type(). They are done by searching the backref list, dir_item/index for type search and dir_item/index or inode_ref for name search. Signed-off-by: Qu Wenruo Signed-off-by: David Sterba --- cmds-check.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/cmds-check.c b/cmds-check.c index 408baaa8..9c0189d9 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -1874,6 +1874,47 @@ static int repair_inode_backrefs(struct btrfs_root *root, return ret ? ret : repaired; } +/* + * To determine the file type for nlink/inode_item repair + * + * Return 0 if file type is found and BTRFS_FT_* is stored into type. + * Return -ENOENT if file type is not found. + */ +static int find_file_type(struct inode_record *rec, u8 *type) +{ + struct inode_backref *backref; + + list_for_each_entry(backref, &rec->backrefs, list) { + if (backref->found_dir_index || backref->found_dir_item) { + *type = backref->filetype; + return 0; + } + } + return -ENOENT; +} + +/* + * To determine the file name for nlink repair + * + * Return 0 if file name is found, set name and namelen. + * Return -ENOENT if file name is not found. + */ +static int find_file_name(struct inode_record *rec, + char *name, int *namelen) +{ + struct inode_backref *backref; + + list_for_each_entry(backref, &rec->backrefs, list) { + if (backref->found_dir_index || backref->found_dir_item || + backref->found_inode_ref) { + memcpy(name, backref->name, backref->namelen); + *namelen = backref->namelen; + return 0; + } + } + return -ENOENT; +} + static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec) { struct btrfs_trans_handle *trans;