Commit b2197a36 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: remove XFS_IFEXTENTS



The in-memory XFS_IFEXTENTS is now only used to check if an inode with
extents still needs the extents to be read into memory before doing
operations that need the extent map.  Add a new xfs_need_iread_extents
helper that returns true for btree format forks that do not have any
entries in the in-memory extent btree, and use that instead of checking
the XFS_IFEXTENTS flag.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 0779f4a6
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -651,10 +651,8 @@ xfs_attr_shortform_create(
	trace_xfs_attr_sf_create(args);

	ASSERT(ifp->if_bytes == 0);
	if (ifp->if_format == XFS_DINODE_FMT_EXTENTS) {
		ifp->if_flags &= ~XFS_IFEXTENTS;	/* just in case */
	if (ifp->if_format == XFS_DINODE_FMT_EXTENTS)
		ifp->if_format = XFS_DINODE_FMT_LOCAL;
	}
	xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
	hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
	memset(hdr, 0, sizeof(*hdr));
+2 −12
Original line number Diff line number Diff line
@@ -605,7 +605,7 @@ xfs_bmap_btree_to_extents(

	ASSERT(cur);
	ASSERT(whichfork != XFS_COW_FORK);
	ASSERT(ifp->if_flags & XFS_IFEXTENTS);
	ASSERT(!xfs_need_iread_extents(ifp));
	ASSERT(ifp->if_format == XFS_DINODE_FMT_BTREE);
	ASSERT(be16_to_cpu(rblock->bb_level) == 1);
	ASSERT(be16_to_cpu(rblock->bb_numrecs) == 1);
@@ -805,7 +805,6 @@ xfs_bmap_local_to_extents_empty(
	ASSERT(ifp->if_nextents == 0);

	xfs_bmap_forkoff_reset(ip, whichfork);
	ifp->if_flags |= XFS_IFEXTENTS;
	ifp->if_u1.if_root = NULL;
	ifp->if_height = 0;
	ifp->if_format = XFS_DINODE_FMT_EXTENTS;
@@ -849,7 +848,6 @@ xfs_bmap_local_to_extents(

	flags = 0;
	error = 0;
	ASSERT(!(ifp->if_flags & XFS_IFEXTENTS));
	memset(&args, 0, sizeof(args));
	args.tp = tp;
	args.mp = ip->i_mount;
@@ -1098,7 +1096,6 @@ xfs_bmap_add_attrfork(
	ASSERT(ip->i_afp == NULL);

	ip->i_afp = xfs_ifork_alloc(XFS_DINODE_FMT_EXTENTS, 0);
	ip->i_afp->if_flags = XFS_IFEXTENTS;
	logflags = 0;
	switch (ip->i_df.if_format) {
	case XFS_DINODE_FMT_LOCAL:
@@ -1224,16 +1221,11 @@ xfs_iread_extents(
	struct xfs_btree_cur	*cur;
	int			error;

	if (ifp->if_flags & XFS_IFEXTENTS)
	if (!xfs_need_iread_extents(ifp))
		return 0;

	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));

	if (XFS_IS_CORRUPT(mp, ifp->if_format != XFS_DINODE_FMT_BTREE)) {
		error = -EFSCORRUPTED;
		goto out;
	}

	ir.loaded = 0;
	xfs_iext_first(ifp, &ir.icur);
	cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
@@ -1248,8 +1240,6 @@ xfs_iread_extents(
		goto out;
	}
	ASSERT(ir.loaded == xfs_iext_count(ifp));

	ifp->if_flags |= XFS_IFEXTENTS;
	return 0;
out:
	xfs_iext_destroy(ifp);
+0 −1
Original line number Diff line number Diff line
@@ -827,7 +827,6 @@ xfs_dir2_sf_create(
	 * convert it to local format.
	 */
	if (dp->i_df.if_format == XFS_DINODE_FMT_EXTENTS) {
		dp->i_df.if_flags &= ~XFS_IFEXTENTS;	/* just in case */
		dp->i_df.if_format = XFS_DINODE_FMT_LOCAL;
		xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE);
	}
+0 −6
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ xfs_init_local_fork(
	}

	ifp->if_bytes = size;
	ifp->if_flags &= ~XFS_IFEXTENTS;
}

/*
@@ -150,7 +149,6 @@ xfs_iformat_extents(
			xfs_iext_next(ifp, &icur);
		}
	}
	ifp->if_flags |= XFS_IFEXTENTS;
	return 0;
}

@@ -212,7 +210,6 @@ xfs_iformat_btree(
	 */
	xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork),
			 ifp->if_broot, size);
	ifp->if_flags &= ~XFS_IFEXTENTS;

	ifp->if_bytes = 0;
	ifp->if_u1.if_root = NULL;
@@ -622,8 +619,6 @@ xfs_iflush_fork(
		break;

	case XFS_DINODE_FMT_EXTENTS:
		ASSERT((ifp->if_flags & XFS_IFEXTENTS) ||
		       !(iip->ili_fields & extflag[whichfork]));
		if ((iip->ili_fields & extflag[whichfork]) &&
		    (ifp->if_bytes > 0)) {
			ASSERT(ifp->if_nextents > 0);
@@ -683,7 +678,6 @@ xfs_ifork_init_cow(

	ip->i_cowfp = kmem_cache_zalloc(xfs_ifork_zone,
				       GFP_NOFS | __GFP_NOFAIL);
	ip->i_cowfp->if_flags = XFS_IFEXTENTS;
	ip->i_cowfp->if_format = XFS_DINODE_FMT_EXTENTS;
}

+6 −6
Original line number Diff line number Diff line
@@ -22,16 +22,10 @@ struct xfs_ifork {
		char		*if_data;	/* inline file data */
	} if_u1;
	short			if_broot_bytes;	/* bytes allocated for root */
	unsigned char		if_flags;	/* per-fork flags */
	int8_t			if_format;	/* format of this fork */
	xfs_extnum_t		if_nextents;	/* # of extents in this fork */
};

/*
 * Per-fork incore inode flags.
 */
#define	XFS_IFEXTENTS	0x02	/* All extent pointers are read in */

/*
 * Worst-case increase in the fork extent count when we're adding a single
 * extent to a fork and there's no possibility of splitting an existing mapping.
@@ -236,4 +230,10 @@ int xfs_ifork_verify_local_attr(struct xfs_inode *ip);
int xfs_iext_count_may_overflow(struct xfs_inode *ip, int whichfork,
		int nr_to_add);

/* returns true if the fork has extents but they are not read in yet. */
static inline bool xfs_need_iread_extents(struct xfs_ifork *ifp)
{
	return ifp->if_format == XFS_DINODE_FMT_BTREE && ifp->if_height == 0;
}

#endif	/* __XFS_INODE_FORK_H__ */
Loading