This patch will reuse the mode independent repair_imode() function, to repair invalid inode mode.
Signed-off-by: Qu Wenruo <w...@suse.com> --- check/main.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/check/main.c b/check/main.c index 553c93caa2c9..5db0716d23a1 100644 --- a/check/main.c +++ b/check/main.c @@ -2698,6 +2698,24 @@ static int repair_mismatch_dir_hash(struct btrfs_trans_handle *trans, return ret; } +static int repair_imode_original(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_path *path, + struct inode_record *rec) +{ + int ret; + + if (root->root_key.objectid != BTRFS_ROOT_TREE_OBJECTID) + return 0; + if (rec->ino != BTRFS_ROOT_TREE_DIR_OBJECTID || !is_fstree(rec->ino)) + return 0; + ret = repair_imode(trans, root, path, rec->ino); + if (ret < 0) + return ret; + rec->errors &= ~I_ERR_INVALID_IMODE; + return ret; +} + static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec) { struct btrfs_trans_handle *trans; @@ -2745,6 +2763,8 @@ static int try_repair_inode(struct btrfs_root *root, struct inode_record *rec) ret = repair_inode_nbytes(trans, root, &path, rec); if (!ret && rec->errors & I_ERR_INLINE_RAM_BYTES_WRONG) ret = repair_inline_ram_bytes(trans, root, &path, rec); + if (!ret && rec->errors & I_ERR_INVALID_IMODE) + ret = repair_imode_original(trans, root, &path, rec); btrfs_commit_transaction(trans, root); btrfs_release_path(&path); return ret; -- 2.21.0