]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'xfs-buf-macro-cleanup-4.6' into for-next
authorDave Chinner <david@fromorbit.com>
Wed, 10 Feb 2016 04:03:42 +0000 (15:03 +1100)
committerDave Chinner <david@fromorbit.com>
Wed, 10 Feb 2016 04:03:42 +0000 (15:03 +1100)
1  2 
fs/xfs/xfs_inode.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_mount.c

diff --combined fs/xfs/xfs_inode.c
index 26bac4ab79a3c33d9f9345c5962bf3e9f658b68c,a7be69a7932125d1fc831ca488c0a8751cb4719b..96f606deee313aed506b7e7ee229fc801ba5de80
@@@ -57,9 -57,9 +57,9 @@@ kmem_zone_t *xfs_inode_zone
   */
  #define       XFS_ITRUNC_MAX_EXTENTS  2
  
 -STATIC int xfs_iflush_int(xfs_inode_t *, xfs_buf_t *);
 -
 -STATIC int xfs_iunlink_remove(xfs_trans_t *, xfs_inode_t *);
 +STATIC int xfs_iflush_int(struct xfs_inode *, struct xfs_buf *);
 +STATIC int xfs_iunlink(struct xfs_trans *, struct xfs_inode *);
 +STATIC int xfs_iunlink_remove(struct xfs_trans *, struct xfs_inode *);
  
  /*
   * helper function to extract extent size hint from inode
@@@ -766,7 -766,6 +766,7 @@@ xfs_ialloc
        uint            flags;
        int             error;
        struct timespec tv;
 +      struct inode    *inode;
  
        /*
         * Call the space management code to pick
        if (error)
                return error;
        ASSERT(ip != NULL);
 +      inode = VFS_I(ip);
  
        /*
         * We always convert v1 inodes to v2 now - we only support filesystems
        if (ip->i_d.di_version == 1)
                ip->i_d.di_version = 2;
  
 -      ip->i_d.di_mode = mode;
 -      ip->i_d.di_onlink = 0;
 -      ip->i_d.di_nlink = nlink;
 -      ASSERT(ip->i_d.di_nlink == nlink);
 +      inode->i_mode = mode;
 +      set_nlink(inode, nlink);
        ip->i_d.di_uid = xfs_kuid_to_uid(current_fsuid());
        ip->i_d.di_gid = xfs_kgid_to_gid(current_fsgid());
        xfs_set_projid(ip, prid);
 -      memset(&(ip->i_d.di_pad[0]), 0, sizeof(ip->i_d.di_pad));
  
        if (pip && XFS_INHERIT_GID(pip)) {
                ip->i_d.di_gid = pip->i_d.di_gid;
 -              if ((pip->i_d.di_mode & S_ISGID) && S_ISDIR(mode)) {
 -                      ip->i_d.di_mode |= S_ISGID;
 -              }
 +              if ((VFS_I(pip)->i_mode & S_ISGID) && S_ISDIR(mode))
 +                      inode->i_mode |= S_ISGID;
        }
  
        /*
         * (and only if the irix_sgid_inherit compatibility variable is set).
         */
        if ((irix_sgid_inherit) &&
 -          (ip->i_d.di_mode & S_ISGID) &&
 -          (!in_group_p(xfs_gid_to_kgid(ip->i_d.di_gid)))) {
 -              ip->i_d.di_mode &= ~S_ISGID;
 -      }
 +          (inode->i_mode & S_ISGID) &&
 +          (!in_group_p(xfs_gid_to_kgid(ip->i_d.di_gid))))
 +              inode->i_mode &= ~S_ISGID;
  
        ip->i_d.di_size = 0;
        ip->i_d.di_nextents = 0;
        ASSERT(ip->i_d.di_nblocks == 0);
  
        tv = current_fs_time(mp->m_super);
 -      ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
 -      ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
 -      ip->i_d.di_atime = ip->i_d.di_mtime;
 -      ip->i_d.di_ctime = ip->i_d.di_mtime;
 +      inode->i_mtime = tv;
 +      inode->i_atime = tv;
 +      inode->i_ctime = tv;
  
 -      /*
 -       * di_gen will have been taken care of in xfs_iread.
 -       */
        ip->i_d.di_extsize = 0;
        ip->i_d.di_dmevmask = 0;
        ip->i_d.di_dmstate = 0;
        ip->i_d.di_flags = 0;
  
        if (ip->i_d.di_version == 3) {
 -              ASSERT(ip->i_d.di_ino == ino);
 -              ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid));
 -              ip->i_d.di_crc = 0;
 -              ip->i_d.di_changecount = 1;
 -              ip->i_d.di_lsn = 0;
 +              inode->i_version = 1;
                ip->i_d.di_flags2 = 0;
 -              memset(&(ip->i_d.di_pad2[0]), 0, sizeof(ip->i_d.di_pad2));
 -              ip->i_d.di_crtime = ip->i_d.di_mtime;
 +              ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec;
 +              ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec;
        }
  
  
@@@ -1081,24 -1092,35 +1081,24 @@@ xfs_dir_ialloc
  }
  
  /*
 - * Decrement the link count on an inode & log the change.
 - * If this causes the link count to go to zero, initiate the
 - * logging activity required to truncate a file.
 + * Decrement the link count on an inode & log the change.  If this causes the
 + * link count to go to zero, move the inode to AGI unlinked list so that it can
 + * be freed when the last active reference goes away via xfs_inactive().
   */
  int                           /* error */
  xfs_droplink(
        xfs_trans_t *tp,
        xfs_inode_t *ip)
  {
 -      int     error;
 -
        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
  
 -      ASSERT (ip->i_d.di_nlink > 0);
 -      ip->i_d.di_nlink--;
        drop_nlink(VFS_I(ip));
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
  
 -      error = 0;
 -      if (ip->i_d.di_nlink == 0) {
 -              /*
 -               * We're dropping the last link to this file.
 -               * Move the on-disk inode to the AGI unlinked list.
 -               * From xfs_inactive() we will pull the inode from
 -               * the list and free it.
 -               */
 -              error = xfs_iunlink(tp, ip);
 -      }
 -      return error;
 +      if (VFS_I(ip)->i_nlink)
 +              return 0;
 +
 +      return xfs_iunlink(tp, ip);
  }
  
  /*
@@@ -1112,6 -1134,8 +1112,6 @@@ xfs_bumplink
        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_CHG);
  
        ASSERT(ip->i_d.di_version > 1);
 -      ASSERT(ip->i_d.di_nlink > 0 || (VFS_I(ip)->i_state & I_LINKABLE));
 -      ip->i_d.di_nlink++;
        inc_nlink(VFS_I(ip));
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        return 0;
@@@ -1369,6 -1393,7 +1369,6 @@@ xfs_create_tmpfile
         */
        xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
  
 -      ip->i_d.di_nlink--;
        error = xfs_iunlink(tp, ip);
        if (error)
                goto out_trans_cancel;
@@@ -1419,7 -1444,7 +1419,7 @@@ xfs_link
  
        trace_xfs_link(tdp, target_name);
  
 -      ASSERT(!S_ISDIR(sip->i_d.di_mode));
 +      ASSERT(!S_ISDIR(VFS_I(sip)->i_mode));
  
        if (XFS_FORCED_SHUTDOWN(mp))
                return -EIO;
  
        xfs_bmap_init(&free_list, &first_block);
  
 -      if (sip->i_d.di_nlink == 0) {
 +      /*
 +       * Handle initial link state of O_TMPFILE inode
 +       */
 +      if (VFS_I(sip)->i_nlink == 0) {
                error = xfs_iunlink_remove(tp, sip);
                if (error)
                        goto error_return;
@@@ -1626,7 -1648,7 +1626,7 @@@ xfs_release
        xfs_mount_t     *mp = ip->i_mount;
        int             error;
  
 -      if (!S_ISREG(ip->i_d.di_mode) || (ip->i_d.di_mode == 0))
 +      if (!S_ISREG(VFS_I(ip)->i_mode) || (VFS_I(ip)->i_mode == 0))
                return 0;
  
        /* If this is a read-only mount, don't do this (would generate I/O) */
                }
        }
  
 -      if (ip->i_d.di_nlink == 0)
 +      if (VFS_I(ip)->i_nlink == 0)
                return 0;
  
        if (xfs_can_free_eofblocks(ip, false)) {
@@@ -1861,7 -1883,7 +1861,7 @@@ xfs_inactive
         * If the inode is already free, then there can be nothing
         * to clean up here.
         */
 -      if (ip->i_d.di_mode == 0) {
 +      if (VFS_I(ip)->i_mode == 0) {
                ASSERT(ip->i_df.if_real_bytes == 0);
                ASSERT(ip->i_df.if_broot_bytes == 0);
                return;
        if (mp->m_flags & XFS_MOUNT_RDONLY)
                return;
  
 -      if (ip->i_d.di_nlink != 0) {
 +      if (VFS_I(ip)->i_nlink != 0) {
                /*
                 * force is true because we are evicting an inode from the
                 * cache. Post-eof blocks must be freed, lest we end up with
                return;
        }
  
 -      if (S_ISREG(ip->i_d.di_mode) &&
 +      if (S_ISREG(VFS_I(ip)->i_mode) &&
            (ip->i_d.di_size != 0 || XFS_ISIZE(ip) != 0 ||
             ip->i_d.di_nextents > 0 || ip->i_delayed_blks > 0))
                truncate = 1;
        if (error)
                return;
  
 -      if (S_ISLNK(ip->i_d.di_mode))
 +      if (S_ISLNK(VFS_I(ip)->i_mode))
                error = xfs_inactive_symlink(ip);
        else if (truncate)
                error = xfs_inactive_truncate(ip);
  }
  
  /*
 - * This is called when the inode's link count goes to 0.
 - * We place the on-disk inode on a list in the AGI.  It
 - * will be pulled from this list when the inode is freed.
 + * This is called when the inode's link count goes to 0 or we are creating a
 + * tmpfile via O_TMPFILE. In the case of a tmpfile, @ignore_linkcount will be
 + * set to true as the link count is dropped to zero by the VFS after we've
 + * created the file successfully, so we have to add it to the unlinked list
 + * while the link count is non-zero.
 + *
 + * We place the on-disk inode on a list in the AGI.  It will be pulled from this
 + * list when the inode is freed.
   */
 -int
 +STATIC int
  xfs_iunlink(
 -      xfs_trans_t     *tp,
 -      xfs_inode_t     *ip)
 +      struct xfs_trans *tp,
 +      struct xfs_inode *ip)
  {
 -      xfs_mount_t     *mp;
 +      xfs_mount_t     *mp = tp->t_mountp;
        xfs_agi_t       *agi;
        xfs_dinode_t    *dip;
        xfs_buf_t       *agibp;
        int             offset;
        int             error;
  
 -      ASSERT(ip->i_d.di_nlink == 0);
 -      ASSERT(ip->i_d.di_mode != 0);
 -
 -      mp = tp->t_mountp;
 +      ASSERT(VFS_I(ip)->i_mode != 0);
  
        /*
         * Get the agi buffer first.  It ensures lock ordering
@@@ -2392,10 -2412,10 +2392,10 @@@ xfs_ifree
        struct xfs_icluster     xic = { 0 };
  
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 -      ASSERT(ip->i_d.di_nlink == 0);
 +      ASSERT(VFS_I(ip)->i_nlink == 0);
        ASSERT(ip->i_d.di_nextents == 0);
        ASSERT(ip->i_d.di_anextents == 0);
 -      ASSERT(ip->i_d.di_size == 0 || !S_ISREG(ip->i_d.di_mode));
 +      ASSERT(ip->i_d.di_size == 0 || !S_ISREG(VFS_I(ip)->i_mode));
        ASSERT(ip->i_d.di_nblocks == 0);
  
        /*
        if (error)
                return error;
  
 -      ip->i_d.di_mode = 0;            /* mark incore inode as free */
 +      VFS_I(ip)->i_mode = 0;          /* mark incore inode as free */
        ip->i_d.di_flags = 0;
        ip->i_d.di_dmevmask = 0;
        ip->i_d.di_forkoff = 0;         /* mark the attr fork not in use */
         * Bump the generation count so no one will be confused
         * by reincarnations of this inode.
         */
 -      ip->i_d.di_gen++;
 +      VFS_I(ip)->i_generation++;
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
  
        if (xic.deleted)
@@@ -2506,7 -2526,7 +2506,7 @@@ xfs_remove
  {
        xfs_mount_t             *mp = dp->i_mount;
        xfs_trans_t             *tp = NULL;
 -      int                     is_dir = S_ISDIR(ip->i_d.di_mode);
 +      int                     is_dir = S_ISDIR(VFS_I(ip)->i_mode);
        int                     error = 0;
        xfs_bmap_free_t         free_list;
        xfs_fsblock_t           first_block;
         * If we're removing a directory perform some additional validation.
         */
        if (is_dir) {
 -              ASSERT(ip->i_d.di_nlink >= 2);
 -              if (ip->i_d.di_nlink != 2) {
 +              ASSERT(VFS_I(ip)->i_nlink >= 2);
 +              if (VFS_I(ip)->i_nlink != 2) {
                        error = -ENOTEMPTY;
                        goto out_trans_cancel;
                }
@@@ -2751,7 -2771,7 +2751,7 @@@ xfs_cross_rename
        if (dp1 != dp2) {
                dp2_flags = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
  
 -              if (S_ISDIR(ip2->i_d.di_mode)) {
 +              if (S_ISDIR(VFS_I(ip2)->i_mode)) {
                        error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot,
                                                dp1->i_ino, first_block,
                                                free_list, spaceres);
                                goto out_trans_abort;
  
                        /* transfer ip2 ".." reference to dp1 */
 -                      if (!S_ISDIR(ip1->i_d.di_mode)) {
 +                      if (!S_ISDIR(VFS_I(ip1)->i_mode)) {
                                error = xfs_droplink(tp, dp2);
                                if (error)
                                        goto out_trans_abort;
                        ip2_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
                }
  
 -              if (S_ISDIR(ip1->i_d.di_mode)) {
 +              if (S_ISDIR(VFS_I(ip1)->i_mode)) {
                        error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot,
                                                dp2->i_ino, first_block,
                                                free_list, spaceres);
                                goto out_trans_abort;
  
                        /* transfer ip1 ".." reference to dp2 */
 -                      if (!S_ISDIR(ip2->i_d.di_mode)) {
 +                      if (!S_ISDIR(VFS_I(ip2)->i_mode)) {
                                error = xfs_droplink(tp, dp1);
                                if (error)
                                        goto out_trans_abort;
@@@ -2883,7 -2903,7 +2883,7 @@@ xfs_rename
        struct xfs_inode        *inodes[__XFS_SORT_INODES];
        int                     num_inodes = __XFS_SORT_INODES;
        bool                    new_parent = (src_dp != target_dp);
 -      bool                    src_is_directory = S_ISDIR(src_ip->i_d.di_mode);
 +      bool                    src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
        int                     spaceres;
        int                     error;
  
                 * target and source are directories and that target can be
                 * destroyed, or that neither is a directory.
                 */
 -              if (S_ISDIR(target_ip->i_d.di_mode)) {
 +              if (S_ISDIR(VFS_I(target_ip)->i_mode)) {
                        /*
                         * Make sure target dir is empty.
                         */
                        if (!(xfs_dir_isempty(target_ip)) ||
 -                          (target_ip->i_d.di_nlink > 2)) {
 +                          (VFS_I(target_ip)->i_nlink > 2)) {
                                error = -EEXIST;
                                goto out_trans_cancel;
                        }
         * intermediate state on disk.
         */
        if (wip) {
 -              ASSERT(VFS_I(wip)->i_nlink == 0 && wip->i_d.di_nlink == 0);
 +              ASSERT(VFS_I(wip)->i_nlink == 0);
                error = xfs_bumplink(tp, wip);
                if (error)
                        goto out_bmap_cancel;
@@@ -3293,7 -3313,7 +3293,7 @@@ cluster_corrupt_out
                 * mark it as stale and brelse.
                 */
                if (bp->b_iodone) {
-                       XFS_BUF_UNDONE(bp);
+                       bp->b_flags &= ~XBF_DONE;
                        xfs_buf_stale(bp);
                        xfs_buf_ioerror(bp, -EIO);
                        xfs_buf_ioend(bp);
@@@ -3442,7 -3462,14 +3442,7 @@@ xfs_iflush_int
                        __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip);
                goto corrupt_out;
        }
 -      if (XFS_TEST_ERROR(ip->i_d.di_magic != XFS_DINODE_MAGIC,
 -                              mp, XFS_ERRTAG_IFLUSH_2, XFS_RANDOM_IFLUSH_2)) {
 -              xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
 -                      "%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x",
 -                      __func__, ip->i_ino, ip, ip->i_d.di_magic);
 -              goto corrupt_out;
 -      }
 -      if (S_ISREG(ip->i_d.di_mode)) {
 +      if (S_ISREG(VFS_I(ip)->i_mode)) {
                if (XFS_TEST_ERROR(
                    (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
                    (ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
                                __func__, ip->i_ino, ip);
                        goto corrupt_out;
                }
 -      } else if (S_ISDIR(ip->i_d.di_mode)) {
 +      } else if (S_ISDIR(VFS_I(ip)->i_mode)) {
                if (XFS_TEST_ERROR(
                    (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
                    (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
                ip->i_d.di_flushiter++;
  
        /*
 -       * Copy the dirty parts of the inode into the on-disk
 -       * inode.  We always copy out the core of the inode,
 -       * because if the inode is dirty at all the core must
 -       * be.
 +       * Copy the dirty parts of the inode into the on-disk inode.  We always
 +       * copy out the core of the inode, because if the inode is dirty at all
 +       * the core must be.
         */
 -      xfs_dinode_to_disk(dip, &ip->i_d);
 +      xfs_inode_to_disk(ip, dip, iip->ili_item.li_lsn);
  
        /* Wrap, we never let the log put out DI_MAX_FLUSH */
        if (ip->i_d.di_flushiter == DI_MAX_FLUSH)
         */
        xfs_buf_attach_iodone(bp, xfs_iflush_done, &iip->ili_item);
  
 -      /* update the lsn in the on disk inode if required */
 -      if (ip->i_d.di_version == 3)
 -              dip->di_lsn = cpu_to_be64(iip->ili_item.li_lsn);
 -
        /* generate the checksum. */
        xfs_dinode_calc_crc(mp, dip);
  
diff --combined fs/xfs/xfs_log_recover.c
index 595801d86b4dcf4c2d3036fb4e1521c4489b4757,837e8d09aa5a3bc4d969fc9988998ead4d9cd3af..1dc0e1488d4c272aa0b59d4ac65a1ecc68845113
@@@ -190,7 -190,7 +190,7 @@@ xlog_bread_noalign
        ASSERT(nbblks <= bp->b_length);
  
        XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no);
-       XFS_BUF_READ(bp);
+       bp->b_flags |= XBF_READ;
        bp->b_io_length = nbblks;
        bp->b_error = 0;
  
@@@ -275,7 -275,6 +275,6 @@@ xlog_bwrite
        ASSERT(nbblks <= bp->b_length);
  
        XFS_BUF_SET_ADDR(bp, log->l_logBBstart + blk_no);
-       XFS_BUF_ZEROFLAGS(bp);
        xfs_buf_hold(bp);
        xfs_buf_lock(bp);
        bp->b_io_length = nbblks;
@@@ -2473,13 -2472,6 +2472,13 @@@ xlog_recover_validate_buf_type
                }
                bp->b_ops = &xfs_sb_buf_ops;
                break;
 +#ifdef CONFIG_XFS_RT
 +      case XFS_BLFT_RTBITMAP_BUF:
 +      case XFS_BLFT_RTSUMMARY_BUF:
 +              /* no magic numbers for verification of RT buffers */
 +              bp->b_ops = &xfs_rtbuf_ops;
 +              break;
 +#endif /* CONFIG_XFS_RT */
        default:
                xfs_warn(mp, "Unknown buffer type %d!",
                         xfs_blft_from_flags(buf_f));
@@@ -2800,7 -2792,7 +2799,7 @@@ xfs_recover_inode_owner_change
                return -ENOMEM;
  
        /* instantiate the inode */
 -      xfs_dinode_from_disk(&ip->i_d, dip);
 +      xfs_inode_from_disk(ip, dip);
        ASSERT(ip->i_d.di_version >= 3);
  
        error = xfs_iformat_fork(ip, dip);
@@@ -2846,7 -2838,7 +2845,7 @@@ xlog_recover_inode_pass2
        int                     error;
        int                     attr_index;
        uint                    fields;
 -      xfs_icdinode_t          *dicp;
 +      struct xfs_log_dinode   *ldip;
        uint                    isize;
        int                     need_free = 0;
  
                error = -EFSCORRUPTED;
                goto out_release;
        }
 -      dicp = item->ri_buf[1].i_addr;
 -      if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) {
 +      ldip = item->ri_buf[1].i_addr;
 +      if (unlikely(ldip->di_magic != XFS_DINODE_MAGIC)) {
                xfs_alert(mp,
                        "%s: Bad inode log record, rec ptr 0x%p, ino %Ld",
                        __func__, item, in_f->ilf_ino);
         * to skip replay when the on disk inode is newer than the log one
         */
        if (!xfs_sb_version_hascrc(&mp->m_sb) &&
 -          dicp->di_flushiter < be16_to_cpu(dip->di_flushiter)) {
 +          ldip->di_flushiter < be16_to_cpu(dip->di_flushiter)) {
                /*
                 * Deal with the wrap case, DI_MAX_FLUSH is less
                 * than smaller numbers
                 */
                if (be16_to_cpu(dip->di_flushiter) == DI_MAX_FLUSH &&
 -                  dicp->di_flushiter < (DI_MAX_FLUSH >> 1)) {
 +                  ldip->di_flushiter < (DI_MAX_FLUSH >> 1)) {
                        /* do nothing */
                } else {
                        trace_xfs_log_recover_inode_skip(log, in_f);
        }
  
        /* Take the opportunity to reset the flush iteration count */
 -      dicp->di_flushiter = 0;
 +      ldip->di_flushiter = 0;
  
 -      if (unlikely(S_ISREG(dicp->di_mode))) {
 -              if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
 -                  (dicp->di_format != XFS_DINODE_FMT_BTREE)) {
 +      if (unlikely(S_ISREG(ldip->di_mode))) {
 +              if ((ldip->di_format != XFS_DINODE_FMT_EXTENTS) &&
 +                  (ldip->di_format != XFS_DINODE_FMT_BTREE)) {
                        XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
 -                                       XFS_ERRLEVEL_LOW, mp, dicp);
 +                                       XFS_ERRLEVEL_LOW, mp, ldip);
                        xfs_alert(mp,
                "%s: Bad regular inode log record, rec ptr 0x%p, "
                "ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
                        error = -EFSCORRUPTED;
                        goto out_release;
                }
 -      } else if (unlikely(S_ISDIR(dicp->di_mode))) {
 -              if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
 -                  (dicp->di_format != XFS_DINODE_FMT_BTREE) &&
 -                  (dicp->di_format != XFS_DINODE_FMT_LOCAL)) {
 +      } else if (unlikely(S_ISDIR(ldip->di_mode))) {
 +              if ((ldip->di_format != XFS_DINODE_FMT_EXTENTS) &&
 +                  (ldip->di_format != XFS_DINODE_FMT_BTREE) &&
 +                  (ldip->di_format != XFS_DINODE_FMT_LOCAL)) {
                        XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(4)",
 -                                           XFS_ERRLEVEL_LOW, mp, dicp);
 +                                           XFS_ERRLEVEL_LOW, mp, ldip);
                        xfs_alert(mp,
                "%s: Bad dir inode log record, rec ptr 0x%p, "
                "ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
                        goto out_release;
                }
        }
 -      if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){
 +      if (unlikely(ldip->di_nextents + ldip->di_anextents > ldip->di_nblocks)){
                XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(5)",
 -                                   XFS_ERRLEVEL_LOW, mp, dicp);
 +                                   XFS_ERRLEVEL_LOW, mp, ldip);
                xfs_alert(mp,
        "%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
        "dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld",
                        __func__, item, dip, bp, in_f->ilf_ino,
 -                      dicp->di_nextents + dicp->di_anextents,
 -                      dicp->di_nblocks);
 +                      ldip->di_nextents + ldip->di_anextents,
 +                      ldip->di_nblocks);
                error = -EFSCORRUPTED;
                goto out_release;
        }
 -      if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) {
 +      if (unlikely(ldip->di_forkoff > mp->m_sb.sb_inodesize)) {
                XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(6)",
 -                                   XFS_ERRLEVEL_LOW, mp, dicp);
 +                                   XFS_ERRLEVEL_LOW, mp, ldip);
                xfs_alert(mp,
        "%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
        "dino bp 0x%p, ino %Ld, forkoff 0x%x", __func__,
 -                      item, dip, bp, in_f->ilf_ino, dicp->di_forkoff);
 +                      item, dip, bp, in_f->ilf_ino, ldip->di_forkoff);
                error = -EFSCORRUPTED;
                goto out_release;
        }
 -      isize = xfs_icdinode_size(dicp->di_version);
 +      isize = xfs_log_dinode_size(ldip->di_version);
        if (unlikely(item->ri_buf[1].i_len > isize)) {
                XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)",
 -                                   XFS_ERRLEVEL_LOW, mp, dicp);
 +                                   XFS_ERRLEVEL_LOW, mp, ldip);
                xfs_alert(mp,
                        "%s: Bad inode log record length %d, rec ptr 0x%p",
                        __func__, item->ri_buf[1].i_len, item);
                goto out_release;
        }
  
 -      /* The core is in in-core format */
 -      xfs_dinode_to_disk(dip, dicp);
 +      /* recover the log dinode inode into the on disk inode */
 +      xfs_log_dinode_to_disk(ldip, dip);
  
        /* the rest is in on-disk format */
        if (item->ri_buf[1].i_len > isize) {
@@@ -4344,8 -4336,8 +4343,8 @@@ xlog_recover_process_one_iunlink
        if (error)
                goto fail_iput;
  
 -      ASSERT(ip->i_d.di_nlink == 0);
 -      ASSERT(ip->i_d.di_mode != 0);
 +      ASSERT(VFS_I(ip)->i_nlink == 0);
 +      ASSERT(VFS_I(ip)->i_mode != 0);
  
        /* setup for the next pass */
        agino = be32_to_cpu(dip->di_next_unlinked);
@@@ -4498,7 -4490,7 +4497,7 @@@ xlog_recover_process
         * know precisely what failed.
         */
        if (pass == XLOG_RECOVER_CRCPASS) {
 -              if (rhead->h_crc && crc != le32_to_cpu(rhead->h_crc))
 +              if (rhead->h_crc && crc != rhead->h_crc)
                        return -EFSBADCRC;
                return 0;
        }
         * zero CRC check prevents warnings from being emitted when upgrading
         * the kernel from one that does not add CRCs by default.
         */
 -      if (crc != le32_to_cpu(rhead->h_crc)) {
 +      if (crc != rhead->h_crc) {
                if (rhead->h_crc || xfs_sb_version_hascrc(&log->l_mp->m_sb)) {
                        xfs_alert(log->l_mp,
                "log record CRC mismatch: found 0x%x, expected 0x%x.",
@@@ -4933,10 -4925,9 +4932,9 @@@ xlog_do_recover
         * updates, re-read in the superblock and reverify it.
         */
        bp = xfs_getsb(log->l_mp, 0);
-       XFS_BUF_UNDONE(bp);
-       ASSERT(!(XFS_BUF_ISWRITE(bp)));
-       XFS_BUF_READ(bp);
-       XFS_BUF_UNASYNC(bp);
+       bp->b_flags &= ~(XBF_DONE | XBF_ASYNC);
+       ASSERT(!(bp->b_flags & XBF_WRITE));
+       bp->b_flags |= XBF_READ;
        bp->b_ops = &xfs_sb_buf_ops;
  
        error = xfs_buf_submit_wait(bp);
diff --combined fs/xfs/xfs_mount.c
index d3061054bad2a86aa79b14436a605cf93600a0c4,2c951899344a0db261d8b08291b72c5a0dd366eb..986290c4b7ab9fc753772ffe2d56015ef94e4643
@@@ -865,7 -865,7 +865,7 @@@ xfs_mountfs
  
        ASSERT(rip != NULL);
  
 -      if (unlikely(!S_ISDIR(rip->i_d.di_mode))) {
 +      if (unlikely(!S_ISDIR(VFS_I(rip)->i_mode))) {
                xfs_warn(mp, "corrupted root inode %llu: not a directory",
                        (unsigned long long)rip->i_ino);
                xfs_iunlock(rip, XFS_ILOCK_EXCL);
@@@ -1284,7 -1284,7 +1284,7 @@@ xfs_getsb
        }
  
        xfs_buf_hold(bp);
-       ASSERT(XFS_BUF_ISDONE(bp));
+       ASSERT(bp->b_flags & XBF_DONE);
        return bp;
  }