]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
xfs: move the per-fork nextents fields into struct xfs_ifork
authorChristoph Hellwig <hch@lst.de>
Mon, 18 May 2020 17:27:22 +0000 (10:27 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 19 May 2020 16:40:58 +0000 (09:40 -0700)
There are there are three extents counters per inode, one for each of
the forks.  Two are in the legacy icdinode and one is directly in
struct xfs_inode.  Switch to a single counter in the xfs_ifork structure
where it uses up padding at the end of the structure.  This simplifies
various bits of code that just wants the number of extents counter and
can now directly dereference it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
24 files changed:
fs/xfs/libxfs/xfs_attr.c
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_dir2_block.c
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/libxfs/xfs_inode_buf.h
fs/xfs/libxfs/xfs_inode_fork.c
fs/xfs/libxfs/xfs_inode_fork.h
fs/xfs/scrub/bmap.c
fs/xfs/scrub/parent.c
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_file.c
fs/xfs/xfs_icache.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_itable.c
fs/xfs/xfs_qm_syscalls.c
fs/xfs/xfs_quotaops.c
fs/xfs/xfs_symlink.c
fs/xfs/xfs_trace.h

index e4fe3dca9883b8241181d4a5073a4bd84db59973..1b01675e9c80ba5e90e2b8bcbcb037b510323346 100644 (file)
@@ -62,7 +62,7 @@ xfs_inode_hasattr(
 {
        if (!XFS_IFORK_Q(ip) ||
            (ip->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS &&
-            ip->i_d.di_anextents == 0))
+            ip->i_afp->if_nextents == 0))
                return 0;
        return 1;
 }
@@ -214,7 +214,7 @@ xfs_attr_set_args(
         */
        if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL ||
            (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS &&
-            dp->i_d.di_anextents == 0)) {
+            dp->i_afp->if_nextents == 0)) {
 
                /*
                 * Build initial attribute list (if required).
index 6d18e86bb9c7a257b03d1a1175a301b5b5a3de7e..11ff6dd08512407fcec90b11cc6f020d501a1160 100644 (file)
@@ -718,11 +718,12 @@ xfs_attr_fork_remove(
        struct xfs_inode        *ip,
        struct xfs_trans        *tp)
 {
+       ASSERT(ip->i_afp->if_nextents == 0);
+
        xfs_idestroy_fork(ip, XFS_ATTR_FORK);
        ip->i_d.di_forkoff = 0;
        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
 
-       ASSERT(ip->i_d.di_anextents == 0);
        ASSERT(ip->i_afp == NULL);
 
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
index 34518a6dc7376b3d268466764edf12a76d71fcee..c1136be49abebd01c3b2e287e6456e8a681ca218 100644 (file)
@@ -61,10 +61,10 @@ xfs_bmap_compute_maxlevels(
        int             sz;             /* root block size */
 
        /*
-        * The maximum number of extents in a file, hence the maximum
-        * number of leaf entries, is controlled by the type of di_nextents
-        * (a signed 32-bit number, xfs_extnum_t), or by di_anextents
-        * (a signed 16-bit number, xfs_aextnum_t).
+        * The maximum number of extents in a file, hence the maximum number of
+        * leaf entries, is controlled by the size of the on-disk extent count,
+        * either a signed 32-bit number for the data fork, or a signed 16-bit
+        * number for the attr fork.
         *
         * Note that we can no longer assume that if we are in ATTR1 that
         * the fork offset of all the inodes will be
@@ -120,10 +120,11 @@ xfs_bmbt_lookup_first(
  */
 static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork)
 {
+       struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
+
        return whichfork != XFS_COW_FORK &&
                XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS &&
-               XFS_IFORK_NEXTENTS(ip, whichfork) >
-                       XFS_IFORK_MAXEXT(ip, whichfork);
+               ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork);
 }
 
 /*
@@ -131,10 +132,11 @@ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork)
  */
 static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichfork)
 {
+       struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
+
        return whichfork != XFS_COW_FORK &&
                XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE &&
-               XFS_IFORK_NEXTENTS(ip, whichfork) <=
-                       XFS_IFORK_MAXEXT(ip, whichfork);
+               ifp->if_nextents <= XFS_IFORK_MAXEXT(ip, whichfork);
 }
 
 /*
@@ -334,7 +336,7 @@ xfs_bmap_check_leaf_extents(
        }
 
        /* skip large extent count inodes */
-       if (ip->i_d.di_nextents > 10000)
+       if (ip->i_df.if_nextents > 10000)
                return;
 
        bno = NULLFSBLOCK;
@@ -750,7 +752,7 @@ xfs_bmap_extents_to_btree(
                xfs_bmbt_disk_set_all(arp, &rec);
                cnt++;
        }
-       ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
+       ASSERT(cnt == ifp->if_nextents);
        xfs_btree_set_numrecs(ablock, cnt);
 
        /*
@@ -802,7 +804,7 @@ xfs_bmap_local_to_extents_empty(
        ASSERT(whichfork != XFS_COW_FORK);
        ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL);
        ASSERT(ifp->if_bytes == 0);
-       ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0);
+       ASSERT(ifp->if_nextents == 0);
 
        xfs_bmap_forkoff_reset(ip, whichfork);
        ifp->if_flags &= ~XFS_IFINLINE;
@@ -907,7 +909,7 @@ xfs_bmap_local_to_extents(
        xfs_iext_first(ifp, &icur);
        xfs_iext_insert(ip, &icur, &rec, 0);
 
-       XFS_IFORK_NEXT_SET(ip, whichfork, 1);
+       ifp->if_nextents = 1;
        ip->i_d.di_nblocks = 1;
        xfs_trans_mod_dquot_byino(tp, ip,
                XFS_TRANS_DQ_BCOUNT, 1L);
@@ -972,7 +974,8 @@ xfs_bmap_add_attrfork_extents(
        xfs_btree_cur_t         *cur;           /* bmap btree cursor */
        int                     error;          /* error return value */
 
-       if (ip->i_d.di_nextents * sizeof(xfs_bmbt_rec_t) <= XFS_IFORK_DSIZE(ip))
+       if (ip->i_df.if_nextents * sizeof(struct xfs_bmbt_rec) <=
+           XFS_IFORK_DSIZE(ip))
                return 0;
        cur = NULL;
        error = xfs_bmap_extents_to_btree(tp, ip, &cur, 0, flags,
@@ -1091,10 +1094,6 @@ xfs_bmap_add_attrfork(
                goto trans_cancel;
        if (XFS_IFORK_Q(ip))
                goto trans_cancel;
-       if (XFS_IS_CORRUPT(mp, ip->i_d.di_anextents != 0)) {
-               error = -EFSCORRUPTED;
-               goto trans_cancel;
-       }
        if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS) {
                /*
                 * For inodes coming from pre-6.2 filesystems.
@@ -1183,13 +1182,13 @@ xfs_iread_bmbt_block(
        xfs_extnum_t            num_recs;
        xfs_extnum_t            j;
        int                     whichfork = cur->bc_ino.whichfork;
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(ip, whichfork);
 
        block = xfs_btree_get_block(cur, level, &bp);
 
        /* Abort if we find more records than nextents. */
        num_recs = xfs_btree_get_numrecs(block);
-       if (unlikely(ir->loaded + num_recs >
-                    XFS_IFORK_NEXTENTS(ip, whichfork))) {
+       if (unlikely(ir->loaded + num_recs > ifp->if_nextents)) {
                xfs_warn(ip->i_mount, "corrupt dinode %llu, (btree extents).",
                                (unsigned long long)ip->i_ino);
                xfs_inode_verifier_error(ip, -EFSCORRUPTED, __func__, block,
@@ -1215,7 +1214,7 @@ xfs_iread_bmbt_block(
                                xfs_bmap_fork_to_state(whichfork));
                trace_xfs_read_extent(ip, &ir->icur,
                                xfs_bmap_fork_to_state(whichfork), _THIS_IP_);
-               xfs_iext_next(XFS_IFORK_PTR(ip, whichfork), &ir->icur);
+               xfs_iext_next(ifp, &ir->icur);
        }
 
        return 0;
@@ -1254,8 +1253,7 @@ xfs_iread_extents(
        if (error)
                goto out;
 
-       if (XFS_IS_CORRUPT(mp,
-                          ir.loaded != XFS_IFORK_NEXTENTS(ip, whichfork))) {
+       if (XFS_IS_CORRUPT(mp, ir.loaded != ifp->if_nextents)) {
                error = -EFSCORRUPTED;
                goto out;
        }
@@ -1463,23 +1461,22 @@ xfs_bmap_last_offset(
  */
 int                                    /* 1=>1 block, 0=>otherwise */
 xfs_bmap_one_block(
-       xfs_inode_t     *ip,            /* incore inode */
-       int             whichfork)      /* data or attr fork */
+       struct xfs_inode        *ip,            /* incore inode */
+       int                     whichfork)      /* data or attr fork */
 {
-       struct xfs_ifork *ifp;          /* inode fork pointer */
-       int             rval;           /* return value */
-       xfs_bmbt_irec_t s;              /* internal version of extent */
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(ip, whichfork);
+       int                     rval;           /* return value */
+       struct xfs_bmbt_irec    s;              /* internal version of extent */
        struct xfs_iext_cursor icur;
 
 #ifndef DEBUG
        if (whichfork == XFS_DATA_FORK)
                return XFS_ISIZE(ip) == ip->i_mount->m_sb.sb_blocksize;
 #endif /* !DEBUG */
-       if (XFS_IFORK_NEXTENTS(ip, whichfork) != 1)
+       if (ifp->if_nextents != 1)
                return 0;
        if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS)
                return 0;
-       ifp = XFS_IFORK_PTR(ip, whichfork);
        ASSERT(ifp->if_flags & XFS_IFEXTENTS);
        xfs_iext_first(ifp, &icur);
        xfs_iext_get_extent(ifp, &icur, &s);
@@ -1501,10 +1498,11 @@ xfs_bmap_add_extent_delay_real(
        struct xfs_bmalloca     *bma,
        int                     whichfork)
 {
+       struct xfs_mount        *mp = bma->ip->i_mount;
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(bma->ip, whichfork);
        struct xfs_bmbt_irec    *new = &bma->got;
        int                     error;  /* error return value */
        int                     i;      /* temp state */
-       struct xfs_ifork        *ifp;   /* inode fork pointer */
        xfs_fileoff_t           new_endoff;     /* end offset of new entry */
        xfs_bmbt_irec_t         r[3];   /* neighbor extent entries */
                                        /* left is 0, right is 1, prev is 2 */
@@ -1514,16 +1512,9 @@ xfs_bmap_add_extent_delay_real(
        xfs_filblks_t           da_old; /* old count del alloc blocks used */
        xfs_filblks_t           temp=0; /* value for da_new calculations */
        int                     tmp_rval;       /* partial logging flags */
-       struct xfs_mount        *mp;
-       xfs_extnum_t            *nextents;
        struct xfs_bmbt_irec    old;
 
-       mp = bma->ip->i_mount;
-       ifp = XFS_IFORK_PTR(bma->ip, whichfork);
        ASSERT(whichfork != XFS_ATTR_FORK);
-       nextents = (whichfork == XFS_COW_FORK ? &bma->ip->i_cnextents :
-                                               &bma->ip->i_d.di_nextents);
-
        ASSERT(!isnullstartblock(new->br_startblock));
        ASSERT(!bma->cur ||
               (bma->cur->bc_ino.flags & XFS_BTCUR_BMBT_WASDEL));
@@ -1614,7 +1605,7 @@ xfs_bmap_add_extent_delay_real(
                xfs_iext_remove(bma->ip, &bma->icur, state);
                xfs_iext_prev(ifp, &bma->icur);
                xfs_iext_update_extent(bma->ip, state, &bma->icur, &LEFT);
-               (*nextents)--;
+               ifp->if_nextents--;
 
                if (bma->cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
@@ -1718,8 +1709,8 @@ xfs_bmap_add_extent_delay_real(
                PREV.br_startblock = new->br_startblock;
                PREV.br_state = new->br_state;
                xfs_iext_update_extent(bma->ip, state, &bma->icur, &PREV);
+               ifp->if_nextents++;
 
-               (*nextents)++;
                if (bma->cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -1784,7 +1775,8 @@ xfs_bmap_add_extent_delay_real(
                 * The left neighbor is not contiguous.
                 */
                xfs_iext_update_extent(bma->ip, state, &bma->icur, new);
-               (*nextents)++;
+               ifp->if_nextents++;
+
                if (bma->cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -1870,7 +1862,8 @@ xfs_bmap_add_extent_delay_real(
                 * The right neighbor is not contiguous.
                 */
                xfs_iext_update_extent(bma->ip, state, &bma->icur, new);
-               (*nextents)++;
+               ifp->if_nextents++;
+
                if (bma->cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -1955,7 +1948,7 @@ xfs_bmap_add_extent_delay_real(
                xfs_iext_next(ifp, &bma->icur);
                xfs_iext_insert(bma->ip, &bma->icur, &RIGHT, state);
                xfs_iext_insert(bma->ip, &bma->icur, &LEFT, state);
-               (*nextents)++;
+               ifp->if_nextents++;
 
                if (bma->cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
@@ -2159,8 +2152,7 @@ xfs_bmap_add_extent_unwritten_real(
                xfs_iext_remove(ip, icur, state);
                xfs_iext_prev(ifp, icur);
                xfs_iext_update_extent(ip, state, icur, &LEFT);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) - 2);
+               ifp->if_nextents -= 2;
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2212,8 +2204,7 @@ xfs_bmap_add_extent_unwritten_real(
                xfs_iext_remove(ip, icur, state);
                xfs_iext_prev(ifp, icur);
                xfs_iext_update_extent(ip, state, icur, &LEFT);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
+               ifp->if_nextents--;
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2255,9 +2246,8 @@ xfs_bmap_add_extent_unwritten_real(
                xfs_iext_remove(ip, icur, state);
                xfs_iext_prev(ifp, icur);
                xfs_iext_update_extent(ip, state, icur, &PREV);
+               ifp->if_nextents--;
 
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2364,8 +2354,8 @@ xfs_bmap_add_extent_unwritten_real(
 
                xfs_iext_update_extent(ip, state, icur, &PREV);
                xfs_iext_insert(ip, icur, new, state);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
+               ifp->if_nextents++;
+
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2440,9 +2430,8 @@ xfs_bmap_add_extent_unwritten_real(
                xfs_iext_update_extent(ip, state, icur, &PREV);
                xfs_iext_next(ifp, icur);
                xfs_iext_insert(ip, icur, new, state);
+               ifp->if_nextents++;
 
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2493,9 +2482,8 @@ xfs_bmap_add_extent_unwritten_real(
                xfs_iext_next(ifp, icur);
                xfs_iext_insert(ip, icur, &r[1], state);
                xfs_iext_insert(ip, icur, &r[0], state);
+               ifp->if_nextents += 2;
 
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                               XFS_IFORK_NEXTENTS(ip, whichfork) + 2);
                if (cur == NULL)
                        rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
                else {
@@ -2810,9 +2798,8 @@ xfs_bmap_add_extent_hole_real(
                xfs_iext_remove(ip, icur, state);
                xfs_iext_prev(ifp, icur);
                xfs_iext_update_extent(ip, state, icur, &left);
+               ifp->if_nextents--;
 
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                       XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
                if (cur == NULL) {
                        rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
                } else {
@@ -2910,8 +2897,8 @@ xfs_bmap_add_extent_hole_real(
                 * Insert a new entry.
                 */
                xfs_iext_insert(ip, icur, new, state);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                       XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
+               ifp->if_nextents++;
+
                if (cur == NULL) {
                        rval = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
                } else {
@@ -4512,8 +4499,7 @@ xfs_bmapi_write(
                goto error0;
 
        ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE ||
-              XFS_IFORK_NEXTENTS(ip, whichfork) >
-               XFS_IFORK_MAXEXT(ip, whichfork));
+              ifp->if_nextents > XFS_IFORK_MAXEXT(ip, whichfork));
        xfs_bmapi_finish(&bma, whichfork, 0);
        xfs_bmap_validate_ret(orig_bno, orig_len, orig_flags, orig_mval,
                orig_nmap, *nmap);
@@ -5056,8 +5042,7 @@ xfs_bmap_del_extent_real(
         */
        if (tp->t_blk_res == 0 &&
            XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS &&
-           XFS_IFORK_NEXTENTS(ip, whichfork) >=
-                       XFS_IFORK_MAXEXT(ip, whichfork) &&
+           ifp->if_nextents >= XFS_IFORK_MAXEXT(ip, whichfork) &&
            del->br_startoff > got.br_startoff && del_endoff < got_endoff)
                return -ENOSPC;
 
@@ -5109,8 +5094,8 @@ xfs_bmap_del_extent_real(
                 */
                xfs_iext_remove(ip, icur, state);
                xfs_iext_prev(ifp, icur);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                       XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
+               ifp->if_nextents--;
+
                flags |= XFS_ILOG_CORE;
                if (!cur) {
                        flags |= xfs_ilog_fext(whichfork);
@@ -5218,8 +5203,8 @@ xfs_bmap_del_extent_real(
                        }
                } else
                        flags |= xfs_ilog_fext(whichfork);
-               XFS_IFORK_NEXT_SET(ip, whichfork,
-                       XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
+
+               ifp->if_nextents++;
                xfs_iext_next(ifp, icur);
                xfs_iext_insert(ip, icur, &new, state);
                break;
@@ -5667,6 +5652,7 @@ xfs_bmse_merge(
        struct xfs_btree_cur            *cur,
        int                             *logflags)      /* output */
 {
+       struct xfs_ifork                *ifp = XFS_IFORK_PTR(ip, whichfork);
        struct xfs_bmbt_irec            new;
        xfs_filblks_t                   blockcount;
        int                             error, i;
@@ -5685,8 +5671,7 @@ xfs_bmse_merge(
         * Update the on-disk extent count, the btree if necessary and log the
         * inode.
         */
-       XFS_IFORK_NEXT_SET(ip, whichfork,
-                          XFS_IFORK_NEXTENTS(ip, whichfork) - 1);
+       ifp->if_nextents--;
        *logflags |= XFS_ILOG_CORE;
        if (!cur) {
                *logflags |= XFS_ILOG_DEXT;
@@ -5724,7 +5709,7 @@ xfs_bmse_merge(
 
 done:
        xfs_iext_remove(ip, icur, 0);
-       xfs_iext_prev(XFS_IFORK_PTR(ip, whichfork), icur);
+       xfs_iext_prev(ifp, icur);
        xfs_iext_update_extent(ip, xfs_bmap_fork_to_state(whichfork), icur,
                        &new);
 
@@ -6074,8 +6059,7 @@ xfs_bmap_split_extent(
        /* Add new extent */
        xfs_iext_next(ifp, &icur);
        xfs_iext_insert(ip, &icur, &new, 0);
-       XFS_IFORK_NEXT_SET(ip, whichfork,
-                          XFS_IFORK_NEXTENTS(ip, whichfork) + 1);
+       ifp->if_nextents++;
 
        if (cur) {
                error = xfs_bmbt_lookup_eq(cur, &new, &i);
index 1dbf2f980a26a272617029153687f293f4f6d53b..5b59d3f7746b342a92354af5dda8e1076c39a4d3 100644 (file)
@@ -1104,7 +1104,7 @@ xfs_dir2_sf_to_block(
        ASSERT(ifp->if_bytes == dp->i_d.di_size);
        ASSERT(ifp->if_u1.if_data != NULL);
        ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count));
-       ASSERT(dp->i_d.di_nextents == 0);
+       ASSERT(dp->i_df.if_nextents == 0);
 
        /*
         * Copy the directory into a temporary buffer.
index 5547bbb3cf945d4376d59fde42b2c302747e5000..a374e2a81e764a6b9092fc4630031909da54607c 100644 (file)
@@ -245,8 +245,6 @@ xfs_inode_from_disk(
        to->di_size = be64_to_cpu(from->di_size);
        to->di_nblocks = be64_to_cpu(from->di_nblocks);
        to->di_extsize = be32_to_cpu(from->di_extsize);
-       to->di_nextents = be32_to_cpu(from->di_nextents);
-       to->di_anextents = be16_to_cpu(from->di_anextents);
        to->di_forkoff = from->di_forkoff;
        to->di_aformat  = from->di_aformat;
        to->di_dmevmask = be32_to_cpu(from->di_dmevmask);
@@ -311,8 +309,8 @@ xfs_inode_to_disk(
        to->di_size = cpu_to_be64(from->di_size);
        to->di_nblocks = cpu_to_be64(from->di_nblocks);
        to->di_extsize = cpu_to_be32(from->di_extsize);
-       to->di_nextents = cpu_to_be32(from->di_nextents);
-       to->di_anextents = cpu_to_be16(from->di_anextents);
+       to->di_nextents = cpu_to_be32(xfs_ifork_nextents(&ip->i_df));
+       to->di_anextents = cpu_to_be16(xfs_ifork_nextents(ip->i_afp));
        to->di_forkoff = from->di_forkoff;
        to->di_aformat = from->di_aformat;
        to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
index e4cbcaf62a32b7ddf0a8a4202ae3d5f3e6ecc747..fecccfb26463c9a2f50666c2bd19bcafc17095f1 100644 (file)
@@ -22,8 +22,6 @@ struct xfs_icdinode {
        xfs_fsize_t     di_size;        /* number of bytes in file */
        xfs_rfsblock_t  di_nblocks;     /* # of direct & btree blocks used */
        xfs_extlen_t    di_extsize;     /* basic/minimum extent size for file */
-       xfs_extnum_t    di_nextents;    /* number of extents in data fork */
-       xfs_aextnum_t   di_anextents;   /* number of extents in attribute fork*/
        uint8_t         di_forkoff;     /* attr fork offs, <<3 for 64b align */
        int8_t          di_aformat;     /* format of attr fork's data */
        uint32_t        di_dmevmask;    /* DMIG event mask */
index 6c24c27f5f44bca1798dc825bea79f795889952c..2702ad5ba9956709489c2b62d0ebf341407001cc 100644 (file)
@@ -188,12 +188,11 @@ xfs_iformat_btree(
         * or the number of extents is greater than the number of
         * blocks.
         */
-       if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <=
-                                       XFS_IFORK_MAXEXT(ip, whichfork) ||
+       if (unlikely(ifp->if_nextents <= XFS_IFORK_MAXEXT(ip, whichfork) ||
                     nrecs == 0 ||
                     XFS_BMDR_SPACE_CALC(nrecs) >
                                        XFS_DFORK_SIZE(dip, mp, whichfork) ||
-                    XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks) ||
+                    ifp->if_nextents > ip->i_d.di_nblocks) ||
                     level == 0 || level > XFS_BTREE_MAXLEVELS) {
                xfs_warn(mp, "corrupt inode %Lu (btree).",
                                        (unsigned long long) ip->i_ino);
@@ -229,6 +228,12 @@ xfs_iformat_data_fork(
        struct inode            *inode = VFS_I(ip);
        int                     error;
 
+       /*
+        * Initialize the extent count early, as the per-format routines may
+        * depend on it.
+        */
+       ip->i_df.if_nextents = be32_to_cpu(dip->di_nextents);
+
        switch (inode->i_mode & S_IFMT) {
        case S_IFIFO:
        case S_IFCHR:
@@ -281,7 +286,13 @@ xfs_iformat_attr_fork(
 {
        int                     error = 0;
 
+       /*
+        * Initialize the extent count early, as the per-format routines may
+        * depend on it.
+        */
        ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_NOFS);
+       ip->i_afp->if_nextents = be16_to_cpu(dip->di_anextents);
+
        switch (dip->di_aformat) {
        case XFS_DINODE_FMT_LOCAL:
                error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK,
@@ -617,7 +628,7 @@ xfs_iflush_fork(
                       !(iip->ili_fields & extflag[whichfork]));
                if ((iip->ili_fields & extflag[whichfork]) &&
                    (ifp->if_bytes > 0)) {
-                       ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0);
+                       ASSERT(ifp->if_nextents > 0);
                        (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp,
                                whichfork);
                }
@@ -676,7 +687,6 @@ xfs_ifork_init_cow(
                                       KM_NOFS);
        ip->i_cowfp->if_flags = XFS_IFEXTENTS;
        ip->i_cformat = XFS_DINODE_FMT_EXTENTS;
-       ip->i_cnextents = 0;
 }
 
 /* Verify the inline contents of the data fork of an inode. */
index f46a8c1db596455df468301b97f3ed0631b37b22..a69d425fe68df8bd844c5fcbf08d37f4cd19484e 100644 (file)
@@ -23,6 +23,7 @@ struct xfs_ifork {
        } if_u1;
        short                   if_broot_bytes; /* bytes allocated for root */
        unsigned char           if_flags;       /* per-fork flags */
+       xfs_extnum_t            if_nextents;    /* # of extents in this fork */
 };
 
 /*
@@ -67,18 +68,6 @@ struct xfs_ifork {
                ((w) == XFS_ATTR_FORK ? \
                        ((ip)->i_d.di_aformat = (n)) : \
                        ((ip)->i_cformat = (n))))
-#define XFS_IFORK_NEXTENTS(ip,w) \
-       ((w) == XFS_DATA_FORK ? \
-               (ip)->i_d.di_nextents : \
-               ((w) == XFS_ATTR_FORK ? \
-                       (ip)->i_d.di_anextents : \
-                       (ip)->i_cnextents))
-#define XFS_IFORK_NEXT_SET(ip,w,n) \
-       ((w) == XFS_DATA_FORK ? \
-               ((ip)->i_d.di_nextents = (n)) : \
-               ((w) == XFS_ATTR_FORK ? \
-                       ((ip)->i_d.di_anextents = (n)) : \
-                       ((ip)->i_cnextents = (n))))
 #define XFS_IFORK_MAXEXT(ip, w) \
        (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t))
 
@@ -86,6 +75,13 @@ struct xfs_ifork {
        (XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_EXTENTS || \
         XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_BTREE)
 
+static inline xfs_extnum_t xfs_ifork_nextents(struct xfs_ifork *ifp)
+{
+       if (!ifp)
+               return 0;
+       return ifp->if_nextents;
+}
+
 struct xfs_ifork *xfs_iext_state_to_fork(struct xfs_inode *ip, int state);
 
 int            xfs_iformat_data_fork(struct xfs_inode *, struct xfs_dinode *);
index 93d5b8a9d7f74cca7b6b58b1d8e44c2c67af08a9..162912c5080a793b1451ee8a4d20204b47a35d84 100644 (file)
@@ -566,6 +566,7 @@ xchk_bmap_check_rmaps(
        struct xfs_scrub        *sc,
        int                     whichfork)
 {
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(sc->ip, whichfork);
        xfs_agnumber_t          agno;
        bool                    zero_size;
        int                     error;
@@ -594,7 +595,7 @@ xchk_bmap_check_rmaps(
                zero_size = false;
 
        if (XFS_IFORK_FORMAT(sc->ip, whichfork) != XFS_DINODE_FMT_BTREE &&
-           (zero_size || XFS_IFORK_NEXTENTS(sc->ip, whichfork) > 0))
+           (zero_size || ifp->if_nextents > 0))
                return 0;
 
        for (agno = 0; agno < sc->mp->m_sb.sb_agcount; agno++) {
index 5705adc43a75f9b2473e6b53cfd38ab6c5af90be..855aa8bcab64bdf829e976ff5559009bc544974a 100644 (file)
@@ -90,7 +90,7 @@ xchk_parent_count_parent_dentries(
         * if there is one.
         */
        lock_mode = xfs_ilock_data_map_shared(parent);
-       if (parent->i_d.di_nextents > 0)
+       if (parent->i_df.if_nextents > 0)
                error = xfs_dir3_data_readahead(parent, 0, 0);
        xfs_iunlock(parent, lock_mode);
        if (error)
index b8acfd4d3ca64ca52bff1ab19e6a46e9b6d1bbc1..ee2ea571c8534d53c7921a401241b0d549423cfb 100644 (file)
@@ -1227,7 +1227,7 @@ xfs_swap_extents_check_format(
         * if the target inode has less extents that then temporary inode then
         * why did userspace call us?
         */
-       if (ip->i_d.di_nextents < tip->i_d.di_nextents)
+       if (ip->i_df.if_nextents < tip->i_df.if_nextents)
                return -EINVAL;
 
        /*
@@ -1248,14 +1248,12 @@ xfs_swap_extents_check_format(
 
        /* Check temp in extent form to max in target */
        if (tip->i_d.di_format == XFS_DINODE_FMT_EXTENTS &&
-           XFS_IFORK_NEXTENTS(tip, XFS_DATA_FORK) >
-                       XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK))
+           tip->i_df.if_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK))
                return -EINVAL;
 
        /* Check target in extent form to max in temp */
        if (ip->i_d.di_format == XFS_DINODE_FMT_EXTENTS &&
-           XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK) >
-                       XFS_IFORK_MAXEXT(tip, XFS_DATA_FORK))
+           ip->i_df.if_nextents > XFS_IFORK_MAXEXT(tip, XFS_DATA_FORK))
                return -EINVAL;
 
        /*
@@ -1271,7 +1269,7 @@ xfs_swap_extents_check_format(
                if (XFS_IFORK_Q(ip) &&
                    XFS_BMAP_BMDR_SPACE(tip->i_df.if_broot) > XFS_IFORK_BOFF(ip))
                        return -EINVAL;
-               if (XFS_IFORK_NEXTENTS(tip, XFS_DATA_FORK) <=
+               if (tip->i_df.if_nextents <=
                    XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK))
                        return -EINVAL;
        }
@@ -1281,7 +1279,7 @@ xfs_swap_extents_check_format(
                if (XFS_IFORK_Q(tip) &&
                    XFS_BMAP_BMDR_SPACE(ip->i_df.if_broot) > XFS_IFORK_BOFF(tip))
                        return -EINVAL;
-               if (XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK) <=
+               if (ip->i_df.if_nextents <=
                    XFS_IFORK_MAXEXT(tip, XFS_DATA_FORK))
                        return -EINVAL;
        }
@@ -1434,15 +1432,15 @@ xfs_swap_extent_forks(
        /*
         * Count the number of extended attribute blocks
         */
-       if ( ((XFS_IFORK_Q(ip) != 0) && (ip->i_d.di_anextents > 0)) &&
-            (ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL)) {
+       if (XFS_IFORK_Q(ip) && ip->i_afp->if_nextents > 0 &&
+           ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL) {
                error = xfs_bmap_count_blocks(tp, ip, XFS_ATTR_FORK, &junk,
                                &aforkblks);
                if (error)
                        return error;
        }
-       if ( ((XFS_IFORK_Q(tip) != 0) && (tip->i_d.di_anextents > 0)) &&
-            (tip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL)) {
+       if (XFS_IFORK_Q(tip) && tip->i_afp->if_nextents > 0 &&
+           tip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL) {
                error = xfs_bmap_count_blocks(tp, tip, XFS_ATTR_FORK, &junk,
                                &taforkblks);
                if (error)
@@ -1475,7 +1473,6 @@ xfs_swap_extent_forks(
        ip->i_d.di_nblocks = tip->i_d.di_nblocks - taforkblks + aforkblks;
        tip->i_d.di_nblocks = tmp + taforkblks - aforkblks;
 
-       swap(ip->i_d.di_nextents, tip->i_d.di_nextents);
        swap(ip->i_d.di_format, tip->i_d.di_format);
 
        /*
@@ -1622,9 +1619,9 @@ xfs_swap_extents(
         * performed with log redo items!
         */
        if (xfs_sb_version_hasrmapbt(&mp->m_sb)) {
-               int             w       = XFS_DATA_FORK;
-               uint32_t        ipnext  = XFS_IFORK_NEXTENTS(ip, w);
-               uint32_t        tipnext = XFS_IFORK_NEXTENTS(tip, w);
+               int             w = XFS_DATA_FORK;
+               uint32_t        ipnext = ip->i_df.if_nextents;
+               uint32_t        tipnext = tip->i_df.if_nextents;
 
                /*
                 * Conceptually this shouldn't affect the shape of either bmbt,
@@ -1727,7 +1724,6 @@ xfs_swap_extents(
                ASSERT(ip->i_cformat == XFS_DINODE_FMT_EXTENTS);
                ASSERT(tip->i_cformat == XFS_DINODE_FMT_EXTENTS);
 
-               swap(ip->i_cnextents, tip->i_cnextents);
                swap(ip->i_cowfp, tip->i_cowfp);
 
                if (ip->i_cowfp && ip->i_cowfp->if_bytes)
index 4b8bdecc38635751e8476b1ed49db2950ebb8d19..403c90309a8ffe816f4066abac85aef727c4eeba 100644 (file)
@@ -1102,7 +1102,7 @@ xfs_dir_open(
         * certain to have the next operation be a read there.
         */
        mode = xfs_ilock_data_map_shared(ip);
-       if (ip->i_d.di_nextents > 0)
+       if (ip->i_df.if_nextents > 0)
                error = xfs_dir3_data_readahead(ip, 0, 0);
        xfs_iunlock(ip, mode);
        return error;
index 5a3a520b952887dd610cdbf6bf38e53ac641e23c..791d5d5e318cfa7d6bb0073869f789e4281e1857 100644 (file)
@@ -63,7 +63,6 @@ xfs_inode_alloc(
        memset(&ip->i_imap, 0, sizeof(struct xfs_imap));
        ip->i_afp = NULL;
        ip->i_cowfp = NULL;
-       ip->i_cnextents = 0;
        ip->i_cformat = XFS_DINODE_FMT_EXTENTS;
        memset(&ip->i_df, 0, sizeof(ip->i_df));
        ip->i_flags = 0;
index 7d3144dc99b72bf40f242ba23a99f23811e94884..1677c4e7207edec9ef3a034e4d893aba1ccf0ef5 100644 (file)
@@ -825,7 +825,7 @@ xfs_ialloc(
                inode->i_mode &= ~S_ISGID;
 
        ip->i_d.di_size = 0;
-       ip->i_d.di_nextents = 0;
+       ip->i_df.if_nextents = 0;
        ASSERT(ip->i_d.di_nblocks == 0);
 
        tv = current_time(inode);
@@ -919,7 +919,6 @@ xfs_ialloc(
         * Attribute fork settings for new inode.
         */
        ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
-       ip->i_d.di_anextents = 0;
 
        /*
         * Log the new values stuffed into the inode.
@@ -1686,7 +1685,7 @@ xfs_inactive_truncate(
        if (error)
                goto error_trans_cancel;
 
-       ASSERT(ip->i_d.di_nextents == 0);
+       ASSERT(ip->i_df.if_nextents == 0);
 
        error = xfs_trans_commit(tp);
        if (error)
@@ -1836,7 +1835,7 @@ xfs_inactive(
 
        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))
+            ip->i_df.if_nextents > 0 || ip->i_delayed_blks > 0))
                truncate = 1;
 
        error = xfs_qm_dqattach(ip);
@@ -1862,7 +1861,6 @@ xfs_inactive(
        }
 
        ASSERT(!ip->i_afp);
-       ASSERT(ip->i_d.di_anextents == 0);
        ASSERT(ip->i_d.di_forkoff == 0);
 
        /*
@@ -2731,8 +2729,7 @@ xfs_ifree(
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
        ASSERT(VFS_I(ip)->i_nlink == 0);
-       ASSERT(ip->i_d.di_nextents == 0);
-       ASSERT(ip->i_d.di_anextents == 0);
+       ASSERT(ip->i_df.if_nextents == 0);
        ASSERT(ip->i_d.di_size == 0 || !S_ISREG(VFS_I(ip)->i_mode));
        ASSERT(ip->i_d.di_nblocks == 0);
 
@@ -3628,7 +3625,7 @@ xfs_iflush(
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
        ASSERT(xfs_isiflocked(ip));
        ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
-              ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
+              ip->i_df.if_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
 
        *bpp = NULL;
 
@@ -3710,7 +3707,7 @@ xfs_iflush_int(
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
        ASSERT(xfs_isiflocked(ip));
        ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE ||
-              ip->i_d.di_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
+              ip->i_df.if_nextents > XFS_IFORK_MAXEXT(ip, XFS_DATA_FORK));
        ASSERT(iip != NULL && iip->ili_fields != 0);
 
        dip = xfs_buf_offset(bp, ip->i_imap.im_boffset);
@@ -3751,13 +3748,13 @@ xfs_iflush_int(
                        goto flush_out;
                }
        }
-       if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
+       if (XFS_TEST_ERROR(ip->i_df.if_nextents + xfs_ifork_nextents(ip->i_afp) >
                                ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5)) {
                xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
                        "%s: detected corrupt incore inode %Lu, "
                        "total extents = %d, nblocks = %Ld, ptr "PTR_FMT,
                        __func__, ip->i_ino,
-                       ip->i_d.di_nextents + ip->i_d.di_anextents,
+                       ip->i_df.if_nextents + xfs_ifork_nextents(ip->i_afp),
                        ip->i_d.di_nblocks, ip);
                goto flush_out;
        }
index ff846197941e43e68b8f22f3cde3372e2ef68222..24dae63ba16c05aa5284704b93f939842478c3e6 100644 (file)
@@ -57,7 +57,6 @@ typedef struct xfs_inode {
 
        struct xfs_icdinode     i_d;            /* most of ondisk inode */
 
-       xfs_extnum_t            i_cnextents;    /* # of extents in cow fork */
        unsigned int            i_cformat;      /* format of cow fork */
 
        /* VFS inode */
index cefa2484f0dbfb8d3a71715cc86d784deb5573c8..401ba26aeed7b84f3297391e57494675900ea94f 100644 (file)
@@ -39,7 +39,7 @@ xfs_inode_item_data_fork_size(
        switch (ip->i_d.di_format) {
        case XFS_DINODE_FMT_EXTENTS:
                if ((iip->ili_fields & XFS_ILOG_DEXT) &&
-                   ip->i_d.di_nextents > 0 &&
+                   ip->i_df.if_nextents > 0 &&
                    ip->i_df.if_bytes > 0) {
                        /* worst case, doesn't subtract delalloc extents */
                        *nbytes += XFS_IFORK_DSIZE(ip);
@@ -80,7 +80,7 @@ xfs_inode_item_attr_fork_size(
        switch (ip->i_d.di_aformat) {
        case XFS_DINODE_FMT_EXTENTS:
                if ((iip->ili_fields & XFS_ILOG_AEXT) &&
-                   ip->i_d.di_anextents > 0 &&
+                   ip->i_afp->if_nextents > 0 &&
                    ip->i_afp->if_bytes > 0) {
                        /* worst case, doesn't subtract unused space */
                        *nbytes += XFS_IFORK_ASIZE(ip);
@@ -148,7 +148,7 @@ xfs_inode_item_format_data_fork(
                        ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
 
                if ((iip->ili_fields & XFS_ILOG_DEXT) &&
-                   ip->i_d.di_nextents > 0 &&
+                   ip->i_df.if_nextents > 0 &&
                    ip->i_df.if_bytes > 0) {
                        struct xfs_bmbt_rec *p;
 
@@ -233,12 +233,12 @@ xfs_inode_item_format_attr_fork(
                        ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT);
 
                if ((iip->ili_fields & XFS_ILOG_AEXT) &&
-                   ip->i_d.di_anextents > 0 &&
+                   ip->i_afp->if_nextents > 0 &&
                    ip->i_afp->if_bytes > 0) {
                        struct xfs_bmbt_rec *p;
 
                        ASSERT(xfs_iext_count(ip->i_afp) ==
-                               ip->i_d.di_anextents);
+                               ip->i_afp->if_nextents);
 
                        p = xlog_prepare_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_EXT);
                        data_bytes = xfs_iextents_copy(ip, p, XFS_ATTR_FORK);
@@ -326,8 +326,8 @@ xfs_inode_to_log_dinode(
        to->di_size = from->di_size;
        to->di_nblocks = from->di_nblocks;
        to->di_extsize = from->di_extsize;
-       to->di_nextents = from->di_nextents;
-       to->di_anextents = from->di_anextents;
+       to->di_nextents = xfs_ifork_nextents(&ip->i_df);
+       to->di_anextents = xfs_ifork_nextents(ip->i_afp);
        to->di_forkoff = from->di_forkoff;
        to->di_aformat = from->di_aformat;
        to->di_dmevmask = from->di_dmevmask;
index 4ee0d13232f3f5162dc87ebc810b27c989adc5c2..7a71c03e9022bd085971440ea4dfbc681db62539 100644 (file)
@@ -1104,26 +1104,17 @@ xfs_fill_fsxattr(
        bool                    attr,
        struct fsxattr          *fa)
 {
+       struct xfs_ifork        *ifp = attr ? ip->i_afp : &ip->i_df;
+
        simple_fill_fsxattr(fa, xfs_ip2xflags(ip));
        fa->fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog;
        fa->fsx_cowextsize = ip->i_d.di_cowextsize <<
                        ip->i_mount->m_sb.sb_blocklog;
        fa->fsx_projid = ip->i_d.di_projid;
-
-       if (attr) {
-               if (ip->i_afp) {
-                       if (ip->i_afp->if_flags & XFS_IFEXTENTS)
-                               fa->fsx_nextents = xfs_iext_count(ip->i_afp);
-                       else
-                               fa->fsx_nextents = ip->i_d.di_anextents;
-               } else
-                       fa->fsx_nextents = 0;
-       } else {
-               if (ip->i_df.if_flags & XFS_IFEXTENTS)
-                       fa->fsx_nextents = xfs_iext_count(&ip->i_df);
-               else
-                       fa->fsx_nextents = ip->i_d.di_nextents;
-       }
+       if (ifp && (ifp->if_flags & XFS_IFEXTENTS))
+               fa->fsx_nextents = xfs_iext_count(ifp);
+       else
+               fa->fsx_nextents = xfs_ifork_nextents(ifp);
 }
 
 STATIC int
@@ -1211,7 +1202,7 @@ xfs_ioctl_setattr_xflags(
        uint64_t                di_flags2;
 
        /* Can't change realtime flag if any extents are allocated. */
-       if ((ip->i_d.di_nextents || ip->i_delayed_blks) &&
+       if ((ip->i_df.if_nextents || ip->i_delayed_blks) &&
            XFS_IS_REALTIME_INODE(ip) != (fa->fsx_xflags & FS_XFLAG_REALTIME))
                return -EINVAL;
 
@@ -1389,7 +1380,7 @@ xfs_ioctl_setattr_check_extsize(
        xfs_extlen_t            size;
        xfs_fsblock_t           extsize_fsb;
 
-       if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_d.di_nextents &&
+       if (S_ISREG(VFS_I(ip)->i_mode) && ip->i_df.if_nextents &&
            ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize))
                return -EINVAL;
 
index bb590a267a7f92a2a8ebf43592fd9aec4ca3e81f..b4fd918749e5f671c0c0306a3c96712bfe89d1bb 100644 (file)
@@ -1258,7 +1258,7 @@ xfs_xattr_iomap_begin(
        lockmode = xfs_ilock_attr_map_shared(ip);
 
        /* if there are no attribute fork or extents, return ENOENT */
-       if (!XFS_IFORK_Q(ip) || !ip->i_d.di_anextents) {
+       if (!XFS_IFORK_Q(ip) || !ip->i_afp->if_nextents) {
                error = -ENOENT;
                goto out_unlock;
        }
index 26a71237d70f64d06f1f54252fc12ad508808a2c..d66528fa365707fc9cfb4930d1cfb86218fdd829 100644 (file)
@@ -872,7 +872,7 @@ xfs_setattr_size(
        /*
         * Short circuit the truncate case for zero length files.
         */
-       if (newsize == 0 && oldsize == 0 && ip->i_d.di_nextents == 0) {
+       if (newsize == 0 && oldsize == 0 && ip->i_df.if_nextents == 0) {
                if (!(iattr->ia_valid & (ATTR_CTIME|ATTR_MTIME)))
                        return 0;
 
index ff2da28fed90e75751f378967fc123bfb90d8032..80da86c5703fbaf6b4c24e862a9db910a1e15d98 100644 (file)
@@ -104,9 +104,9 @@ xfs_bulkstat_one_int(
 
        buf->bs_xflags = xfs_ip2xflags(ip);
        buf->bs_extsize_blks = dic->di_extsize;
-       buf->bs_extents = dic->di_nextents;
+       buf->bs_extents = xfs_ifork_nextents(&ip->i_df);
        xfs_bulkstat_health(ip, buf);
-       buf->bs_aextents = dic->di_anextents;
+       buf->bs_aextents = xfs_ifork_nextents(ip->i_afp);
        buf->bs_forkoff = XFS_IFORK_BOFF(ip);
        buf->bs_version = XFS_BULKSTAT_VERSION_V5;
 
index 944486f2b287468c7a1ff79c6ab0859f8f65b768..9edf761eec739102b0dbbb5bdea1e77b7392d50c 100644 (file)
@@ -302,7 +302,7 @@ xfs_qm_scall_trunc_qfile(
                goto out_unlock;
        }
 
-       ASSERT(ip->i_d.di_nextents == 0);
+       ASSERT(ip->i_df.if_nextents == 0);
 
        xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
        error = xfs_trans_commit(tp);
index 38669e8272060fc1ce6b4a75b4fbf89ea9e5f810..b5d10ecb54743135f726d08fa753ae1f34a84e8a 100644 (file)
@@ -36,7 +36,7 @@ xfs_qm_fill_state(
        }
        tstate->flags |= QCI_SYSFILE;
        tstate->blocks = ip->i_d.di_nblocks;
-       tstate->nextents = ip->i_d.di_nextents;
+       tstate->nextents = ip->i_df.if_nextents;
        tstate->spc_timelimit = (u32)q->qi_btimelimit;
        tstate->ino_timelimit = (u32)q->qi_itimelimit;
        tstate->rt_spc_timelimit = (u32)q->qi_rtbtimelimit;
index 973441992b0840df06815f54af0b19182da96025..8cf2fcb509c12fbed1ac67474427a4964c2baf22 100644 (file)
@@ -384,7 +384,7 @@ xfs_inactive_symlink_rmt(
         * either 1 or 2 extents and that we can
         * free them all in one bunmapi call.
         */
-       ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2);
+       ASSERT(ip->i_df.if_nextents > 0 && ip->i_df.if_nextents <= 2);
 
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
        if (error)
index a4323a63438d80ba368e812391b8dfe2e00fdcc0..ba2ab69e1fc7db81820edc5c21790ac0627c7987 100644 (file)
@@ -1898,7 +1898,7 @@ DECLARE_EVENT_CLASS(xfs_swap_extent_class,
                __entry->which = which;
                __entry->ino = ip->i_ino;
                __entry->format = ip->i_d.di_format;
-               __entry->nex = ip->i_d.di_nextents;
+               __entry->nex = ip->i_df.if_nextents;
                __entry->broot_size = ip->i_df.if_broot_bytes;
                __entry->fork_off = XFS_IFORK_BOFF(ip);
        ),