Lines Matching +full:mode +full:- +full:flag
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2017-2023 Oracle. All Rights Reserved.
51 /* Install this scrub-by-handle inode and prepare it for scrubbing. */
64 * Don't allow scrubbing by handle of any non-directory inode records in xchk_install_handle_iscrub()
69 * Scrubbers of inode-rooted metadata files (e.g. quota files) will in xchk_install_handle_iscrub()
73 if (xfs_is_metadir_inode(ip) && !S_ISDIR(VFS_I(ip)->i_mode)) { in xchk_install_handle_iscrub()
75 sc->ip = NULL; in xchk_install_handle_iscrub()
76 return -ENOENT; in xchk_install_handle_iscrub()
94 struct xfs_mount *mp = sc->mp; in xchk_setup_inode()
95 struct xfs_inode *ip_in = XFS_I(file_inode(sc->file)); in xchk_setup_inode()
98 xfs_agnumber_t agno = XFS_INO_TO_AGNO(mp, sc->sm->sm_ino); in xchk_setup_inode()
105 if (sc->sm->sm_ino == 0 || sc->sm->sm_ino == ip_in->i_ino) { in xchk_setup_inode()
114 * On pre-metadir filesystems, reject internal metadata files. For in xchk_setup_inode()
117 * validate the lack of parent pointers in the sb-root metadata inodes. in xchk_setup_inode()
119 if (!xfs_has_metadir(mp) && xfs_is_sb_inum(mp, sc->sm->sm_ino)) in xchk_setup_inode()
120 return -ENOENT; in xchk_setup_inode()
122 if (!xfs_verify_ino(sc->mp, sc->sm->sm_ino)) in xchk_setup_inode()
123 return -ENOENT; in xchk_setup_inode()
126 error = xchk_iget_safe(sc, sc->sm->sm_ino, &ip); in xchk_setup_inode()
129 if (error == -ENOENT) in xchk_setup_inode()
131 if (error != -EFSCORRUPTED && error != -EFSBADCRC && error != -EINVAL) in xchk_setup_inode()
148 * should flag the corruption and exit to userspace to let it fix the in xchk_setup_inode()
160 error = xchk_iget_agi(sc, sc->sm->sm_ino, &agi_bp, &ip); in xchk_setup_inode()
166 if (error == -ENOENT) in xchk_setup_inode()
168 if (error != -EFSCORRUPTED && error != -EFSBADCRC && error != -EINVAL) in xchk_setup_inode()
174 error = -ECANCELED; in xchk_setup_inode()
189 pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, sc->sm->sm_ino)); in xchk_setup_inode()
191 error = -EFSCORRUPTED; in xchk_setup_inode()
195 error = xfs_imap(pag, sc->tp, sc->sm->sm_ino, &imap, in xchk_setup_inode()
198 if (error == -EINVAL || error == -ENOENT) in xchk_setup_inode()
209 * the inode until we can flag the corruption in xchk_inode. The in xchk_setup_inode()
221 trace_xchk_op_error(sc, agno, XFS_INO_TO_AGBNO(mp, sc->sm->sm_ino), in xchk_setup_inode()
227 return -ENOENT; in xchk_setup_inode()
238 uint16_t mode, in xchk_inode_extsize() argument
242 uint32_t value = be32_to_cpu(dip->di_extsize); in xchk_inode_extsize()
244 fa = xfs_inode_validate_extsize(sc->mp, value, mode, flags); in xchk_inode_extsize()
254 * device. Flag this as an administrative warning since we will clean in xchk_inode_extsize()
259 xfs_extlen_to_rtxmod(sc->mp, value) > 0) in xchk_inode_extsize()
269 uint16_t mode, in xchk_inode_cowextsize() argument
274 uint32_t value = be32_to_cpu(dip->di_cowextsize); in xchk_inode_cowextsize()
279 if (xfs_has_zoned(sc->mp) && in xchk_inode_cowextsize()
280 dip->di_metatype == cpu_to_be16(XFS_METAFILE_RTRMAP)) in xchk_inode_cowextsize()
283 fa = xfs_inode_validate_cowextsize(sc->mp, value, mode, flags, flags2); in xchk_inode_cowextsize()
293 * Flag this as an administrative warning since we will clean this up in xchk_inode_cowextsize()
298 value % sc->mp->m_sb.sb_rextsize > 0) in xchk_inode_cowextsize()
308 uint16_t mode, in xchk_inode_flags() argument
311 struct xfs_mount *mp = sc->mp; in xchk_inode_flags()
318 if ((flags & XFS_DIFLAG_REALTIME) && !mp->m_rtdev_targp) in xchk_inode_flags()
321 /* new rt bitmap flag only valid for rbmino */ in xchk_inode_flags()
322 if ((flags & XFS_DIFLAG_NEWRTBM) && ino != mp->m_sb.sb_rbmino) in xchk_inode_flags()
325 /* directory-only flags */ in xchk_inode_flags()
330 !S_ISDIR(mode)) in xchk_inode_flags()
333 /* file-only flags */ in xchk_inode_flags()
335 !S_ISREG(mode)) in xchk_inode_flags()
353 uint16_t mode, in xchk_inode_flags2() argument
357 struct xfs_mount *mp = sc->mp; in xchk_inode_flags2()
363 /* reflink flag requires reflink feature */ in xchk_inode_flags2()
368 /* cowextsize flag is checked w.r.t. mode separately */ in xchk_inode_flags2()
370 /* file/dir-only flags */ in xchk_inode_flags2()
371 if ((flags2 & XFS_DIFLAG2_DAX) && !(S_ISREG(mode) || S_ISDIR(mode))) in xchk_inode_flags2()
374 /* file-only flags */ in xchk_inode_flags2()
375 if ((flags2 & XFS_DIFLAG2_REFLINK) && !S_ISREG(mode)) in xchk_inode_flags2()
417 struct xfs_mount *mp = sc->mp; in xchk_dinode()
425 uint16_t mode; in xchk_dinode() local
427 flags = be16_to_cpu(dip->di_flags); in xchk_dinode()
428 if (dip->di_version >= 3) in xchk_dinode()
429 flags2 = be64_to_cpu(dip->di_flags2); in xchk_dinode()
434 mode = be16_to_cpu(dip->di_mode); in xchk_dinode()
435 switch (mode & S_IFMT) { in xchk_dinode()
443 /* mode is recognized */ in xchk_dinode()
451 switch (dip->di_version) { in xchk_dinode()
463 if (be16_to_cpu(dip->di_metatype) >= XFS_METAFILE_MAX) in xchk_dinode()
466 if (dip->di_metatype != 0) in xchk_dinode()
470 if (dip->di_mode == 0 && sc->ip) in xchk_dinode()
473 if (dip->di_projid_hi != 0 && in xchk_dinode()
477 prid = be16_to_cpu(dip->di_projid_lo); in xchk_dinode()
485 prid |= (prid_t)be16_to_cpu(dip->di_projid_hi) << 16; in xchk_dinode()
488 * di_uid/di_gid -- -1 isn't invalid, but there's no way that in xchk_dinode()
491 if (dip->di_uid == cpu_to_be32(-1U) || in xchk_dinode()
492 dip->di_gid == cpu_to_be32(-1U)) in xchk_dinode()
496 * project id of -1 isn't supposed to be valid, but the kernel didn't in xchk_dinode()
499 if (prid == -1U) in xchk_dinode()
503 switch (dip->di_format) { in xchk_dinode()
505 if (!S_ISCHR(mode) && !S_ISBLK(mode) && in xchk_dinode()
506 !S_ISFIFO(mode) && !S_ISSOCK(mode)) in xchk_dinode()
510 if (!S_ISDIR(mode) && !S_ISLNK(mode)) in xchk_dinode()
514 if (!S_ISREG(mode) && !S_ISDIR(mode) && !S_ISLNK(mode)) in xchk_dinode()
518 if (!S_ISREG(mode) && !S_ISDIR(mode)) in xchk_dinode()
522 if (!S_ISREG(mode)) in xchk_dinode()
532 xchk_dinode_nsec(sc, ino, dip, dip->di_atime); in xchk_dinode()
533 xchk_dinode_nsec(sc, ino, dip, dip->di_mtime); in xchk_dinode()
534 xchk_dinode_nsec(sc, ino, dip, dip->di_ctime); in xchk_dinode()
538 * the VFS such as the upper bit being set and zero-length in xchk_dinode()
541 isize = be64_to_cpu(dip->di_size); in xchk_dinode()
546 if (!S_ISDIR(mode) && !S_ISREG(mode) && !S_ISLNK(mode) && isize != 0) in xchk_dinode()
550 if (S_ISDIR(mode) && (isize == 0 || isize >= XFS_DIR2_SPACE_SIZE)) in xchk_dinode()
554 if (S_ISLNK(mode) && (isize == 0 || isize >= XFS_SYMLINK_MAXLEN)) in xchk_dinode()
561 * overly large offsets, flag the inode for admin review. in xchk_dinode()
563 if (isize > mp->m_super->s_maxbytes) in xchk_dinode()
574 * best we can do without cross-referencing with the in xchk_dinode()
577 if (be64_to_cpu(dip->di_nblocks) >= in xchk_dinode()
578 mp->m_sb.sb_dblocks + mp->m_sb.sb_rblocks) in xchk_dinode()
581 if (be64_to_cpu(dip->di_nblocks) >= mp->m_sb.sb_dblocks) in xchk_dinode()
585 xchk_inode_flags(sc, dip, ino, mode, flags); in xchk_dinode()
587 xchk_inode_extsize(sc, dip, ino, mode, flags); in xchk_dinode()
594 switch (dip->di_format) { in xchk_dinode()
610 if (XFS_DFORK_BOFF(dip) >= mp->m_sb.sb_inodesize) in xchk_dinode()
612 if (naextents != 0 && dip->di_forkoff == 0) in xchk_dinode()
614 if (dip->di_forkoff == 0 && dip->di_aformat != XFS_DINODE_FMT_EXTENTS) in xchk_dinode()
618 if (dip->di_aformat != XFS_DINODE_FMT_LOCAL && in xchk_dinode()
619 dip->di_aformat != XFS_DINODE_FMT_EXTENTS && in xchk_dinode()
620 dip->di_aformat != XFS_DINODE_FMT_BTREE) in xchk_dinode()
625 switch (dip->di_aformat) { in xchk_dinode()
639 if (dip->di_version >= 3) { in xchk_dinode()
640 xchk_dinode_nsec(sc, ino, dip, dip->di_crtime); in xchk_dinode()
641 xchk_inode_flags2(sc, dip, ino, mode, flags, flags2); in xchk_dinode()
642 xchk_inode_cowextsize(sc, dip, ino, mode, flags, in xchk_dinode()
662 if (!sc->sa.fino_cur || xchk_skip_xref(sc->sm)) in xchk_inode_xref_finobt()
665 agino = XFS_INO_TO_AGINO(sc->mp, ino); in xchk_inode_xref_finobt()
671 error = xfs_inobt_lookup(sc->sa.fino_cur, agino, XFS_LOOKUP_LE, in xchk_inode_xref_finobt()
673 if (!xchk_should_check_xref(sc, &error, &sc->sa.fino_cur) || in xchk_inode_xref_finobt()
677 error = xfs_inobt_get_rec(sc->sa.fino_cur, &rec, &has_record); in xchk_inode_xref_finobt()
678 if (!xchk_should_check_xref(sc, &error, &sc->sa.fino_cur) || in xchk_inode_xref_finobt()
690 if (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino)) in xchk_inode_xref_finobt()
691 xchk_btree_xref_set_corrupt(sc, sc->sa.fino_cur, 0); in xchk_inode_xref_finobt()
705 if (xchk_skip_xref(sc->sm)) in xchk_inode_xref_bmap()
713 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); in xchk_inode_xref_bmap()
719 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); in xchk_inode_xref_bmap()
722 if (count + acount != be64_to_cpu(dip->di_nblocks)) in xchk_inode_xref_bmap()
723 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); in xchk_inode_xref_bmap()
726 /* Cross-reference with the other btrees. */
737 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_inode_xref()
740 agno = XFS_INO_TO_AGNO(sc->mp, ino); in xchk_inode_xref()
741 agbno = XFS_INO_TO_AGBNO(sc->mp, ino); in xchk_inode_xref()
743 error = xchk_ag_init_existing(sc, agno, &sc->sa); in xchk_inode_xref()
755 xchk_ag_free(sc, &sc->sa); in xchk_inode_xref()
760 * either flag an error (shared extents w/ no flag) or a preen (flag set w/o
769 struct xfs_mount *mp = sc->mp; in xchk_inode_check_reflink_iflag()
776 error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip, in xchk_inode_check_reflink_iflag()
781 if (xfs_is_reflink_inode(sc->ip) && !has_shared) in xchk_inode_check_reflink_iflag()
783 else if (!xfs_is_reflink_inode(sc->ip) && has_shared) in xchk_inode_check_reflink_iflag()
795 if (VFS_I(sc->ip)->i_nlink == 0) { in xchk_inode_check_unlinked()
796 if (!xfs_inode_on_unlinked_list(sc->ip)) in xchk_inode_check_unlinked()
797 xchk_ino_set_corrupt(sc, sc->ip->i_ino); in xchk_inode_check_unlinked()
799 if (xfs_inode_on_unlinked_list(sc->ip)) in xchk_inode_check_unlinked()
800 xchk_ino_set_corrupt(sc, sc->ip->i_ino); in xchk_inode_check_unlinked()
813 * If sc->ip is NULL, that means that the setup function called in xchk_inode()
815 * and a NULL inode, so flag the corruption error and return. in xchk_inode()
817 if (!sc->ip) { in xchk_inode()
818 xchk_ino_set_corrupt(sc, sc->sm->sm_ino); in xchk_inode()
823 xfs_inode_to_disk(sc->ip, &di, 0); in xchk_inode()
824 xchk_dinode(sc, &di, sc->ip->i_ino); in xchk_inode()
825 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) in xchk_inode()
830 * iflag. We already checked the iflag against the file mode when in xchk_inode()
833 if (S_ISREG(VFS_I(sc->ip)->i_mode)) in xchk_inode()
834 xchk_inode_check_reflink_iflag(sc, sc->ip->i_ino); in xchk_inode()
838 xchk_inode_xref(sc, sc->ip->i_ino, &di); in xchk_inode()