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 <quwen...@cn.fujitsu.com>
---
Changelog:
v4:
   Newly introduced to replace the old find_file_name_type(),
   which doesn't make full use of the backref list and does a poor job
   in case of leaf corruption.
---
 cmds-check.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/cmds-check.c b/cmds-check.c
index 53557b6..3ec619f 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;
-- 
2.1.3

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to