[PATCH 5/5] xfs_repair: set proper ftype when moving to lost+found

Eric Sandeen
2014-09-07T16:41:09Z

When we move files to lost+found, we're setting the
filetype to UNKNOWN. This leaves an inconsistency which
is discovered on a subsequent repair:

would fix ftype mismatch (0/1) in directory/child inode 5838/5839

Setting the proper ftype at the time of the move
resolves this:

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
repair/phase6.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/repair/phase6.c b/repair/phase6.c
index cc36a9c..02714c2 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -1091,14 +1091,13 @@ mv_orphanage(
ino_tree_node_t *irec;
int ino_offset = 0;
struct xfs_name xname;
+ __uint16_t di_mode;

ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb));

xname.name = fname;
xname.len = snprintf((char *)fname, sizeof(fname), "%llu",
(unsigned long long)ino);
- /* XXX use xfs_mode_to_ftype[] when userspace gains it */
- xname.type = XFS_DIR3_FT_UNKNOWN;

err = libxfs_iget(mp, NULL, orphanage_ino, 0, &orphanage_ip, 0);
if (err)
@@ -1117,6 +1116,10 @@ mv_orphanage(
if ((err = libxfs_iget(mp, NULL, ino, 0, &ino_p, 0)))
do_error(_("%d - couldn't iget disconnected inode\n"), err);

+ di_mode = ino_p->i_d.di_mode;
+ di_mode = (di_mode & S_IFMT) >> S_SHIFT;
+ xname.type = xfs_mode_to_ftype[di_mode];
+
if (isa_dir) {
irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, orphanage_ino),
XFS_INO_TO_AGINO(mp, orphanage_ino));
--
1.7.1