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 4e62e287e1590..46785e0712377 100644 --- a/fs/xfs/scrub/nlinks.c +++ b/fs/xfs/scrub/nlinks.c @@ -275,7 +275,7 @@ xchk_nlinks_collect_dirent( * determine the backref count. */ 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 if (!xfs_has_parent(sc->mp)) error = xchk_nlinks_update_incore(xnc, ino, 0, 1, 0); @@ -516,9 +516,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 @@ -716,7 +718,7 @@ xchk_nlinks_compare_inode( } } - 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 dotdot diff --git a/fs/xfs/scrub/nlinks_repair.c b/fs/xfs/scrub/nlinks_repair.c index fb299b23d5f1d..b2f1cec7d5778 100644 --- a/fs/xfs/scrub/nlinks_repair.c +++ b/fs/xfs/scrub/nlinks_repair.c @@ -64,7 +64,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; }