root/fs/xfs/libxfs/xfs_inode_buf.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. xfs_inobp_check
  2. xfs_dinode_good_version
  3. xfs_inode_buf_verify
  4. xfs_inode_buf_read_verify
  5. xfs_inode_buf_readahead_verify
  6. xfs_inode_buf_write_verify
  7. xfs_imap_to_bp
  8. xfs_inode_from_disk
  9. xfs_inode_to_disk
  10. xfs_log_dinode_to_disk
  11. xfs_dinode_verify_fork
  12. xfs_dinode_verify_forkoff
  13. xfs_dinode_verify
  14. xfs_dinode_calc_crc
  15. xfs_iread
  16. xfs_inode_validate_extsize
  17. xfs_inode_validate_cowextsize

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

/* [<][>][^][v][top][bottom][index][help] */