Lines Matching +full:scrubber +full:- +full:done
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2021-2024 Oracle. All Rights Reserved.
63 return -ENOMEM; in xchk_setup_nlinks()
64 xnc->xname.name = xnc->namebuf; in xchk_setup_nlinks()
65 xnc->sc = sc; in xchk_setup_nlinks()
66 sc->buf = xnc; in xchk_setup_nlinks()
92 * in the hook code must abort the iscan and the scrubber must notice the
97 * observations is inode ILOCK -> iscan_lock/xchk_nlink_ctrs lock.
128 if (!xnc->nlinks) in xchk_nlinks_update_incore()
131 error = xfarray_load_sparse(xnc->nlinks, ino, &nl); in xchk_nlinks_update_incore()
135 trace_xchk_nlinks_update_incore(xnc->sc->mp, ino, &nl, parents_delta, in xchk_nlinks_update_incore()
143 error = xfarray_store(xnc->nlinks, ino, &nl); in xchk_nlinks_update_incore()
144 if (error == -EFBIG) { in xchk_nlinks_update_incore()
150 error = -ECANCELED; in xchk_nlinks_update_incore()
175 if (xrep_is_tempfile(p->dp)) in xchk_nlinks_live_update()
178 trace_xchk_nlinks_live_update(xnc->sc->mp, p->dp, action, p->ip->i_ino, in xchk_nlinks_live_update()
179 p->delta, p->name->name, p->name->len); in xchk_nlinks_live_update()
186 if (xchk_iscan_want_live_update(&xnc->collect_iscan, p->dp->i_ino)) { in xchk_nlinks_live_update()
187 mutex_lock(&xnc->lock); in xchk_nlinks_live_update()
188 error = xchk_nlinks_update_incore(xnc, p->ip->i_ino, p->delta, in xchk_nlinks_live_update()
190 if (!error && S_ISDIR(VFS_IC(p->ip)->i_mode)) in xchk_nlinks_live_update()
191 error = xchk_nlinks_update_incore(xnc, p->dp->i_ino, 0, in xchk_nlinks_live_update()
192 0, p->delta); in xchk_nlinks_live_update()
193 mutex_unlock(&xnc->lock); in xchk_nlinks_live_update()
202 if (S_ISDIR(VFS_IC(p->ip)->i_mode) && in xchk_nlinks_live_update()
203 xchk_iscan_want_live_update(&xnc->collect_iscan, p->ip->i_ino)) { in xchk_nlinks_live_update()
204 mutex_lock(&xnc->lock); in xchk_nlinks_live_update()
205 error = xchk_nlinks_update_incore(xnc, p->dp->i_ino, 0, in xchk_nlinks_live_update()
206 p->delta, 0); in xchk_nlinks_live_update()
207 mutex_unlock(&xnc->lock); in xchk_nlinks_live_update()
215 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_live_update()
234 if (name->len == 0 || !xfs_dir2_namecheck(name->name, name->len)) { in xchk_nlinks_collect_dirent()
235 error = -ECANCELED; in xchk_nlinks_collect_dirent()
239 if (name->len == 1 && name->name[0] == '.') in xchk_nlinks_collect_dirent()
241 else if (name->len == 2 && name->name[0] == '.' && in xchk_nlinks_collect_dirent()
242 name->name[1] == '.') in xchk_nlinks_collect_dirent()
246 if (dot && ino != dp->i_ino) { in xchk_nlinks_collect_dirent()
247 error = -ECANCELED; in xchk_nlinks_collect_dirent()
252 if (!xfs_verify_dir_ino(sc->mp, ino)) { in xchk_nlinks_collect_dirent()
253 error = -ECANCELED; in xchk_nlinks_collect_dirent()
259 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_collect_dirent()
260 error = -ECANCELED; in xchk_nlinks_collect_dirent()
264 trace_xchk_nlinks_collect_dirent(sc->mp, dp, ino, name); in xchk_nlinks_collect_dirent()
266 mutex_lock(&xnc->lock); in xchk_nlinks_collect_dirent()
284 else if (!xfs_has_parent(sc->mp)) in xchk_nlinks_collect_dirent()
306 if (!dot && !dotdot && name->type == XFS_DIR3_FT_DIR) { in xchk_nlinks_collect_dirent()
307 error = xchk_nlinks_update_incore(xnc, dp->i_ino, 0, 0, 1); in xchk_nlinks_collect_dirent()
312 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_dirent()
316 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_dirent()
318 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_dirent()
347 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_collect_pptr()
348 error = -ECANCELED; in xchk_nlinks_collect_pptr()
355 error = xfs_parent_from_attr(sc->mp, attr_flags, name, namelen, value, in xchk_nlinks_collect_pptr()
360 trace_xchk_nlinks_collect_pptr(sc->mp, ip, &xname, pptr_rec); in xchk_nlinks_collect_pptr()
362 mutex_lock(&xnc->lock); in xchk_nlinks_collect_pptr()
368 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_pptr()
372 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_pptr()
373 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_pptr()
385 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_collect_dir()
405 if (VFS_I(dp)->i_nlink == 0) in xchk_nlinks_collect_dir()
413 error = -EBUSY; in xchk_nlinks_collect_dir()
418 if (error == -ECANCELED) { in xchk_nlinks_collect_dir()
426 if (xfs_has_parent(sc->mp)) { in xchk_nlinks_collect_dir()
433 error = -EBUSY; in xchk_nlinks_collect_dir()
439 if (error == -ECANCELED) { in xchk_nlinks_collect_dir()
447 xchk_iscan_mark_visited(&xnc->collect_iscan, dp); in xchk_nlinks_collect_dir()
452 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_dir()
465 if (!xfs_verify_ino(xnc->sc->mp, ino)) in xchk_nlinks_collect_metafile()
468 trace_xchk_nlinks_collect_metafile(xnc->sc->mp, ino); in xchk_nlinks_collect_metafile()
477 struct xfs_mount *mp = xnc->sc->mp; in xchk_nlinks_collect_metafiles()
478 int error = -ECANCELED; in xchk_nlinks_collect_metafiles()
481 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks_collect_metafiles()
484 mutex_lock(&xnc->lock); in xchk_nlinks_collect_metafiles()
485 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_rbmino); in xchk_nlinks_collect_metafiles()
489 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_rsumino); in xchk_nlinks_collect_metafiles()
493 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_uquotino); in xchk_nlinks_collect_metafiles()
497 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_gquotino); in xchk_nlinks_collect_metafiles()
501 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_pquotino); in xchk_nlinks_collect_metafiles()
504 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_metafiles()
509 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_metafiles()
510 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_metafiles()
512 xchk_set_incomplete(xnc->sc); in xchk_nlinks_collect_metafiles()
516 /* Advance the collection scan cursor for this non-directory file. */
523 xchk_iscan_mark_visited(&xnc->collect_iscan, ip); in xchk_nlinks_collect_file()
533 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_collect()
553 * repeatedly cycling empty transactions. This can be done even though in xchk_nlinks_collect()
562 while ((error = xchk_iscan_iter(&xnc->collect_iscan, &ip)) == 1) { in xchk_nlinks_collect()
563 if (S_ISDIR(VFS_I(ip)->i_mode)) in xchk_nlinks_collect()
574 xchk_iscan_iter_finish(&xnc->collect_iscan); in xchk_nlinks_collect()
582 if (error == -EBUSY) in xchk_nlinks_collect()
583 return -ECANCELED; in xchk_nlinks_collect()
612 error = xfarray_load_sparse(xnc->nlinks, ino, &nl); in xchk_nlinks_comparison_read()
618 error = xfarray_store(xnc->nlinks, ino, &nl); in xchk_nlinks_comparison_read()
619 if (error == -EFBIG) { in xchk_nlinks_comparison_read()
626 xchk_set_incomplete(xnc->sc); in xchk_nlinks_comparison_read()
627 return -ECANCELED; in xchk_nlinks_comparison_read()
633 obs->parents = nl.parents; in xchk_nlinks_comparison_read()
634 obs->backrefs = nl.backrefs; in xchk_nlinks_comparison_read()
635 obs->children = nl.children; in xchk_nlinks_comparison_read()
636 obs->flags = 0; in xchk_nlinks_comparison_read()
647 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_compare_inode()
654 * they're correct for non-directories, and the directory repair code in xchk_nlinks_compare_inode()
661 mutex_lock(&xnc->lock); in xchk_nlinks_compare_inode()
663 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_compare_inode()
664 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inode()
665 error = -ECANCELED; in xchk_nlinks_compare_inode()
669 error = xchk_nlinks_comparison_read(xnc, ip->i_ino, &obs); in xchk_nlinks_compare_inode()
681 if (!xfs_has_ftype(sc->mp) && S_ISDIR(VFS_I(ip)->i_mode)) in xchk_nlinks_compare_inode()
685 actual_nlink = VFS_I(ip)->i_nlink; in xchk_nlinks_compare_inode()
687 trace_xchk_nlinks_compare_inode(sc->mp, ip, &obs); in xchk_nlinks_compare_inode()
695 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
698 xchk_ino_set_warning(sc, ip->i_ino); in xchk_nlinks_compare_inode()
703 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
707 if (S_ISDIR(VFS_I(ip)->i_mode) && actual_nlink > 0) { in xchk_nlinks_compare_inode()
717 xchk_ino_xref_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
720 * Non-directories and unlinked directories should not have in xchk_nlinks_compare_inode()
724 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
729 * Non-directories and unlinked directories should not have in xchk_nlinks_compare_inode()
733 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
746 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
755 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
761 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare_inode()
762 error = -ECANCELED; in xchk_nlinks_compare_inode()
764 mutex_unlock(&xnc->lock); in xchk_nlinks_compare_inode()
780 struct xfs_mount *mp = xnc->sc->mp; in xchk_nlinks_compare_inum()
781 struct xfs_trans *tp = xnc->sc->tp; in xchk_nlinks_compare_inum()
793 error = xchk_iget_agi(xnc->sc, ino, &agi_bp, &ip); in xchk_nlinks_compare_inum()
797 xchk_irele(xnc->sc, ip); in xchk_nlinks_compare_inum()
800 if (error == -ENOENT || error == -EINVAL) { in xchk_nlinks_compare_inum()
810 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inum()
811 return -ECANCELED; in xchk_nlinks_compare_inum()
814 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_compare_inum()
815 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inum()
816 error = -ECANCELED; in xchk_nlinks_compare_inum()
820 mutex_lock(&xnc->lock); in xchk_nlinks_compare_inum()
832 xchk_ino_set_corrupt(xnc->sc, ino); in xchk_nlinks_compare_inum()
833 error = -ECANCELED; in xchk_nlinks_compare_inum()
837 mutex_unlock(&xnc->lock); in xchk_nlinks_compare_inum()
857 error = xchk_iscan_iter(&xnc->compare_iscan, ipp); in xchk_nlinks_compare_iter()
858 } while (error == -EBUSY); in xchk_nlinks_compare_iter()
869 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_compare()
874 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare()
892 xchk_iscan_start(sc, 0, 0, &xnc->compare_iscan); in xchk_nlinks_compare()
895 xchk_iscan_mark_visited(&xnc->compare_iscan, ip); in xchk_nlinks_compare()
903 xchk_iscan_iter_finish(&xnc->compare_iscan); in xchk_nlinks_compare()
904 xchk_iscan_teardown(&xnc->compare_iscan); in xchk_nlinks_compare()
908 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare()
912 * Walk all the non-null nlink observations that weren't checked in the in xchk_nlinks_compare()
915 mutex_lock(&xnc->lock); in xchk_nlinks_compare()
916 while ((error = xfarray_iter(xnc->nlinks, &cur, &nl)) == 1) { in xchk_nlinks_compare()
917 xfs_ino_t ino = cur - 1; in xchk_nlinks_compare()
922 mutex_unlock(&xnc->lock); in xchk_nlinks_compare()
928 if (xchk_should_terminate(xnc->sc, &error)) in xchk_nlinks_compare()
931 mutex_lock(&xnc->lock); in xchk_nlinks_compare()
933 mutex_unlock(&xnc->lock); in xchk_nlinks_compare()
946 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_teardown_scan()
948 xfs_dir_hook_del(xnc->sc->mp, &xnc->dhook); in xchk_nlinks_teardown_scan()
950 xfarray_destroy(xnc->nlinks); in xchk_nlinks_teardown_scan()
951 xnc->nlinks = NULL; in xchk_nlinks_teardown_scan()
953 xchk_iscan_teardown(&xnc->collect_iscan); in xchk_nlinks_teardown_scan()
954 mutex_destroy(&xnc->lock); in xchk_nlinks_teardown_scan()
955 xnc->sc = NULL; in xchk_nlinks_teardown_scan()
968 struct xfs_mount *mp = sc->mp; in xchk_nlinks_setup_scan()
971 xfs_agnumber_t last_agno = mp->m_sb.sb_agcount - 1; in xchk_nlinks_setup_scan()
975 mutex_init(&xnc->lock); in xchk_nlinks_setup_scan()
978 xchk_iscan_start(sc, 30000, 100, &xnc->collect_iscan); in xchk_nlinks_setup_scan()
988 sizeof(struct xchk_nlink), &xnc->nlinks); in xchk_nlinks_setup_scan()
997 * which means that any in-progress inode updates will finish before we in xchk_nlinks_setup_scan()
1000 ASSERT(sc->flags & XCHK_FSGATES_DIRENTS); in xchk_nlinks_setup_scan()
1001 xfs_dir_hook_setup(&xnc->dhook, xchk_nlinks_live_update); in xchk_nlinks_setup_scan()
1002 error = xfs_dir_hook_add(mp, &xnc->dhook); in xchk_nlinks_setup_scan()
1007 sc->buf_cleanup = xchk_nlinks_teardown_scan; in xchk_nlinks_setup_scan()
1020 struct xchk_nlink_ctrs *xnc = sc->buf; in xchk_nlinks()
1034 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks()
1036 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_INCOMPLETE) in xchk_nlinks()
1045 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks()