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()
389 if (xfs_need_iread_extents(&ip->i_df)) in xchk_nlinks_ilock_dir()
396 if (xfs_has_parent(ip->i_mount) && xfs_inode_has_attr_fork(ip) && in xchk_nlinks_ilock_dir()
397 xfs_need_iread_extents(&ip->i_af)) in xchk_nlinks_ilock_dir()
415 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_collect_dir()
434 if (VFS_I(dp)->i_nlink == 0) in xchk_nlinks_collect_dir()
442 error = -EBUSY; in xchk_nlinks_collect_dir()
447 if (error == -ECANCELED) { in xchk_nlinks_collect_dir()
455 if (xfs_has_parent(sc->mp)) { in xchk_nlinks_collect_dir()
462 error = -EBUSY; in xchk_nlinks_collect_dir()
468 if (error == -ECANCELED) { in xchk_nlinks_collect_dir()
476 xchk_iscan_mark_visited(&xnc->collect_iscan, dp); in xchk_nlinks_collect_dir()
481 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_dir()
493 if (!xfs_verify_ino(xnc->sc->mp, ino)) in xchk_nlinks_collect_metafile()
496 trace_xchk_nlinks_collect_metafile(xnc->sc->mp, ino); in xchk_nlinks_collect_metafile()
505 struct xfs_mount *mp = xnc->sc->mp; in xchk_nlinks_collect_metafiles()
506 int error = -ECANCELED; in xchk_nlinks_collect_metafiles()
509 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks_collect_metafiles()
512 mutex_lock(&xnc->lock); in xchk_nlinks_collect_metafiles()
513 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_rbmino); in xchk_nlinks_collect_metafiles()
517 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_rsumino); in xchk_nlinks_collect_metafiles()
521 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_uquotino); in xchk_nlinks_collect_metafiles()
525 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_gquotino); in xchk_nlinks_collect_metafiles()
529 error = xchk_nlinks_collect_metafile(xnc, mp->m_sb.sb_pquotino); in xchk_nlinks_collect_metafiles()
532 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_metafiles()
537 mutex_unlock(&xnc->lock); in xchk_nlinks_collect_metafiles()
538 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_collect_metafiles()
540 xchk_set_incomplete(xnc->sc); in xchk_nlinks_collect_metafiles()
544 /* Advance the collection scan cursor for this non-directory file. */
551 xchk_iscan_mark_visited(&xnc->collect_iscan, ip); in xchk_nlinks_collect_file()
561 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_collect()
581 * repeatedly cycling empty transactions. This can be done even though in xchk_nlinks_collect()
588 while ((error = xchk_iscan_iter(&xnc->collect_iscan, &ip)) == 1) { in xchk_nlinks_collect()
589 if (S_ISDIR(VFS_I(ip)->i_mode)) in xchk_nlinks_collect()
600 xchk_iscan_iter_finish(&xnc->collect_iscan); in xchk_nlinks_collect()
608 if (error == -EBUSY) in xchk_nlinks_collect()
609 return -ECANCELED; in xchk_nlinks_collect()
638 error = xfarray_load_sparse(xnc->nlinks, ino, &nl); in xchk_nlinks_comparison_read()
644 error = xfarray_store(xnc->nlinks, ino, &nl); in xchk_nlinks_comparison_read()
645 if (error == -EFBIG) { in xchk_nlinks_comparison_read()
652 xchk_set_incomplete(xnc->sc); in xchk_nlinks_comparison_read()
653 return -ECANCELED; in xchk_nlinks_comparison_read()
659 obs->parents = nl.parents; in xchk_nlinks_comparison_read()
660 obs->backrefs = nl.backrefs; in xchk_nlinks_comparison_read()
661 obs->children = nl.children; in xchk_nlinks_comparison_read()
662 obs->flags = 0; in xchk_nlinks_comparison_read()
673 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_compare_inode()
680 * they're correct for non-directories, and the directory repair code in xchk_nlinks_compare_inode()
687 mutex_lock(&xnc->lock); in xchk_nlinks_compare_inode()
689 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_compare_inode()
690 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inode()
691 error = -ECANCELED; in xchk_nlinks_compare_inode()
695 error = xchk_nlinks_comparison_read(xnc, ip->i_ino, &obs); in xchk_nlinks_compare_inode()
707 if (!xfs_has_ftype(sc->mp) && S_ISDIR(VFS_I(ip)->i_mode)) in xchk_nlinks_compare_inode()
711 actual_nlink = VFS_I(ip)->i_nlink; in xchk_nlinks_compare_inode()
713 trace_xchk_nlinks_compare_inode(sc->mp, ip, &obs); in xchk_nlinks_compare_inode()
721 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
724 xchk_ino_set_warning(sc, ip->i_ino); in xchk_nlinks_compare_inode()
729 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
733 if (S_ISDIR(VFS_I(ip)->i_mode) && actual_nlink > 0) { in xchk_nlinks_compare_inode()
743 xchk_ino_xref_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
746 * Non-directories and unlinked directories should not have in xchk_nlinks_compare_inode()
750 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
755 * Non-directories and unlinked directories should not have in xchk_nlinks_compare_inode()
759 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
772 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
781 xchk_ino_set_corrupt(sc, ip->i_ino); in xchk_nlinks_compare_inode()
787 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare_inode()
788 error = -ECANCELED; in xchk_nlinks_compare_inode()
790 mutex_unlock(&xnc->lock); in xchk_nlinks_compare_inode()
806 struct xfs_mount *mp = xnc->sc->mp; in xchk_nlinks_compare_inum()
807 struct xfs_trans *tp = xnc->sc->tp; in xchk_nlinks_compare_inum()
819 error = xchk_iget_agi(xnc->sc, ino, &agi_bp, &ip); in xchk_nlinks_compare_inum()
823 xchk_irele(xnc->sc, ip); in xchk_nlinks_compare_inum()
826 if (error == -ENOENT || error == -EINVAL) { in xchk_nlinks_compare_inum()
836 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inum()
837 return -ECANCELED; in xchk_nlinks_compare_inum()
840 if (xchk_iscan_aborted(&xnc->collect_iscan)) { in xchk_nlinks_compare_inum()
841 xchk_set_incomplete(xnc->sc); in xchk_nlinks_compare_inum()
842 error = -ECANCELED; in xchk_nlinks_compare_inum()
846 mutex_lock(&xnc->lock); in xchk_nlinks_compare_inum()
858 xchk_ino_set_corrupt(xnc->sc, ino); in xchk_nlinks_compare_inum()
859 error = -ECANCELED; in xchk_nlinks_compare_inum()
863 mutex_unlock(&xnc->lock); in xchk_nlinks_compare_inum()
883 error = xchk_iscan_iter(&xnc->compare_iscan, ipp); in xchk_nlinks_compare_iter()
884 } while (error == -EBUSY); in xchk_nlinks_compare_iter()
895 struct xfs_scrub *sc = xnc->sc; in xchk_nlinks_compare()
900 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare()
916 xchk_iscan_start(sc, 0, 0, &xnc->compare_iscan); in xchk_nlinks_compare()
919 xchk_iscan_mark_visited(&xnc->compare_iscan, ip); in xchk_nlinks_compare()
927 xchk_iscan_iter_finish(&xnc->compare_iscan); in xchk_nlinks_compare()
928 xchk_iscan_teardown(&xnc->compare_iscan); in xchk_nlinks_compare()
932 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_nlinks_compare()
936 * Walk all the non-null nlink observations that weren't checked in the in xchk_nlinks_compare()
939 mutex_lock(&xnc->lock); in xchk_nlinks_compare()
940 while ((error = xfarray_iter(xnc->nlinks, &cur, &nl)) == 1) { in xchk_nlinks_compare()
941 xfs_ino_t ino = cur - 1; in xchk_nlinks_compare()
946 mutex_unlock(&xnc->lock); in xchk_nlinks_compare()
952 if (xchk_should_terminate(xnc->sc, &error)) in xchk_nlinks_compare()
955 mutex_lock(&xnc->lock); in xchk_nlinks_compare()
957 mutex_unlock(&xnc->lock); in xchk_nlinks_compare()
970 xchk_iscan_abort(&xnc->collect_iscan); in xchk_nlinks_teardown_scan()
972 xfs_dir_hook_del(xnc->sc->mp, &xnc->dhook); in xchk_nlinks_teardown_scan()
974 xfarray_destroy(xnc->nlinks); in xchk_nlinks_teardown_scan()
975 xnc->nlinks = NULL; in xchk_nlinks_teardown_scan()
977 xchk_iscan_teardown(&xnc->collect_iscan); in xchk_nlinks_teardown_scan()
978 mutex_destroy(&xnc->lock); in xchk_nlinks_teardown_scan()
979 xnc->sc = NULL; in xchk_nlinks_teardown_scan()
992 struct xfs_mount *mp = sc->mp; in xchk_nlinks_setup_scan()
995 xfs_agnumber_t last_agno = mp->m_sb.sb_agcount - 1; in xchk_nlinks_setup_scan()
999 mutex_init(&xnc->lock); in xchk_nlinks_setup_scan()
1002 xchk_iscan_start(sc, 30000, 100, &xnc->collect_iscan); in xchk_nlinks_setup_scan()
1012 sizeof(struct xchk_nlink), &xnc->nlinks); in xchk_nlinks_setup_scan()
1021 * which means that any in-progress inode updates will finish before we in xchk_nlinks_setup_scan()
1024 ASSERT(sc->flags & XCHK_FSGATES_DIRENTS); in xchk_nlinks_setup_scan()
1025 xfs_dir_hook_setup(&xnc->dhook, xchk_nlinks_live_update); in xchk_nlinks_setup_scan()
1026 error = xfs_dir_hook_add(mp, &xnc->dhook); in xchk_nlinks_setup_scan()
1031 sc->buf_cleanup = xchk_nlinks_teardown_scan; in xchk_nlinks_setup_scan()
1044 struct xchk_nlink_ctrs *xnc = sc->buf; in xchk_nlinks()
1058 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks()
1060 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_INCOMPLETE) in xchk_nlinks()
1069 if (xchk_iscan_aborted(&xnc->collect_iscan)) in xchk_nlinks()