diff mbox

[04/20] btrfs-progs: cmds-check.c: change find_inode_ref's arg

Message ID 20170301031403.23902-5-suy.fnst@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Su Yue March 1, 2017, 3:13 a.m. UTC
For further lowmem repairs, change the index type u64 to u64 *.
So we could get the index of ref.

Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
---
 cmds-check.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)
diff mbox

Patch

diff --git a/cmds-check.c b/cmds-check.c
index fb239968..246f4735 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -4422,22 +4422,23 @@  next:
 }
 
 /*
- * Find INODE_REF/INODE_EXTREF for the given key and check it with the specified
- * DIR_ITEM/DIR_INDEX match.
+ * Find INODE_REF/INODE_EXTREF for the given key and check it with the
+ * specified DIR_ITEM/DIR_INDEX match.Returned with right @index.
  *
  * @root:	the root of the fs/file tree
  * @key:	the key of the INODE_REF/INODE_EXTREF
  * @name:	the name in the INODE_REF/INODE_EXTREF
  * @namelen:	the length of name in the INODE_REF/INODE_EXTREF
- * @index:	the index in the INODE_REF/INODE_EXTREF, for DIR_ITEM set index
- * to (u64)-1
+ * @index_ret:	the index in the INODE_REF/INODE_EXTREF,
+ *              value (64)-1 means do not check index and return
+ *              with matched index.
  * @ext_ref:	the EXTENDED_IREF feature
  *
  * Return 0 if no error occurred.
  * Return >0 for error bitmap
  */
 static int find_inode_ref(struct btrfs_root *root, struct btrfs_key *key,
-			  char *name, int namelen, u64 index,
+			  const char *name, int namelen, u64 *index_ret,
 			  unsigned int ext_ref)
 {
 	struct btrfs_path path;
@@ -4474,7 +4475,8 @@  static int find_inode_ref(struct btrfs_root *root, struct btrfs_key *key,
 
 		ref_namelen = btrfs_inode_ref_name_len(node, ref);
 		ref_index = btrfs_inode_ref_index(node, ref);
-		if (index != (u64)-1 && index != ref_index)
+		if (index_ret && *index_ret != (u64)-1 &&
+		    *index_ret != ref_index)
 			goto next_ref;
 
 		if (ref_namelen <= BTRFS_NAME_LEN) {
@@ -4492,7 +4494,8 @@  static int find_inode_ref(struct btrfs_root *root, struct btrfs_key *key,
 
 		if (len != namelen || strncmp(ref_namebuf, name, len))
 			goto next_ref;
-
+		if (index_ret)
+			*index_ret = ref_index;
 		ret = 0;
 		goto out;
 next_ref:
@@ -4533,7 +4536,8 @@  extref:
 		ref_namelen = btrfs_inode_extref_name_len(node, extref);
 		ref_index = btrfs_inode_extref_index(node, extref);
 		parent = btrfs_inode_extref_parent(node, extref);
-		if (index != (u64)-1 && index != ref_index)
+		if (index_ret && *index_ret != (u64)-1 &&
+		    *index_ret != ref_index)
 			goto next_extref;
 
 		if (parent != dir_id)
@@ -4555,6 +4559,8 @@  extref:
 		if (len != namelen || strncmp(ref_namebuf, name, len))
 			goto next_extref;
 
+		if (index_ret)
+			*index_ret = ref_index;
 		ret = 0;
 		goto out;
 
@@ -4668,7 +4674,7 @@  static int check_dir_item(struct btrfs_root *root, struct btrfs_key *key,
 		location.type = BTRFS_INODE_REF_KEY;
 		location.offset = key->objectid;
 		ret = find_inode_ref(root, &location, namebuf, len,
-				       index, ext_ref);
+				       &index, ext_ref);
 		err |= ret;
 		if (ret & INODE_REF_MISSING)
 			error("root %llu %s[%llu %llu] relative INODE_REF missing namelen %u filename %s filetype %d",