From: Darrick J. Wong <djwong@xxxxxxxxxx> Enhance the inode link count online fsck code alter their behavior when they detect metadata directory tree roots, just like they do for the regular root directory. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- fs/xfs/scrub/nlinks.c | 12 +++++++----- fs/xfs/scrub/nlinks_repair.c | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/xfs/scrub/nlinks.c b/fs/xfs/scrub/nlinks.c index dca759d27ac4..5325bb0e196e 100644 --- a/fs/xfs/scrub/nlinks.c +++ b/fs/xfs/scrub/nlinks.c @@ -282,7 +282,7 @@ xchk_nlinks_collect_dirent( * Otherwise, increment the number of backrefs pointing back to ino. */ if (dotdot) { - if (dp == sc->mp->m_rootip) + if (dp == sc->mp->m_rootip || dp == sc->mp->m_metadirip) error = xchk_nlinks_update_incore(xnc, ino, 1, 0, 0); else error = xchk_nlinks_update_incore(xnc, ino, 0, 1, 0); @@ -458,9 +458,11 @@ xchk_nlinks_collect( int error; /* Count the rt and quota files that are rooted in the superblock. */ - error = xchk_nlinks_collect_metafiles(xnc); - if (error) - return error; + if (!xfs_has_metadir(sc->mp)) { + error = xchk_nlinks_collect_metafiles(xnc); + if (error) + return error; + } /* * Set up for a potentially lengthy filesystem scan by reducing our @@ -648,7 +650,7 @@ xchk_nlinks_compare_inode( xchk_ino_set_corrupt(sc, ip->i_ino); } - if (ip == sc->mp->m_rootip) { + if (ip == sc->mp->m_rootip || ip == sc->mp->m_metadirip) { /* * For the root of a directory tree, both the '.' and '..' * entries should point to the root directory. The dot entry diff --git a/fs/xfs/scrub/nlinks_repair.c b/fs/xfs/scrub/nlinks_repair.c index f881e5dbd432..055eb4b67053 100644 --- a/fs/xfs/scrub/nlinks_repair.c +++ b/fs/xfs/scrub/nlinks_repair.c @@ -86,7 +86,7 @@ xrep_nlinks_is_orphaned( if (obs->parents != 0) return false; - if (ip == mp->m_rootip || ip == sc->orphanage) + if (ip == mp->m_rootip || ip == sc->orphanage || ip == mp->m_metadirip) return false; return actual_nlink != 0; }