1 /* 2 * Copyright (c) 2000-2006 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #include "xfs.h" 19 #include "xfs_fs.h" 20 #include "xfs_shared.h" 21 #include "xfs_format.h" 22 #include "xfs_log_format.h" 23 #include "xfs_trans_resv.h" 24 #include "xfs_mount.h" 25 #include "xfs_defer.h" 26 #include "xfs_inode.h" 27 #include "xfs_errortag.h" 28 #include "xfs_error.h" 29 #include "xfs_cksum.h" 30 #include "xfs_icache.h" 31 #include "xfs_trans.h" 32 #include "xfs_ialloc.h" 33 #include "xfs_dir2.h" 34 35 #include <linux/iversion.h> 36 37 /* 38 * Check that none of the inode's in the buffer have a next 39 * unlinked field of 0. 40 */ 41 #if defined(DEBUG) 42 void 43 xfs_inobp_check( 44 xfs_mount_t *mp, 45 xfs_buf_t *bp) 46 { 47 int i; 48 int j; 49 xfs_dinode_t *dip; 50 51 j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; 52 53 for (i = 0; i < j; i++) { 54 dip = xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize); 55 if (!dip->di_next_unlinked) { 56 xfs_alert(mp, 57 "Detected bogus zero next_unlinked field in inode %d buffer 0x%llx.", 58 i, (long long)bp->b_bn); 59 } 60 } 61 } 62 #endif 63 64 bool 65 xfs_dinode_good_version( 66 struct xfs_mount *mp, 67 __u8 version) 68 { 69 if (xfs_sb_version_hascrc(&mp->m_sb)) 70 return version == 3; 71 72 return version == 1 || version == 2; 73 } 74 75 /* 76 * If we are doing readahead on an inode buffer, we might be in log recovery 77 * reading an inode allocation buffer that hasn't yet been replayed, and hence 78 * has not had the inode cores stamped into it. Hence for readahead, the buffer 79 * may be potentially invalid. 80 * 81 * If the readahead buffer is invalid, we need to mark it with an error and 82 * clear the DONE status of the buffer so that a followup read will re-read it 83 * from disk. We don't report the error otherwise to avoid warnings during log 84 * recovery and we don't get unnecssary panics on debug kernels. We use EIO here 85 * because all we want to do is say readahead failed; there is no-one to report 86 * the error to, so this will distinguish it from a non-ra verifier failure. 87 * Changes to this readahead error behavour also need to be reflected in 88 * xfs_dquot_buf_readahead_verify(). 89 */ 90 static void 91 xfs_inode_buf_verify( 92 struct xfs_buf *bp, 93 bool readahead) 94 { 95 struct xfs_mount *mp = bp->b_target->bt_mount; 96 xfs_agnumber_t agno; 97 int i; 98 int ni; 99 100 /* 101 * Validate the magic number and version of every inode in the buffer 102 */ 103 agno = xfs_daddr_to_agno(mp, XFS_BUF_ADDR(bp)); 104 ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; 105 for (i = 0; i < ni; i++) { 106 int di_ok; 107 xfs_dinode_t *dip; 108 xfs_agino_t unlinked_ino; 109 110 dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); 111 unlinked_ino = be32_to_cpu(dip->di_next_unlinked); 112 di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) && 113 xfs_dinode_good_version(mp, dip->di_version) && 114 (unlinked_ino == NULLAGINO || 115 xfs_verify_agino(mp, agno, unlinked_ino)); 116 if (unlikely(XFS_TEST_ERROR(!di_ok, mp, 117 XFS_ERRTAG_ITOBP_INOTOBP))) { 118 if (readahead) { 119 bp->b_flags &= ~XBF_DONE; 120 xfs_buf_ioerror(bp, -EIO); 121 return; 122 } 123 124 #ifdef DEBUG 125 xfs_alert(mp, 126 "bad inode magic/vsn daddr %lld #%d (magic=%x)", 127 (unsigned long long)bp->b_bn, i, 128 be16_to_cpu(dip->di_magic)); 129 #endif 130 xfs_buf_verifier_error(bp, -EFSCORRUPTED, 131 __func__, dip, sizeof(*dip), 132 NULL); 133 return; 134 } 135 } 136 } 137 138 139 static void 140 xfs_inode_buf_read_verify( 141 struct xfs_buf *bp) 142 { 143 xfs_inode_buf_verify(bp, false); 144 } 145 146 static void 147 xfs_inode_buf_readahead_verify( 148 struct xfs_buf *bp) 149 { 150 xfs_inode_buf_verify(bp, true); 151 } 152 153 static void 154 xfs_inode_buf_write_verify( 155 struct xfs_buf *bp) 156 { 157 xfs_inode_buf_verify(bp, false); 158 } 159 160 const struct xfs_buf_ops xfs_inode_buf_ops = { 161 .name = "xfs_inode", 162 .verify_read = xfs_inode_buf_read_verify, 163 .verify_write = xfs_inode_buf_write_verify, 164 }; 165 166 const struct xfs_buf_ops xfs_inode_buf_ra_ops = { 167 .name = "xxfs_inode_ra", 168 .verify_read = xfs_inode_buf_readahead_verify, 169 .verify_write = xfs_inode_buf_write_verify, 170 }; 171 172 173 /* 174 * This routine is called to map an inode to the buffer containing the on-disk 175 * version of the inode. It returns a pointer to the buffer containing the 176 * on-disk inode in the bpp parameter, and in the dipp parameter it returns a 177 * pointer to the on-disk inode within that buffer. 178 * 179 * If a non-zero error is returned, then the contents of bpp and dipp are 180 * undefined. 181 */ 182 int 183 xfs_imap_to_bp( 184 struct xfs_mount *mp, 185 struct xfs_trans *tp, 186 struct xfs_imap *imap, 187 struct xfs_dinode **dipp, 188 struct xfs_buf **bpp, 189 uint buf_flags, 190 uint iget_flags) 191 { 192 struct xfs_buf *bp; 193 int error; 194 195 buf_flags |= XBF_UNMAPPED; 196 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, 197 (int)imap->im_len, buf_flags, &bp, 198 &xfs_inode_buf_ops); 199 if (error) { 200 if (error == -EAGAIN) { 201 ASSERT(buf_flags & XBF_TRYLOCK); 202 return error; 203 } 204 205 if (error == -EFSCORRUPTED && 206 (iget_flags & XFS_IGET_UNTRUSTED)) 207 return -EINVAL; 208 209 xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", 210 __func__, error); 211 return error; 212 } 213 214 *bpp = bp; 215 *dipp = xfs_buf_offset(bp, imap->im_boffset); 216 return 0; 217 } 218 219 void 220 xfs_inode_from_disk( 221 struct xfs_inode *ip, 222 struct xfs_dinode *from) 223 { 224 struct xfs_icdinode *to = &ip->i_d; 225 struct inode *inode = VFS_I(ip); 226 227 228 /* 229 * Convert v1 inodes immediately to v2 inode format as this is the 230 * minimum inode version format we support in the rest of the code. 231 */ 232 to->di_version = from->di_version; 233 if (to->di_version == 1) { 234 set_nlink(inode, be16_to_cpu(from->di_onlink)); 235 to->di_projid_lo = 0; 236 to->di_projid_hi = 0; 237 to->di_version = 2; 238 } else { 239 set_nlink(inode, be32_to_cpu(from->di_nlink)); 240 to->di_projid_lo = be16_to_cpu(from->di_projid_lo); 241 to->di_projid_hi = be16_to_cpu(from->di_projid_hi); 242 } 243 244 to->di_format = from->di_format; 245 to->di_uid = be32_to_cpu(from->di_uid); 246 to->di_gid = be32_to_cpu(from->di_gid); 247 to->di_flushiter = be16_to_cpu(from->di_flushiter); 248 249 /* 250 * Time is signed, so need to convert to signed 32 bit before 251 * storing in inode timestamp which may be 64 bit. Otherwise 252 * a time before epoch is converted to a time long after epoch 253 * on 64 bit systems. 254 */ 255 inode->i_atime.tv_sec = (int)be32_to_cpu(from->di_atime.t_sec); 256 inode->i_atime.tv_nsec = (int)be32_to_cpu(from->di_atime.t_nsec); 257 inode->i_mtime.tv_sec = (int)be32_to_cpu(from->di_mtime.t_sec); 258 inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec); 259 inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec); 260 inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec); 261 inode->i_generation = be32_to_cpu(from->di_gen); 262 inode->i_mode = be16_to_cpu(from->di_mode); 263 264 to->di_size = be64_to_cpu(from->di_size); 265 to->di_nblocks = be64_to_cpu(from->di_nblocks); 266 to->di_extsize = be32_to_cpu(from->di_extsize); 267 to->di_nextents = be32_to_cpu(from->di_nextents); 268 to->di_anextents = be16_to_cpu(from->di_anextents); 269 to->di_forkoff = from->di_forkoff; 270 to->di_aformat = from->di_aformat; 271 to->di_dmevmask = be32_to_cpu(from->di_dmevmask); 272 to->di_dmstate = be16_to_cpu(from->di_dmstate); 273 to->di_flags = be16_to_cpu(from->di_flags); 274 275 if (to->di_version == 3) { 276 inode_set_iversion_queried(inode, 277 be64_to_cpu(from->di_changecount)); 278 to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); 279 to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); 280 to->di_flags2 = be64_to_cpu(from->di_flags2); 281 to->di_cowextsize = be32_to_cpu(from->di_cowextsize); 282 } 283 } 284 285 void 286 xfs_inode_to_disk( 287 struct xfs_inode *ip, 288 struct xfs_dinode *to, 289 xfs_lsn_t lsn) 290 { 291 struct xfs_icdinode *from = &ip->i_d; 292 struct inode *inode = VFS_I(ip); 293 294 to->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); 295 to->di_onlink = 0; 296 297 to->di_version = from->di_version; 298 to->di_format = from->di_format; 299 to->di_uid = cpu_to_be32(from->di_uid); 300 to->di_gid = cpu_to_be32(from->di_gid); 301 to->di_projid_lo = cpu_to_be16(from->di_projid_lo); 302 to->di_projid_hi = cpu_to_be16(from->di_projid_hi); 303 304 memset(to->di_pad, 0, sizeof(to->di_pad)); 305 to->di_atime.t_sec = cpu_to_be32(inode->i_atime.tv_sec); 306 to->di_atime.t_nsec = cpu_to_be32(inode->i_atime.tv_nsec); 307 to->di_mtime.t_sec = cpu_to_be32(inode->i_mtime.tv_sec); 308 to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec); 309 to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec); 310 to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec); 311 to->di_nlink = cpu_to_be32(inode->i_nlink); 312 to->di_gen = cpu_to_be32(inode->i_generation); 313 to->di_mode = cpu_to_be16(inode->i_mode); 314 315 to->di_size = cpu_to_be64(from->di_size); 316 to->di_nblocks = cpu_to_be64(from->di_nblocks); 317 to->di_extsize = cpu_to_be32(from->di_extsize); 318 to->di_nextents = cpu_to_be32(from->di_nextents); 319 to->di_anextents = cpu_to_be16(from->di_anextents); 320 to->di_forkoff = from->di_forkoff; 321 to->di_aformat = from->di_aformat; 322 to->di_dmevmask = cpu_to_be32(from->di_dmevmask); 323 to->di_dmstate = cpu_to_be16(from->di_dmstate); 324 to->di_flags = cpu_to_be16(from->di_flags); 325 326 if (from->di_version == 3) { 327 to->di_changecount = cpu_to_be64(inode_peek_iversion(inode)); 328 to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); 329 to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); 330 to->di_flags2 = cpu_to_be64(from->di_flags2); 331 to->di_cowextsize = cpu_to_be32(from->di_cowextsize); 332 to->di_ino = cpu_to_be64(ip->i_ino); 333 to->di_lsn = cpu_to_be64(lsn); 334 memset(to->di_pad2, 0, sizeof(to->di_pad2)); 335 uuid_copy(&to->di_uuid, &ip->i_mount->m_sb.sb_meta_uuid); 336 to->di_flushiter = 0; 337 } else { 338 to->di_flushiter = cpu_to_be16(from->di_flushiter); 339 } 340 } 341 342 void 343 xfs_log_dinode_to_disk( 344 struct xfs_log_dinode *from, 345 struct xfs_dinode *to) 346 { 347 to->di_magic = cpu_to_be16(from->di_magic); 348 to->di_mode = cpu_to_be16(from->di_mode); 349 to->di_version = from->di_version; 350 to->di_format = from->di_format; 351 to->di_onlink = 0; 352 to->di_uid = cpu_to_be32(from->di_uid); 353 to->di_gid = cpu_to_be32(from->di_gid); 354 to->di_nlink = cpu_to_be32(from->di_nlink); 355 to->di_projid_lo = cpu_to_be16(from->di_projid_lo); 356 to->di_projid_hi = cpu_to_be16(from->di_projid_hi); 357 memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); 358 359 to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); 360 to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); 361 to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); 362 to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec); 363 to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec); 364 to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec); 365 366 to->di_size = cpu_to_be64(from->di_size); 367 to->di_nblocks = cpu_to_be64(from->di_nblocks); 368 to->di_extsize = cpu_to_be32(from->di_extsize); 369 to->di_nextents = cpu_to_be32(from->di_nextents); 370 to->di_anextents = cpu_to_be16(from->di_anextents); 371 to->di_forkoff = from->di_forkoff; 372 to->di_aformat = from->di_aformat; 373 to->di_dmevmask = cpu_to_be32(from->di_dmevmask); 374 to->di_dmstate = cpu_to_be16(from->di_dmstate); 375 to->di_flags = cpu_to_be16(from->di_flags); 376 to->di_gen = cpu_to_be32(from->di_gen); 377 378 if (from->di_version == 3) { 379 to->di_changecount = cpu_to_be64(from->di_changecount); 380 to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); 381 to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); 382 to->di_flags2 = cpu_to_be64(from->di_flags2); 383 to->di_cowextsize = cpu_to_be32(from->di_cowextsize); 384 to->di_ino = cpu_to_be64(from->di_ino); 385 to->di_lsn = cpu_to_be64(from->di_lsn); 386 memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); 387 uuid_copy(&to->di_uuid, &from->di_uuid); 388 to->di_flushiter = 0; 389 } else { 390 to->di_flushiter = cpu_to_be16(from->di_flushiter); 391 } 392 } 393 394 xfs_failaddr_t 395 xfs_dinode_verify( 396 struct xfs_mount *mp, 397 xfs_ino_t ino, 398 struct xfs_dinode *dip) 399 { 400 uint16_t mode; 401 uint16_t flags; 402 uint64_t flags2; 403 uint64_t di_size; 404 405 if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) 406 return __this_address; 407 408 /* Verify v3 integrity information first */ 409 if (dip->di_version >= 3) { 410 if (!xfs_sb_version_hascrc(&mp->m_sb)) 411 return __this_address; 412 if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, 413 XFS_DINODE_CRC_OFF)) 414 return __this_address; 415 if (be64_to_cpu(dip->di_ino) != ino) 416 return __this_address; 417 if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_meta_uuid)) 418 return __this_address; 419 } 420 421 /* don't allow invalid i_size */ 422 di_size = be64_to_cpu(dip->di_size); 423 if (di_size & (1ULL << 63)) 424 return __this_address; 425 426 mode = be16_to_cpu(dip->di_mode); 427 if (mode && xfs_mode_to_ftype(mode) == XFS_DIR3_FT_UNKNOWN) 428 return __this_address; 429 430 /* No zero-length symlinks/dirs. */ 431 if ((S_ISLNK(mode) || S_ISDIR(mode)) && di_size == 0) 432 return __this_address; 433 434 /* Fork checks carried over from xfs_iformat_fork */ 435 if (mode && 436 be32_to_cpu(dip->di_nextents) + be16_to_cpu(dip->di_anextents) > 437 be64_to_cpu(dip->di_nblocks)) 438 return __this_address; 439 440 if (mode && XFS_DFORK_BOFF(dip) > mp->m_sb.sb_inodesize) 441 return __this_address; 442 443 flags = be16_to_cpu(dip->di_flags); 444 445 if (mode && (flags & XFS_DIFLAG_REALTIME) && !mp->m_rtdev_targp) 446 return __this_address; 447 448 /* Do we have appropriate data fork formats for the mode? */ 449 switch (mode & S_IFMT) { 450 case S_IFIFO: 451 case S_IFCHR: 452 case S_IFBLK: 453 case S_IFSOCK: 454 if (dip->di_format != XFS_DINODE_FMT_DEV) 455 return __this_address; 456 break; 457 case S_IFREG: 458 case S_IFLNK: 459 case S_IFDIR: 460 switch (dip->di_format) { 461 case XFS_DINODE_FMT_LOCAL: 462 /* 463 * no local regular files yet 464 */ 465 if (S_ISREG(mode)) 466 return __this_address; 467 if (di_size > XFS_DFORK_DSIZE(dip, mp)) 468 return __this_address; 469 /* fall through */ 470 case XFS_DINODE_FMT_EXTENTS: 471 case XFS_DINODE_FMT_BTREE: 472 break; 473 default: 474 return __this_address; 475 } 476 break; 477 case 0: 478 /* Uninitialized inode ok. */ 479 break; 480 default: 481 return __this_address; 482 } 483 484 if (XFS_DFORK_Q(dip)) { 485 switch (dip->di_aformat) { 486 case XFS_DINODE_FMT_LOCAL: 487 case XFS_DINODE_FMT_EXTENTS: 488 case XFS_DINODE_FMT_BTREE: 489 break; 490 default: 491 return __this_address; 492 } 493 } 494 495 /* only version 3 or greater inodes are extensively verified here */ 496 if (dip->di_version < 3) 497 return NULL; 498 499 flags2 = be64_to_cpu(dip->di_flags2); 500 501 /* don't allow reflink/cowextsize if we don't have reflink */ 502 if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) && 503 !xfs_sb_version_hasreflink(&mp->m_sb)) 504 return __this_address; 505 506 /* only regular files get reflink */ 507 if ((flags2 & XFS_DIFLAG2_REFLINK) && (mode & S_IFMT) != S_IFREG) 508 return __this_address; 509 510 /* don't let reflink and realtime mix */ 511 if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME)) 512 return __this_address; 513 514 /* don't let reflink and dax mix */ 515 if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags2 & XFS_DIFLAG2_DAX)) 516 return __this_address; 517 518 return NULL; 519 } 520 521 void 522 xfs_dinode_calc_crc( 523 struct xfs_mount *mp, 524 struct xfs_dinode *dip) 525 { 526 uint32_t crc; 527 528 if (dip->di_version < 3) 529 return; 530 531 ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); 532 crc = xfs_start_cksum_update((char *)dip, mp->m_sb.sb_inodesize, 533 XFS_DINODE_CRC_OFF); 534 dip->di_crc = xfs_end_cksum(crc); 535 } 536 537 /* 538 * Read the disk inode attributes into the in-core inode structure. 539 * 540 * For version 5 superblocks, if we are initialising a new inode and we are not 541 * utilising the XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new 542 * inode core with a random generation number. If we are keeping inodes around, 543 * we need to read the inode cluster to get the existing generation number off 544 * disk. Further, if we are using version 4 superblocks (i.e. v1/v2 inode 545 * format) then log recovery is dependent on the di_flushiter field being 546 * initialised from the current on-disk value and hence we must also read the 547 * inode off disk. 548 */ 549 int 550 xfs_iread( 551 xfs_mount_t *mp, 552 xfs_trans_t *tp, 553 xfs_inode_t *ip, 554 uint iget_flags) 555 { 556 xfs_buf_t *bp; 557 xfs_dinode_t *dip; 558 xfs_failaddr_t fa; 559 int error; 560 561 /* 562 * Fill in the location information in the in-core inode. 563 */ 564 error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); 565 if (error) 566 return error; 567 568 /* shortcut IO on inode allocation if possible */ 569 if ((iget_flags & XFS_IGET_CREATE) && 570 xfs_sb_version_hascrc(&mp->m_sb) && 571 !(mp->m_flags & XFS_MOUNT_IKEEP)) { 572 /* initialise the on-disk inode core */ 573 memset(&ip->i_d, 0, sizeof(ip->i_d)); 574 VFS_I(ip)->i_generation = prandom_u32(); 575 ip->i_d.di_version = 3; 576 return 0; 577 } 578 579 /* 580 * Get pointers to the on-disk inode and the buffer containing it. 581 */ 582 error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags); 583 if (error) 584 return error; 585 586 /* even unallocated inodes are verified */ 587 fa = xfs_dinode_verify(mp, ip->i_ino, dip); 588 if (fa) { 589 xfs_inode_verifier_error(ip, -EFSCORRUPTED, "dinode", dip, 590 sizeof(*dip), fa); 591 error = -EFSCORRUPTED; 592 goto out_brelse; 593 } 594 595 /* 596 * If the on-disk inode is already linked to a directory 597 * entry, copy all of the inode into the in-core inode. 598 * xfs_iformat_fork() handles copying in the inode format 599 * specific information. 600 * Otherwise, just get the truly permanent information. 601 */ 602 if (dip->di_mode) { 603 xfs_inode_from_disk(ip, dip); 604 error = xfs_iformat_fork(ip, dip); 605 if (error) { 606 #ifdef DEBUG 607 xfs_alert(mp, "%s: xfs_iformat() returned error %d", 608 __func__, error); 609 #endif /* DEBUG */ 610 goto out_brelse; 611 } 612 } else { 613 /* 614 * Partial initialisation of the in-core inode. Just the bits 615 * that xfs_ialloc won't overwrite or relies on being correct. 616 */ 617 ip->i_d.di_version = dip->di_version; 618 VFS_I(ip)->i_generation = be32_to_cpu(dip->di_gen); 619 ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); 620 621 /* 622 * Make sure to pull in the mode here as well in 623 * case the inode is released without being used. 624 * This ensures that xfs_inactive() will see that 625 * the inode is already free and not try to mess 626 * with the uninitialized part of it. 627 */ 628 VFS_I(ip)->i_mode = 0; 629 } 630 631 ASSERT(ip->i_d.di_version >= 2); 632 ip->i_delayed_blks = 0; 633 634 /* 635 * Mark the buffer containing the inode as something to keep 636 * around for a while. This helps to keep recently accessed 637 * meta-data in-core longer. 638 */ 639 xfs_buf_set_ref(bp, XFS_INO_REF); 640 641 /* 642 * Use xfs_trans_brelse() to release the buffer containing the on-disk 643 * inode, because it was acquired with xfs_trans_read_buf() in 644 * xfs_imap_to_bp() above. If tp is NULL, this is just a normal 645 * brelse(). If we're within a transaction, then xfs_trans_brelse() 646 * will only release the buffer if it is not dirty within the 647 * transaction. It will be OK to release the buffer in this case, 648 * because inodes on disk are never destroyed and we will be locking the 649 * new in-core inode before putting it in the cache where other 650 * processes can find it. Thus we don't have to worry about the inode 651 * being changed just because we released the buffer. 652 */ 653 out_brelse: 654 xfs_trans_brelse(tp, bp); 655 return error; 656 } 657 658 /* 659 * Validate di_extsize hint. 660 * 661 * The rules are documented at xfs_ioctl_setattr_check_extsize(). 662 * These functions must be kept in sync with each other. 663 */ 664 xfs_failaddr_t 665 xfs_inode_validate_extsize( 666 struct xfs_mount *mp, 667 uint32_t extsize, 668 uint16_t mode, 669 uint16_t flags) 670 { 671 bool rt_flag; 672 bool hint_flag; 673 bool inherit_flag; 674 uint32_t extsize_bytes; 675 uint32_t blocksize_bytes; 676 677 rt_flag = (flags & XFS_DIFLAG_REALTIME); 678 hint_flag = (flags & XFS_DIFLAG_EXTSIZE); 679 inherit_flag = (flags & XFS_DIFLAG_EXTSZINHERIT); 680 extsize_bytes = XFS_FSB_TO_B(mp, extsize); 681 682 if (rt_flag) 683 blocksize_bytes = mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog; 684 else 685 blocksize_bytes = mp->m_sb.sb_blocksize; 686 687 if ((hint_flag || inherit_flag) && !(S_ISDIR(mode) || S_ISREG(mode))) 688 return __this_address; 689 690 if (hint_flag && !S_ISREG(mode)) 691 return __this_address; 692 693 if (inherit_flag && !S_ISDIR(mode)) 694 return __this_address; 695 696 if ((hint_flag || inherit_flag) && extsize == 0) 697 return __this_address; 698 699 if (!(hint_flag || inherit_flag) && extsize != 0) 700 return __this_address; 701 702 if (extsize_bytes % blocksize_bytes) 703 return __this_address; 704 705 if (extsize > MAXEXTLEN) 706 return __this_address; 707 708 if (!rt_flag && extsize > mp->m_sb.sb_agblocks / 2) 709 return __this_address; 710 711 return NULL; 712 } 713 714 /* 715 * Validate di_cowextsize hint. 716 * 717 * The rules are documented at xfs_ioctl_setattr_check_cowextsize(). 718 * These functions must be kept in sync with each other. 719 */ 720 xfs_failaddr_t 721 xfs_inode_validate_cowextsize( 722 struct xfs_mount *mp, 723 uint32_t cowextsize, 724 uint16_t mode, 725 uint16_t flags, 726 uint64_t flags2) 727 { 728 bool rt_flag; 729 bool hint_flag; 730 uint32_t cowextsize_bytes; 731 732 rt_flag = (flags & XFS_DIFLAG_REALTIME); 733 hint_flag = (flags2 & XFS_DIFLAG2_COWEXTSIZE); 734 cowextsize_bytes = XFS_FSB_TO_B(mp, cowextsize); 735 736 if (hint_flag && !xfs_sb_version_hasreflink(&mp->m_sb)) 737 return __this_address; 738 739 if (hint_flag && !(S_ISDIR(mode) || S_ISREG(mode))) 740 return __this_address; 741 742 if (hint_flag && cowextsize == 0) 743 return __this_address; 744 745 if (!hint_flag && cowextsize != 0) 746 return __this_address; 747 748 if (hint_flag && rt_flag) 749 return __this_address; 750 751 if (cowextsize_bytes % mp->m_sb.sb_blocksize) 752 return __this_address; 753 754 if (cowextsize > MAXEXTLEN) 755 return __this_address; 756 757 if (cowextsize > mp->m_sb.sb_agblocks / 2) 758 return __this_address; 759 760 return NULL; 761 } 762