On 2024-12-19 11:44:29, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > Drop the check subcommand and all the metadata checking code from > xfs_db. We haven't shipped xfs_check in xfsprogs in a decade and the > last known user (fstests) stopped calling it back in July 2024. > > Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> LGTM Reviewed-by: Andrey Albershteyn <aalbersh@xxxxxxxxxx> > --- > db/check.c | 294 ----------------------------------------------------- > man/man8/xfs_db.8 | 12 +- > 2 files changed, 5 insertions(+), 301 deletions(-) > > > diff --git a/db/check.c b/db/check.c > index 37306bd7a6ac2d..4f7785c64f5b49 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -236,14 +236,12 @@ static void check_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, > int ignore_reflink); > static int check_inomap(xfs_agnumber_t agno, xfs_agblock_t agbno, > xfs_extlen_t len, xfs_ino_t c_ino); > -static void check_linkcounts(xfs_agnumber_t agno); > static int check_range(xfs_agnumber_t agno, xfs_agblock_t agbno, > xfs_extlen_t len); > static void check_rdbmap(xfs_rfsblock_t bno, xfs_extlen_t len, > dbm_t type); > static int check_rinomap(xfs_rfsblock_t bno, xfs_extlen_t len, > xfs_ino_t c_ino); > -static void check_rootdir(void); > static int check_rrange(xfs_rfsblock_t bno, xfs_extlen_t len); > static void check_set_dbmap(xfs_agnumber_t agno, > xfs_agblock_t agbno, xfs_extlen_t len, > @@ -252,11 +250,6 @@ static void check_set_dbmap(xfs_agnumber_t agno, > xfs_agblock_t c_agbno); > static void check_set_rdbmap(xfs_rfsblock_t bno, xfs_extlen_t len, > dbm_t type1, dbm_t type2); > -static void check_summary(void); > -static void checknot_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, > - xfs_extlen_t len, int typemask); > -static void checknot_rdbmap(xfs_rfsblock_t bno, xfs_extlen_t len, > - int typemask); > static void dir_hash_add(xfs_dahash_t hash, > xfs_dir2_dataptr_t addr); > static void dir_hash_check(inodata_t *id, int v); > @@ -323,7 +316,6 @@ static void quota_add(xfs_dqid_t *p, xfs_dqid_t *g, xfs_dqid_t *u, > static void quota_add1(qdata_t **qt, xfs_dqid_t id, int dq, > xfs_qcnt_t bc, xfs_qcnt_t ic, > xfs_qcnt_t rc); > -static void quota_check(char *s, qdata_t **qt); > static void quota_init(void); > static void scan_ag(xfs_agnumber_t agno); > static void scan_freelist(xfs_agf_t *agf); > @@ -376,7 +368,7 @@ static const cmdinfo_t blockfree_cmd = > { "blockfree", NULL, blockfree_f, 0, 0, 0, > NULL, N_("free block usage information"), NULL }; > static const cmdinfo_t blockget_cmd = > - { "blockget", "check", blockget_f, 0, -1, 0, > + { "blockget", NULL, blockget_f, 0, -1, 0, > N_("[-s|-v] [-n] [-t] [-b bno]... [-i ino] ..."), > N_("get block usage and check consistency"), NULL }; > static const cmdinfo_t blocktrash_cmd = > @@ -826,107 +818,9 @@ blockget_f( > blist = NULL; > blist_size = 0; > } > - if (serious_error) { > + if (serious_error) > exitcode = 2; > - dbprefix = oldprefix; > - return 0; > - } > > - if (xfs_has_metadir(mp)) { > - dbprefix = oldprefix; > - return 0; > - } > - > - check_rootdir(); > - /* > - * Check that there are no blocks either > - * a) unaccounted for or > - * b) bno-free but not cnt-free > - */ > - if (!tflag) { /* are we in test mode, faking out freespace? */ > - for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) > - checknot_dbmap(agno, 0, mp->m_sb.sb_agblocks, > - (1 << DBM_UNKNOWN) | (1 << DBM_FREE1)); > - } > - for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) > - check_linkcounts(agno); > - if (mp->m_sb.sb_rblocks) { > - checknot_rdbmap(0, > - (xfs_extlen_t)(mp->m_sb.sb_rextents * > - mp->m_sb.sb_rextsize), > - 1 << DBM_UNKNOWN); > - check_summary(); > - } > - if (mp->m_sb.sb_icount != icount) { > - if (!sflag) > - dbprintf(_("sb_icount %lld, counted %lld\n"), > - mp->m_sb.sb_icount, icount); > - error++; > - } > - if (mp->m_sb.sb_ifree != ifree) { > - if (!sflag) > - dbprintf(_("sb_ifree %lld, counted %lld\n"), > - mp->m_sb.sb_ifree, ifree); > - error++; > - } > - if (mp->m_sb.sb_fdblocks != fdblocks) { > - if (!sflag) > - dbprintf(_("sb_fdblocks %lld, counted %lld\n"), > - mp->m_sb.sb_fdblocks, fdblocks); > - error++; > - } > - if (lazycount && mp->m_sb.sb_fdblocks != agf_aggr_freeblks) { > - if (!sflag) > - dbprintf(_("sb_fdblocks %lld, aggregate AGF count %lld\n"), > - mp->m_sb.sb_fdblocks, agf_aggr_freeblks); > - error++; > - } > - if (mp->m_sb.sb_frextents != frextents) { > - if (!sflag) > - dbprintf(_("sb_frextents %lld, counted %lld\n"), > - mp->m_sb.sb_frextents, frextents); > - error++; > - } > - if (mp->m_sb.sb_bad_features2 != 0 && > - mp->m_sb.sb_bad_features2 != mp->m_sb.sb_features2) { > - if (!sflag) > - dbprintf(_("sb_features2 (0x%x) not same as " > - "sb_bad_features2 (0x%x)\n"), > - mp->m_sb.sb_features2, > - mp->m_sb.sb_bad_features2); > - error++; > - } > - if ((sbversion & XFS_SB_VERSION_ATTRBIT) && > - !xfs_has_attr(mp)) { > - if (!sflag) > - dbprintf(_("sb versionnum missing attr bit %x\n"), > - XFS_SB_VERSION_ATTRBIT); > - error++; > - } > - if ((sbversion & XFS_SB_VERSION_QUOTABIT) && > - !xfs_has_quota(mp)) { > - if (!sflag) > - dbprintf(_("sb versionnum missing quota bit %x\n"), > - XFS_SB_VERSION_QUOTABIT); > - error++; > - } > - if (!(sbversion & XFS_SB_VERSION_ALIGNBIT) && > - xfs_has_align(mp)) { > - if (!sflag) > - dbprintf(_("sb versionnum extra align bit %x\n"), > - XFS_SB_VERSION_ALIGNBIT); > - error++; > - } > - if (qudo) > - quota_check("user", qudata); > - if (qpdo) > - quota_check("project", qpdata); > - if (qgdo) > - quota_check("group", qgdata); > - if (sbver_err > mp->m_sb.sb_agcount / 2) > - dbprintf(_("WARNING: this may be a newer XFS filesystem.\n")); > - if (error) > - exitcode = 3; > dbprefix = oldprefix; > return 0; > } > @@ -1388,58 +1282,6 @@ check_inomap( > return rval; > } > > -static void > -check_linkcounts( > - xfs_agnumber_t agno) > -{ > - inodata_t *ep; > - inodata_t **ht; > - int idx; > - char *path; > - > - ht = inodata[agno]; > - for (idx = 0; idx < inodata_hash_size; ht++, idx++) { > - ep = *ht; > - while (ep) { > - if (ep->link_set != ep->link_add || ep->link_set == 0) { > - path = inode_name(ep->ino, NULL); > - if (!path && ep->link_add) > - path = xstrdup("?"); > - if (!sflag || ep->ilist) { > - if (ep->link_add) > - dbprintf(_("link count mismatch " > - "for inode %lld (name " > - "%s), nlink %d, " > - "counted %d\n"), > - ep->ino, path, > - ep->link_set, > - ep->link_add); > - else if (ep->link_set) > - dbprintf(_("disconnected inode " > - "%lld, nlink %d\n"), > - ep->ino, ep->link_set); > - else > - dbprintf(_("allocated inode %lld " > - "has 0 link count\n"), > - ep->ino); > - } > - if (path) > - xfree(path); > - error++; > - } else if (verbose || ep->ilist) { > - path = inode_name(ep->ino, NULL); > - if (path) { > - dbprintf(_("inode %lld name %s\n"), > - ep->ino, path); > - xfree(path); > - } > - } > - ep = ep->next; > - } > - } > - > -} > - > static int > check_range( > xfs_agnumber_t agno, > @@ -1556,25 +1398,6 @@ check_rinomap( > return rval; > } > > -static void > -check_rootdir(void) > -{ > - inodata_t *id; > - > - id = find_inode(mp->m_sb.sb_rootino, 0); > - if (id == NULL) { > - if (!sflag) > - dbprintf(_("root inode %lld is missing\n"), > - mp->m_sb.sb_rootino); > - error++; > - } else if (!id->isdir) { > - if (!sflag || id->ilist) > - dbprintf(_("root inode %lld is not a directory\n"), > - mp->m_sb.sb_rootino); > - error++; > - } > -} > - > static inline void > report_rrange( > xfs_rfsblock_t low, > @@ -1718,77 +1541,6 @@ get_suminfo( > return raw->old; > } > > -static void > -check_summary(void) > -{ > - xfs_rfsblock_t bno; > - union xfs_suminfo_raw *csp; > - union xfs_suminfo_raw *fsp; > - int log; > - > - csp = sumcompute; > - fsp = sumfile; > - for (log = 0; log < mp->m_rsumlevels; log++) { > - for (bno = 0; > - bno < mp->m_sb.sb_rbmblocks; > - bno++, csp++, fsp++) { > - if (csp->old != fsp->old) { > - if (!sflag) > - dbprintf(_("rt summary mismatch, size %d " > - "block %llu, file: %d, " > - "computed: %d\n"), > - log, bno, > - get_suminfo(mp, fsp), > - get_suminfo(mp, csp)); > - error++; > - } > - } > - } > -} > - > -static void > -checknot_dbmap( > - xfs_agnumber_t agno, > - xfs_agblock_t agbno, > - xfs_extlen_t len, > - int typemask) > -{ > - xfs_extlen_t i; > - char *p; > - > - if (!check_range(agno, agbno, len)) > - return; > - for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) { > - if ((1 << *p) & typemask) { > - if (!sflag || CHECK_BLISTA(agno, agbno + i)) > - dbprintf(_("block %u/%u type %s not expected\n"), > - agno, agbno + i, typename[(dbm_t)*p]); > - error++; > - } > - } > -} > - > -static void > -checknot_rdbmap( > - xfs_rfsblock_t bno, > - xfs_extlen_t len, > - int typemask) > -{ > - xfs_extlen_t i; > - char *p; > - > - if (!check_rrange(bno, len)) > - return; > - for (i = 0, p = &dbmap[mp->m_sb.sb_agcount][bno]; i < len; i++, p++) { > - if ((1 << *p) & typemask) { > - if (!sflag || CHECK_BLIST(bno + i)) > - dbprintf(_("rtblock %llu type %s not expected\n"), > - bno + i, typename[(dbm_t)*p]); > - error++; > - } > - } > -} > - > static void > dir_hash_add( > xfs_dahash_t hash, > @@ -3923,48 +3675,6 @@ quota_add1( > qt[qh] = qe; > } > > -static void > -quota_check( > - char *s, > - qdata_t **qt) > -{ > - int i; > - qdata_t *next; > - qdata_t *qp; > - > - for (i = 0; i < QDATA_HASH_SIZE; i++) { > - qp = qt[i]; > - while (qp) { > - next = qp->next; > - if (qp->count.bc != qp->dq.bc || > - qp->count.ic != qp->dq.ic || > - qp->count.rc != qp->dq.rc) { > - if (!sflag) { > - dbprintf(_("%s quota id %u, have/exp"), > - s, qp->id); > - if (qp->count.bc != qp->dq.bc) > - dbprintf(_(" bc %lld/%lld"), > - qp->dq.bc, > - qp->count.bc); > - if (qp->count.ic != qp->dq.ic) > - dbprintf(_(" ic %lld/%lld"), > - qp->dq.ic, > - qp->count.ic); > - if (qp->count.rc != qp->dq.rc) > - dbprintf(_(" rc %lld/%lld"), > - qp->dq.rc, > - qp->count.rc); > - dbprintf("\n"); > - } > - error++; > - } > - xfree(qp); > - qp = next; > - } > - } > - xfree(qt); > -} > - > static void > quota_init(void) > { > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > index 5d72de91dd6862..06f4464a928596 100644 > --- a/man/man8/xfs_db.8 > +++ b/man/man8/xfs_db.8 > @@ -345,7 +345,7 @@ .SH COMMANDS > command can be given, presumably with different arguments than the previous one. > .TP > .BI "blockget [\-npvs] [\-b " bno "] ... [\-i " ino "] ..." > -Get block usage and check filesystem consistency. > +Get block usage. > The information is saved for use by a subsequent > .BR blockuse ", " ncheck ", or " blocktrash > command. > @@ -564,11 +564,6 @@ .SH COMMANDS > half full. > .RE > .TP > -.B check > -See the > -.B blockget > -command. > -.TP > .BI "convert " "type number" " [" "type number" "] ... " type > Convert from one address form to another. > The known > @@ -2665,8 +2660,7 @@ .SH TYPES > and printable ASCII chars. > .SH DIAGNOSTICS > Many messages can come from the > -.B check > -.RB ( blockget ) > +.B blockget > command. > If the filesystem is completely corrupt, a core dump might > be produced instead of the message > @@ -2676,7 +2670,7 @@ .SH DIAGNOSTICS > .RE > .PP > If the filesystem is very large (has many files) then > -.B check > +.B blockget > might run out of memory. In this case the message > .RS > .B out of memory >