Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be51f811 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: support bmapping delalloc extents in the CoW fork



Allow the creation of delayed allocation extents in the CoW fork.  In
a subsequent patch we'll wire up iomap_begin to actually do this via
reflink helper functions.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 3993baeb
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -2760,6 +2760,7 @@ xfs_bmap_add_extent_unwritten_real(
STATIC void
xfs_bmap_add_extent_hole_delay(
	xfs_inode_t		*ip,	/* incore inode pointer */
	int			whichfork,
	xfs_extnum_t		*idx,	/* extent number to update/insert */
	xfs_bmbt_irec_t		*new)	/* new data to add to file extents */
{
@@ -2771,8 +2772,10 @@ xfs_bmap_add_extent_hole_delay(
	int			state;  /* state bits, accessed thru macros */
	xfs_filblks_t		temp=0;	/* temp for indirect calculations */

	ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
	ifp = XFS_IFORK_PTR(ip, whichfork);
	state = 0;
	if (whichfork == XFS_COW_FORK)
		state |= BMAP_COWFORK;
	ASSERT(isnullstartblock(new->br_startblock));

	/*
@@ -2790,7 +2793,7 @@ xfs_bmap_add_extent_hole_delay(
	 * Check and set flags if the current (right) segment exists.
	 * If it doesn't exist, we're converting the hole at end-of-file.
	 */
	if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) {
	if (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) {
		state |= BMAP_RIGHT_VALID;
		xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right);

@@ -4154,6 +4157,7 @@ xfs_bmapi_read(
int
xfs_bmapi_reserve_delalloc(
	struct xfs_inode	*ip,
	int			whichfork,
	xfs_fileoff_t		aoff,
	xfs_filblks_t		len,
	struct xfs_bmbt_irec	*got,
@@ -4162,7 +4166,7 @@ xfs_bmapi_reserve_delalloc(
	int			eof)
{
	struct xfs_mount	*mp = ip->i_mount;
	struct xfs_ifork	*ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
	struct xfs_ifork	*ifp = XFS_IFORK_PTR(ip, whichfork);
	xfs_extlen_t		alen;
	xfs_extlen_t		indlen;
	char			rt = XFS_IS_REALTIME_INODE(ip);
@@ -4221,7 +4225,7 @@ xfs_bmapi_reserve_delalloc(
	got->br_startblock = nullstartblock(indlen);
	got->br_blockcount = alen;
	got->br_state = XFS_EXT_NORM;
	xfs_bmap_add_extent_hole_delay(ip, lastx, got);
	xfs_bmap_add_extent_hole_delay(ip, whichfork, lastx, got);

	/*
	 * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay
+4 −3
Original line number Diff line number Diff line
@@ -234,9 +234,10 @@ struct xfs_bmbt_rec_host *
	xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno,
		int fork, int *eofp, xfs_extnum_t *lastxp,
		struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp);
int	xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, xfs_fileoff_t aoff,
		xfs_filblks_t len, struct xfs_bmbt_irec *got,
		struct xfs_bmbt_irec *prev, xfs_extnum_t *lastx, int eof);
int	xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, int whichfork,
		xfs_fileoff_t aoff, xfs_filblks_t len,
		struct xfs_bmbt_irec *got, struct xfs_bmbt_irec *prev,
		xfs_extnum_t *lastx, int eof);

enum xfs_bmap_intent_type {
	XFS_BMAP_MAP = 1,
+1 −1
Original line number Diff line number Diff line
@@ -609,7 +609,7 @@ xfs_file_iomap_begin_delay(
	}

retry:
	error = xfs_bmapi_reserve_delalloc(ip, offset_fsb,
	error = xfs_bmapi_reserve_delalloc(ip, XFS_DATA_FORK, offset_fsb,
			end_fsb - offset_fsb, &got,
			&prev, &idx, eof);
	switch (error) {
+3 −3
Original line number Diff line number Diff line
@@ -3329,16 +3329,17 @@ DEFINE_INODE_ERROR_EVENT(xfs_reflink_dirty_page_error);

/* copy on write */
DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_around_shared);
DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_alloc);
DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_found);
DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_enospc);

DEFINE_RW_EVENT(xfs_reflink_reserve_cow_range);
DEFINE_INODE_IREC_EVENT(xfs_reflink_reserve_cow_extent);
DEFINE_RW_EVENT(xfs_reflink_allocate_cow_range);
DEFINE_INODE_IREC_EVENT(xfs_reflink_allocate_cow_extent);

DEFINE_INODE_IREC_EVENT(xfs_reflink_bounce_dio_write);
DEFINE_IOMAP_EVENT(xfs_reflink_find_cow_mapping);
DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_irec);
DEFINE_SIMPLE_IO_EVENT(xfs_iomap_cow_delay);

DEFINE_SIMPLE_IO_EVENT(xfs_reflink_cancel_cow_range);
DEFINE_SIMPLE_IO_EVENT(xfs_reflink_end_cow);
@@ -3346,7 +3347,6 @@ DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap);
DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap_piece);

DEFINE_INODE_ERROR_EVENT(xfs_reflink_reserve_cow_range_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_reserve_cow_extent_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_allocate_cow_range_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_cow_range_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_end_cow_error);