Re: [PATCH 4/6] xfs: move the per-fork nextents fields into struct xfs_ifork

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sunday 10 May 2020 12:54:02 PM IST Christoph Hellwig wrote:
> There are thee number of extents counters, one for each of the forks,

... three number of ....

The patch itself looks good to me.

Reviewed-by: Chandan Babu R <chandanrlinux@xxxxxxxxx>

> 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@xxxxxx>
> ---
>  fs/xfs/libxfs/xfs_attr.c       |   4 +-
>  fs/xfs/libxfs/xfs_attr_leaf.c  |   1 -
>  fs/xfs/libxfs/xfs_bmap.c       | 126 ++++++++++++++-------------------
>  fs/xfs/libxfs/xfs_dir2_block.c |   2 +-
>  fs/xfs/libxfs/xfs_inode_buf.c  |   6 +-
>  fs/xfs/libxfs/xfs_inode_buf.h  |   2 -
>  fs/xfs/libxfs/xfs_inode_fork.c |  12 ++--
>  fs/xfs/libxfs/xfs_inode_fork.h |  20 +++---
>  fs/xfs/scrub/bmap.c            |   3 +-
>  fs/xfs/scrub/parent.c          |   2 +-
>  fs/xfs/xfs_bmap_util.c         |  28 ++++----
>  fs/xfs/xfs_file.c              |   2 +-
>  fs/xfs/xfs_icache.c            |   1 -
>  fs/xfs/xfs_inode.c             |  19 +++--
>  fs/xfs/xfs_inode.h             |   1 -
>  fs/xfs/xfs_inode_item.c        |  14 ++--
>  fs/xfs/xfs_ioctl.c             |  25 +++----
>  fs/xfs/xfs_iomap.c             |   2 +-
>  fs/xfs/xfs_iops.c              |   2 +-
>  fs/xfs/xfs_itable.c            |   4 +-
>  fs/xfs/xfs_qm_syscalls.c       |   2 +-
>  fs/xfs/xfs_quotaops.c          |   2 +-
>  fs/xfs/xfs_symlink.c           |   2 +-
>  fs/xfs/xfs_trace.h             |   2 +-
>  24 files changed, 122 insertions(+), 162 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
> index e4fe3dca9883b..1b01675e9c80b 100644
> --- a/fs/xfs/libxfs/xfs_attr.c
> +++ b/fs/xfs/libxfs/xfs_attr.c
> @@ -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).
> diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
> index 863444e2dda7e..64b172180c42c 100644
> --- a/fs/xfs/libxfs/xfs_attr_leaf.c
> +++ b/fs/xfs/libxfs/xfs_attr_leaf.c
> @@ -723,7 +723,6 @@ xfs_attr_fork_remove(
>  	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);
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 34518a6dc7376..c1136be49abeb 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -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);
> diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c
> index 1dbf2f980a26a..5b59d3f7746b3 100644
> --- a/fs/xfs/libxfs/xfs_dir2_block.c
> +++ b/fs/xfs/libxfs/xfs_dir2_block.c
> @@ -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.
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c
> index 5547bbb3cf945..a374e2a81e764 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.c
> +++ b/fs/xfs/libxfs/xfs_inode_buf.c
> @@ -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);
> diff --git a/fs/xfs/libxfs/xfs_inode_buf.h b/fs/xfs/libxfs/xfs_inode_buf.h
> index e4cbcaf62a32b..fecccfb26463c 100644
> --- a/fs/xfs/libxfs/xfs_inode_buf.h
> +++ b/fs/xfs/libxfs/xfs_inode_buf.h
> @@ -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 */
> diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c
> index 2fe325e38fd88..195da3552c5b5 100644
> --- a/fs/xfs/libxfs/xfs_inode_fork.c
> +++ b/fs/xfs/libxfs/xfs_inode_fork.c
> @@ -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,8 @@ xfs_iformat_data_fork(
>  	struct inode		*inode = VFS_I(ip);
>  	int			error;
>  
> +	ip->i_df.if_nextents = be32_to_cpu(dip->di_nextents);
> +
>  	switch (inode->i_mode & S_IFMT) {
>  	case S_IFIFO:
>  	case S_IFCHR:
> @@ -282,6 +283,8 @@ xfs_iformat_attr_fork(
>  	int			error = 0;
>  
>  	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 +620,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 +679,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. */
> diff --git a/fs/xfs/libxfs/xfs_inode_fork.h b/fs/xfs/libxfs/xfs_inode_fork.h
> index f46a8c1db5964..a69d425fe68df 100644
> --- a/fs/xfs/libxfs/xfs_inode_fork.h
> +++ b/fs/xfs/libxfs/xfs_inode_fork.h
> @@ -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 *);
> diff --git a/fs/xfs/scrub/bmap.c b/fs/xfs/scrub/bmap.c
> index 283424d6d2bb6..157f72efec5e9 100644
> --- a/fs/xfs/scrub/bmap.c
> +++ b/fs/xfs/scrub/bmap.c
> @@ -566,6 +566,7 @@ xchk_bmap_check_rmaps(
>  	struct xfs_scrub	*sc,
>  	int			whichfork)
>  {
> +	struct xfs_ifork	*ifp = XFS_IFORK_PTR(sc->ip, whichfork);
>  	loff_t			size;
>  	xfs_agnumber_t		agno;
>  	int			error;
> @@ -598,7 +599,7 @@ xchk_bmap_check_rmaps(
>  		break;
>  	}
>  	if (XFS_IFORK_FORMAT(sc->ip, whichfork) != XFS_DINODE_FMT_BTREE &&
> -	    (size == 0 || XFS_IFORK_NEXTENTS(sc->ip, whichfork) > 0))
> +	    (size == 0 || ifp->if_nextents > 0))
>  		return 0;
>  
>  	for (agno = 0; agno < sc->mp->m_sb.sb_agcount; agno++) {
> diff --git a/fs/xfs/scrub/parent.c b/fs/xfs/scrub/parent.c
> index 5705adc43a75f..855aa8bcab64b 100644
> --- a/fs/xfs/scrub/parent.c
> +++ b/fs/xfs/scrub/parent.c
> @@ -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)
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index cc23a3e23e2d1..4f277a6253b8d 100644
> --- a/fs/xfs/xfs_bmap_util.c
> +++ b/fs/xfs/xfs_bmap_util.c
> @@ -1220,7 +1220,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;
>  
>  	/*
> @@ -1241,14 +1241,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;
>  
>  	/*
> @@ -1264,7 +1262,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;
>  	}
> @@ -1274,7 +1272,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;
>  	}
> @@ -1427,15 +1425,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)
> @@ -1468,7 +1466,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);
>  
>  	/*
> @@ -1615,9 +1612,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,
> @@ -1720,7 +1717,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)
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 4b8bdecc38635..403c90309a8ff 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -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;
> diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> index 5a3a520b95288..791d5d5e318cf 100644
> --- a/fs/xfs/xfs_icache.c
> +++ b/fs/xfs/xfs_icache.c
> @@ -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;
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 7d3144dc99b72..1677c4e7207ed 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -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;
>  	}
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index ff846197941e4..24dae63ba16c0 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -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 */
> diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c
> index cefa2484f0dbf..401ba26aeed7b 100644
> --- a/fs/xfs/xfs_inode_item.c
> +++ b/fs/xfs/xfs_inode_item.c
> @@ -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;
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index 4ee0d13232f3f..7a71c03e9022b 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -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;
>  
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index bb590a267a7f9..b4fd918749e5f 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -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;
>  	}
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index 26a71237d70f6..d66528fa36570 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -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;
>  
> diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
> index ff2da28fed90e..80da86c5703fb 100644
> --- a/fs/xfs/xfs_itable.c
> +++ b/fs/xfs/xfs_itable.c
> @@ -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;
>  
> diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c
> index 944486f2b2874..9edf761eec739 100644
> --- a/fs/xfs/xfs_qm_syscalls.c
> +++ b/fs/xfs/xfs_qm_syscalls.c
> @@ -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);
> diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c
> index 38669e8272060..b5d10ecb54743 100644
> --- a/fs/xfs/xfs_quotaops.c
> +++ b/fs/xfs/xfs_quotaops.c
> @@ -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;
> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
> index 973441992b084..8cf2fcb509c12 100644
> --- a/fs/xfs/xfs_symlink.c
> +++ b/fs/xfs/xfs_symlink.c
> @@ -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)
> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
> index a4323a63438d8..ba2ab69e1fc7d 100644
> --- a/fs/xfs/xfs_trace.h
> +++ b/fs/xfs/xfs_trace.h
> @@ -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);
>  	),
> 


-- 
chandan






[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux