@@ -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",
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(-)