btrfs-progs: Add helper function find_file_name/type for nlink and inode_item repair.
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Tue, 9 Dec 2014 08:27:28 +0000 (16:27 +0800)
committerDavid Sterba <dsterba@suse.cz>
Wed, 10 Dec 2014 12:44:53 +0000 (13:44 +0100)
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 <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
cmds-check.c

index 408baaa..9c0189d 100644 (file)
@@ -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;