From: Qu Wenruo Date: Tue, 9 Dec 2014 08:27:28 +0000 (+0800) Subject: btrfs-progs: Add helper function find_file_name/type for nlink and inode_item repair. X-Git-Tag: upstream/4.16.1~2540 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=15bc913158710ce6c5bc9e48d902b36ff89f8d18;p=platform%2Fupstream%2Fbtrfs-progs.git 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 --- diff --git a/cmds-check.c b/cmds-check.c index 408baaa..9c0189d 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;