1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2017 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <darrick.wong@oracle.com> 5 */ 6 #include "xfs.h" 7 #include "xfs_fs.h" 8 #include "xfs_shared.h" 9 #include "xfs_format.h" 10 #include "xfs_trans_resv.h" 11 #include "xfs_mount.h" 12 #include "xfs_btree.h" 13 #include "xfs_log_format.h" 14 #include "xfs_inode.h" 15 #include "xfs_ialloc.h" 16 #include "xfs_da_format.h" 17 #include "xfs_reflink.h" 18 #include "xfs_rmap.h" 19 #include "xfs_bmap_util.h" 20 #include "scrub/scrub.h" 21 #include "scrub/common.h" 22 #include "scrub/btree.h" 23 24 /* 25 * Grab total control of the inode metadata. It doesn't matter here if 26 * the file data is still changing; exclusive access to the metadata is 27 * the goal. 28 */ 29 int 30 xchk_setup_inode( 31 struct xfs_scrub *sc, 32 struct xfs_inode *ip) 33 { 34 int error; 35 36 /* 37 * Try to get the inode. If the verifiers fail, we try again 38 * in raw mode. 39 */ 40 error = xchk_get_inode(sc, ip); 41 switch (error) { 42 case 0: 43 break; 44 case -EFSCORRUPTED: 45 case -EFSBADCRC: 46 return xchk_trans_alloc(sc, 0); 47 default: 48 return error; 49 } 50 51 /* Got the inode, lock it and we're ready to go. */ 52 sc->ilock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; 53 xfs_ilock(sc->ip, sc->ilock_flags); 54 error = xchk_trans_alloc(sc, 0); 55 if (error) 56 goto out; 57 sc->ilock_flags |= XFS_ILOCK_EXCL; 58 xfs_ilock(sc->ip, XFS_ILOCK_EXCL); 59 60 out: 61 /* scrub teardown will unlock and release the inode for us */ 62 return error; 63 } 64 65 /* Inode core */ 66 67 /* Validate di_extsize hint. */ 68 STATIC void 69 xchk_inode_extsize( 70 struct xfs_scrub *sc, 71 struct xfs_dinode *dip, 72 xfs_ino_t ino, 73 uint16_t mode, 74 uint16_t flags) 75 { 76 xfs_failaddr_t fa; 77 78 fa = xfs_inode_validate_extsize(sc->mp, be32_to_cpu(dip->di_extsize), 79 mode, flags); 80 if (fa) 81 xchk_ino_set_corrupt(sc, ino); 82 } 83 84 /* 85 * Validate di_cowextsize hint. 86 * 87 * The rules are documented at xfs_ioctl_setattr_check_cowextsize(). 88 * These functions must be kept in sync with each other. 89 */ 90 STATIC void 91 xchk_inode_cowextsize( 92 struct xfs_scrub *sc, 93 struct xfs_dinode *dip, 94 xfs_ino_t ino, 95 uint16_t mode, 96 uint16_t flags, 97 uint64_t flags2) 98 { 99 xfs_failaddr_t fa; 100 101 fa = xfs_inode_validate_cowextsize(sc->mp, 102 be32_to_cpu(dip->di_cowextsize), mode, flags, 103 flags2); 104 if (fa) 105 xchk_ino_set_corrupt(sc, ino); 106 } 107 108 /* Make sure the di_flags make sense for the inode. */ 109 STATIC void 110 xchk_inode_flags( 111 struct xfs_scrub *sc, 112 struct xfs_dinode *dip, 113 xfs_ino_t ino, 114 uint16_t mode, 115 uint16_t flags) 116 { 117 struct xfs_mount *mp = sc->mp; 118 119 /* di_flags are all taken, last bit cannot be used */ 120 if (flags & ~XFS_DIFLAG_ANY) 121 goto bad; 122 123 /* rt flags require rt device */ 124 if ((flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT)) && 125 !mp->m_rtdev_targp) 126 goto bad; 127 128 /* new rt bitmap flag only valid for rbmino */ 129 if ((flags & XFS_DIFLAG_NEWRTBM) && ino != mp->m_sb.sb_rbmino) 130 goto bad; 131 132 /* directory-only flags */ 133 if ((flags & (XFS_DIFLAG_RTINHERIT | 134 XFS_DIFLAG_EXTSZINHERIT | 135 XFS_DIFLAG_PROJINHERIT | 136 XFS_DIFLAG_NOSYMLINKS)) && 137 !S_ISDIR(mode)) 138 goto bad; 139 140 /* file-only flags */ 141 if ((flags & (XFS_DIFLAG_REALTIME | FS_XFLAG_EXTSIZE)) && 142 !S_ISREG(mode)) 143 goto bad; 144 145 /* filestreams and rt make no sense */ 146 if ((flags & XFS_DIFLAG_FILESTREAM) && (flags & XFS_DIFLAG_REALTIME)) 147 goto bad; 148 149 return; 150 bad: 151 xchk_ino_set_corrupt(sc, ino); 152 } 153 154 /* Make sure the di_flags2 make sense for the inode. */ 155 STATIC void 156 xchk_inode_flags2( 157 struct xfs_scrub *sc, 158 struct xfs_dinode *dip, 159 xfs_ino_t ino, 160 uint16_t mode, 161 uint16_t flags, 162 uint64_t flags2) 163 { 164 struct xfs_mount *mp = sc->mp; 165 166 /* Unknown di_flags2 could be from a future kernel */ 167 if (flags2 & ~XFS_DIFLAG2_ANY) 168 xchk_ino_set_warning(sc, ino); 169 170 /* reflink flag requires reflink feature */ 171 if ((flags2 & XFS_DIFLAG2_REFLINK) && 172 !xfs_sb_version_hasreflink(&mp->m_sb)) 173 goto bad; 174 175 /* cowextsize flag is checked w.r.t. mode separately */ 176 177 /* file/dir-only flags */ 178 if ((flags2 & XFS_DIFLAG2_DAX) && !(S_ISREG(mode) || S_ISDIR(mode))) 179 goto bad; 180 181 /* file-only flags */ 182 if ((flags2 & XFS_DIFLAG2_REFLINK) && !S_ISREG(mode)) 183 goto bad; 184 185 /* realtime and reflink make no sense, currently */ 186 if ((flags & XFS_DIFLAG_REALTIME) && (flags2 & XFS_DIFLAG2_REFLINK)) 187 goto bad; 188 189 /* dax and reflink make no sense, currently */ 190 if ((flags2 & XFS_DIFLAG2_DAX) && (flags2 & XFS_DIFLAG2_REFLINK)) 191 goto bad; 192 193 return; 194 bad: 195 xchk_ino_set_corrupt(sc, ino); 196 } 197 198 static inline void 199 xchk_dinode_nsec( 200 struct xfs_scrub *sc, 201 xfs_ino_t ino, 202 const xfs_timestamp_t ts) 203 { 204 struct timespec64 tv; 205 206 tv = xfs_inode_from_disk_ts(ts); 207 if (tv.tv_nsec < 0 || tv.tv_nsec >= NSEC_PER_SEC) 208 xchk_ino_set_corrupt(sc, ino); 209 } 210 211 /* Scrub all the ondisk inode fields. */ 212 STATIC void 213 xchk_dinode( 214 struct xfs_scrub *sc, 215 struct xfs_dinode *dip, 216 xfs_ino_t ino) 217 { 218 struct xfs_mount *mp = sc->mp; 219 size_t fork_recs; 220 unsigned long long isize; 221 uint64_t flags2; 222 uint32_t nextents; 223 uint16_t flags; 224 uint16_t mode; 225 226 flags = be16_to_cpu(dip->di_flags); 227 if (dip->di_version >= 3) 228 flags2 = be64_to_cpu(dip->di_flags2); 229 else 230 flags2 = 0; 231 232 /* di_mode */ 233 mode = be16_to_cpu(dip->di_mode); 234 switch (mode & S_IFMT) { 235 case S_IFLNK: 236 case S_IFREG: 237 case S_IFDIR: 238 case S_IFCHR: 239 case S_IFBLK: 240 case S_IFIFO: 241 case S_IFSOCK: 242 /* mode is recognized */ 243 break; 244 default: 245 xchk_ino_set_corrupt(sc, ino); 246 break; 247 } 248 249 /* v1/v2 fields */ 250 switch (dip->di_version) { 251 case 1: 252 /* 253 * We autoconvert v1 inodes into v2 inodes on writeout, 254 * so just mark this inode for preening. 255 */ 256 xchk_ino_set_preen(sc, ino); 257 break; 258 case 2: 259 case 3: 260 if (dip->di_onlink != 0) 261 xchk_ino_set_corrupt(sc, ino); 262 263 if (dip->di_mode == 0 && sc->ip) 264 xchk_ino_set_corrupt(sc, ino); 265 266 if (dip->di_projid_hi != 0 && 267 !xfs_sb_version_hasprojid32bit(&mp->m_sb)) 268 xchk_ino_set_corrupt(sc, ino); 269 break; 270 default: 271 xchk_ino_set_corrupt(sc, ino); 272 return; 273 } 274 275 /* 276 * di_uid/di_gid -- -1 isn't invalid, but there's no way that 277 * userspace could have created that. 278 */ 279 if (dip->di_uid == cpu_to_be32(-1U) || 280 dip->di_gid == cpu_to_be32(-1U)) 281 xchk_ino_set_warning(sc, ino); 282 283 /* di_format */ 284 switch (dip->di_format) { 285 case XFS_DINODE_FMT_DEV: 286 if (!S_ISCHR(mode) && !S_ISBLK(mode) && 287 !S_ISFIFO(mode) && !S_ISSOCK(mode)) 288 xchk_ino_set_corrupt(sc, ino); 289 break; 290 case XFS_DINODE_FMT_LOCAL: 291 if (!S_ISDIR(mode) && !S_ISLNK(mode)) 292 xchk_ino_set_corrupt(sc, ino); 293 break; 294 case XFS_DINODE_FMT_EXTENTS: 295 if (!S_ISREG(mode) && !S_ISDIR(mode) && !S_ISLNK(mode)) 296 xchk_ino_set_corrupt(sc, ino); 297 break; 298 case XFS_DINODE_FMT_BTREE: 299 if (!S_ISREG(mode) && !S_ISDIR(mode)) 300 xchk_ino_set_corrupt(sc, ino); 301 break; 302 case XFS_DINODE_FMT_UUID: 303 default: 304 xchk_ino_set_corrupt(sc, ino); 305 break; 306 } 307 308 /* di_[amc]time.nsec */ 309 xchk_dinode_nsec(sc, ino, dip->di_atime); 310 xchk_dinode_nsec(sc, ino, dip->di_mtime); 311 xchk_dinode_nsec(sc, ino, dip->di_ctime); 312 313 /* 314 * di_size. xfs_dinode_verify checks for things that screw up 315 * the VFS such as the upper bit being set and zero-length 316 * symlinks/directories, but we can do more here. 317 */ 318 isize = be64_to_cpu(dip->di_size); 319 if (isize & (1ULL << 63)) 320 xchk_ino_set_corrupt(sc, ino); 321 322 /* Devices, fifos, and sockets must have zero size */ 323 if (!S_ISDIR(mode) && !S_ISREG(mode) && !S_ISLNK(mode) && isize != 0) 324 xchk_ino_set_corrupt(sc, ino); 325 326 /* Directories can't be larger than the data section size (32G) */ 327 if (S_ISDIR(mode) && (isize == 0 || isize >= XFS_DIR2_SPACE_SIZE)) 328 xchk_ino_set_corrupt(sc, ino); 329 330 /* Symlinks can't be larger than SYMLINK_MAXLEN */ 331 if (S_ISLNK(mode) && (isize == 0 || isize >= XFS_SYMLINK_MAXLEN)) 332 xchk_ino_set_corrupt(sc, ino); 333 334 /* 335 * Warn if the running kernel can't handle the kinds of offsets 336 * needed to deal with the file size. In other words, if the 337 * pagecache can't cache all the blocks in this file due to 338 * overly large offsets, flag the inode for admin review. 339 */ 340 if (isize >= mp->m_super->s_maxbytes) 341 xchk_ino_set_warning(sc, ino); 342 343 /* di_nblocks */ 344 if (flags2 & XFS_DIFLAG2_REFLINK) { 345 ; /* nblocks can exceed dblocks */ 346 } else if (flags & XFS_DIFLAG_REALTIME) { 347 /* 348 * nblocks is the sum of data extents (in the rtdev), 349 * attr extents (in the datadev), and both forks' bmbt 350 * blocks (in the datadev). This clumsy check is the 351 * best we can do without cross-referencing with the 352 * inode forks. 353 */ 354 if (be64_to_cpu(dip->di_nblocks) >= 355 mp->m_sb.sb_dblocks + mp->m_sb.sb_rblocks) 356 xchk_ino_set_corrupt(sc, ino); 357 } else { 358 if (be64_to_cpu(dip->di_nblocks) >= mp->m_sb.sb_dblocks) 359 xchk_ino_set_corrupt(sc, ino); 360 } 361 362 xchk_inode_flags(sc, dip, ino, mode, flags); 363 364 xchk_inode_extsize(sc, dip, ino, mode, flags); 365 366 /* di_nextents */ 367 nextents = be32_to_cpu(dip->di_nextents); 368 fork_recs = XFS_DFORK_DSIZE(dip, mp) / sizeof(struct xfs_bmbt_rec); 369 switch (dip->di_format) { 370 case XFS_DINODE_FMT_EXTENTS: 371 if (nextents > fork_recs) 372 xchk_ino_set_corrupt(sc, ino); 373 break; 374 case XFS_DINODE_FMT_BTREE: 375 if (nextents <= fork_recs) 376 xchk_ino_set_corrupt(sc, ino); 377 break; 378 default: 379 if (nextents != 0) 380 xchk_ino_set_corrupt(sc, ino); 381 break; 382 } 383 384 /* di_forkoff */ 385 if (XFS_DFORK_APTR(dip) >= (char *)dip + mp->m_sb.sb_inodesize) 386 xchk_ino_set_corrupt(sc, ino); 387 if (dip->di_anextents != 0 && dip->di_forkoff == 0) 388 xchk_ino_set_corrupt(sc, ino); 389 if (dip->di_forkoff == 0 && dip->di_aformat != XFS_DINODE_FMT_EXTENTS) 390 xchk_ino_set_corrupt(sc, ino); 391 392 /* di_aformat */ 393 if (dip->di_aformat != XFS_DINODE_FMT_LOCAL && 394 dip->di_aformat != XFS_DINODE_FMT_EXTENTS && 395 dip->di_aformat != XFS_DINODE_FMT_BTREE) 396 xchk_ino_set_corrupt(sc, ino); 397 398 /* di_anextents */ 399 nextents = be16_to_cpu(dip->di_anextents); 400 fork_recs = XFS_DFORK_ASIZE(dip, mp) / sizeof(struct xfs_bmbt_rec); 401 switch (dip->di_aformat) { 402 case XFS_DINODE_FMT_EXTENTS: 403 if (nextents > fork_recs) 404 xchk_ino_set_corrupt(sc, ino); 405 break; 406 case XFS_DINODE_FMT_BTREE: 407 if (nextents <= fork_recs) 408 xchk_ino_set_corrupt(sc, ino); 409 break; 410 default: 411 if (nextents != 0) 412 xchk_ino_set_corrupt(sc, ino); 413 } 414 415 if (dip->di_version >= 3) { 416 xchk_dinode_nsec(sc, ino, dip->di_crtime); 417 xchk_inode_flags2(sc, dip, ino, mode, flags, flags2); 418 xchk_inode_cowextsize(sc, dip, ino, mode, flags, 419 flags2); 420 } 421 } 422 423 /* 424 * Make sure the finobt doesn't think this inode is free. 425 * We don't have to check the inobt ourselves because we got the inode via 426 * IGET_UNTRUSTED, which checks the inobt for us. 427 */ 428 static void 429 xchk_inode_xref_finobt( 430 struct xfs_scrub *sc, 431 xfs_ino_t ino) 432 { 433 struct xfs_inobt_rec_incore rec; 434 xfs_agino_t agino; 435 int has_record; 436 int error; 437 438 if (!sc->sa.fino_cur || xchk_skip_xref(sc->sm)) 439 return; 440 441 agino = XFS_INO_TO_AGINO(sc->mp, ino); 442 443 /* 444 * Try to get the finobt record. If we can't get it, then we're 445 * in good shape. 446 */ 447 error = xfs_inobt_lookup(sc->sa.fino_cur, agino, XFS_LOOKUP_LE, 448 &has_record); 449 if (!xchk_should_check_xref(sc, &error, &sc->sa.fino_cur) || 450 !has_record) 451 return; 452 453 error = xfs_inobt_get_rec(sc->sa.fino_cur, &rec, &has_record); 454 if (!xchk_should_check_xref(sc, &error, &sc->sa.fino_cur) || 455 !has_record) 456 return; 457 458 /* 459 * Otherwise, make sure this record either doesn't cover this inode, 460 * or that it does but it's marked present. 461 */ 462 if (rec.ir_startino > agino || 463 rec.ir_startino + XFS_INODES_PER_CHUNK <= agino) 464 return; 465 466 if (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino)) 467 xchk_btree_xref_set_corrupt(sc, sc->sa.fino_cur, 0); 468 } 469 470 /* Cross reference the inode fields with the forks. */ 471 STATIC void 472 xchk_inode_xref_bmap( 473 struct xfs_scrub *sc, 474 struct xfs_dinode *dip) 475 { 476 xfs_extnum_t nextents; 477 xfs_filblks_t count; 478 xfs_filblks_t acount; 479 int error; 480 481 if (xchk_skip_xref(sc->sm)) 482 return; 483 484 /* Walk all the extents to check nextents/naextents/nblocks. */ 485 error = xfs_bmap_count_blocks(sc->tp, sc->ip, XFS_DATA_FORK, 486 &nextents, &count); 487 if (!xchk_should_check_xref(sc, &error, NULL)) 488 return; 489 if (nextents < be32_to_cpu(dip->di_nextents)) 490 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); 491 492 error = xfs_bmap_count_blocks(sc->tp, sc->ip, XFS_ATTR_FORK, 493 &nextents, &acount); 494 if (!xchk_should_check_xref(sc, &error, NULL)) 495 return; 496 if (nextents != be16_to_cpu(dip->di_anextents)) 497 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); 498 499 /* Check nblocks against the inode. */ 500 if (count + acount != be64_to_cpu(dip->di_nblocks)) 501 xchk_ino_xref_set_corrupt(sc, sc->ip->i_ino); 502 } 503 504 /* Cross-reference with the other btrees. */ 505 STATIC void 506 xchk_inode_xref( 507 struct xfs_scrub *sc, 508 xfs_ino_t ino, 509 struct xfs_dinode *dip) 510 { 511 xfs_agnumber_t agno; 512 xfs_agblock_t agbno; 513 int error; 514 515 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) 516 return; 517 518 agno = XFS_INO_TO_AGNO(sc->mp, ino); 519 agbno = XFS_INO_TO_AGBNO(sc->mp, ino); 520 521 error = xchk_ag_init(sc, agno, &sc->sa); 522 if (!xchk_xref_process_error(sc, agno, agbno, &error)) 523 return; 524 525 xchk_xref_is_used_space(sc, agbno, 1); 526 xchk_inode_xref_finobt(sc, ino); 527 xchk_xref_is_owned_by(sc, agbno, 1, &XFS_RMAP_OINFO_INODES); 528 xchk_xref_is_not_shared(sc, agbno, 1); 529 xchk_inode_xref_bmap(sc, dip); 530 531 xchk_ag_free(sc, &sc->sa); 532 } 533 534 /* 535 * If the reflink iflag disagrees with a scan for shared data fork extents, 536 * either flag an error (shared extents w/ no flag) or a preen (flag set w/o 537 * any shared extents). We already checked for reflink iflag set on a non 538 * reflink filesystem. 539 */ 540 static void 541 xchk_inode_check_reflink_iflag( 542 struct xfs_scrub *sc, 543 xfs_ino_t ino) 544 { 545 struct xfs_mount *mp = sc->mp; 546 bool has_shared; 547 int error; 548 549 if (!xfs_sb_version_hasreflink(&mp->m_sb)) 550 return; 551 552 error = xfs_reflink_inode_has_shared_extents(sc->tp, sc->ip, 553 &has_shared); 554 if (!xchk_xref_process_error(sc, XFS_INO_TO_AGNO(mp, ino), 555 XFS_INO_TO_AGBNO(mp, ino), &error)) 556 return; 557 if (xfs_is_reflink_inode(sc->ip) && !has_shared) 558 xchk_ino_set_preen(sc, ino); 559 else if (!xfs_is_reflink_inode(sc->ip) && has_shared) 560 xchk_ino_set_corrupt(sc, ino); 561 } 562 563 /* Scrub an inode. */ 564 int 565 xchk_inode( 566 struct xfs_scrub *sc) 567 { 568 struct xfs_dinode di; 569 int error = 0; 570 571 /* 572 * If sc->ip is NULL, that means that the setup function called 573 * xfs_iget to look up the inode. xfs_iget returned a EFSCORRUPTED 574 * and a NULL inode, so flag the corruption error and return. 575 */ 576 if (!sc->ip) { 577 xchk_ino_set_corrupt(sc, sc->sm->sm_ino); 578 return 0; 579 } 580 581 /* Scrub the inode core. */ 582 xfs_inode_to_disk(sc->ip, &di, 0); 583 xchk_dinode(sc, &di, sc->ip->i_ino); 584 if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) 585 goto out; 586 587 /* 588 * Look for discrepancies between file's data blocks and the reflink 589 * iflag. We already checked the iflag against the file mode when 590 * we scrubbed the dinode. 591 */ 592 if (S_ISREG(VFS_I(sc->ip)->i_mode)) 593 xchk_inode_check_reflink_iflag(sc, sc->ip->i_ino); 594 595 xchk_inode_xref(sc, sc->ip->i_ino, &di); 596 out: 597 return error; 598 } 599