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

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
...@@ -2760,6 +2760,7 @@ xfs_bmap_add_extent_unwritten_real( ...@@ -2760,6 +2760,7 @@ xfs_bmap_add_extent_unwritten_real(
STATIC void STATIC void
xfs_bmap_add_extent_hole_delay( xfs_bmap_add_extent_hole_delay(
xfs_inode_t *ip, /* incore inode pointer */ xfs_inode_t *ip, /* incore inode pointer */
int whichfork,
xfs_extnum_t *idx, /* extent number to update/insert */ xfs_extnum_t *idx, /* extent number to update/insert */
xfs_bmbt_irec_t *new) /* new data to add to file extents */ xfs_bmbt_irec_t *new) /* new data to add to file extents */
{ {
...@@ -2771,8 +2772,10 @@ xfs_bmap_add_extent_hole_delay( ...@@ -2771,8 +2772,10 @@ xfs_bmap_add_extent_hole_delay(
int state; /* state bits, accessed thru macros */ int state; /* state bits, accessed thru macros */
xfs_filblks_t temp=0; /* temp for indirect calculations */ 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; state = 0;
if (whichfork == XFS_COW_FORK)
state |= BMAP_COWFORK;
ASSERT(isnullstartblock(new->br_startblock)); ASSERT(isnullstartblock(new->br_startblock));
/* /*
...@@ -2790,7 +2793,7 @@ xfs_bmap_add_extent_hole_delay( ...@@ -2790,7 +2793,7 @@ xfs_bmap_add_extent_hole_delay(
* Check and set flags if the current (right) segment exists. * 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 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; state |= BMAP_RIGHT_VALID;
xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right);
...@@ -4154,6 +4157,7 @@ xfs_bmapi_read( ...@@ -4154,6 +4157,7 @@ xfs_bmapi_read(
int int
xfs_bmapi_reserve_delalloc( xfs_bmapi_reserve_delalloc(
struct xfs_inode *ip, struct xfs_inode *ip,
int whichfork,
xfs_fileoff_t aoff, xfs_fileoff_t aoff,
xfs_filblks_t len, xfs_filblks_t len,
struct xfs_bmbt_irec *got, struct xfs_bmbt_irec *got,
...@@ -4162,7 +4166,7 @@ xfs_bmapi_reserve_delalloc( ...@@ -4162,7 +4166,7 @@ xfs_bmapi_reserve_delalloc(
int eof) int eof)
{ {
struct xfs_mount *mp = ip->i_mount; 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 alen;
xfs_extlen_t indlen; xfs_extlen_t indlen;
char rt = XFS_IS_REALTIME_INODE(ip); char rt = XFS_IS_REALTIME_INODE(ip);
...@@ -4221,7 +4225,7 @@ xfs_bmapi_reserve_delalloc( ...@@ -4221,7 +4225,7 @@ xfs_bmapi_reserve_delalloc(
got->br_startblock = nullstartblock(indlen); got->br_startblock = nullstartblock(indlen);
got->br_blockcount = alen; got->br_blockcount = alen;
got->br_state = XFS_EXT_NORM; 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 * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay
......
...@@ -234,9 +234,10 @@ struct xfs_bmbt_rec_host * ...@@ -234,9 +234,10 @@ struct xfs_bmbt_rec_host *
xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno, xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno,
int fork, int *eofp, xfs_extnum_t *lastxp, int fork, int *eofp, xfs_extnum_t *lastxp,
struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp); struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp);
int xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, xfs_fileoff_t aoff, int xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, int whichfork,
xfs_filblks_t len, struct xfs_bmbt_irec *got, xfs_fileoff_t aoff, xfs_filblks_t len,
struct xfs_bmbt_irec *prev, xfs_extnum_t *lastx, int eof); struct xfs_bmbt_irec *got, struct xfs_bmbt_irec *prev,
xfs_extnum_t *lastx, int eof);
enum xfs_bmap_intent_type { enum xfs_bmap_intent_type {
XFS_BMAP_MAP = 1, XFS_BMAP_MAP = 1,
......
...@@ -609,7 +609,7 @@ xfs_file_iomap_begin_delay( ...@@ -609,7 +609,7 @@ xfs_file_iomap_begin_delay(
} }
retry: 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, end_fsb - offset_fsb, &got,
&prev, &idx, eof); &prev, &idx, eof);
switch (error) { switch (error) {
......
...@@ -3329,16 +3329,17 @@ DEFINE_INODE_ERROR_EVENT(xfs_reflink_dirty_page_error); ...@@ -3329,16 +3329,17 @@ DEFINE_INODE_ERROR_EVENT(xfs_reflink_dirty_page_error);
/* copy on write */ /* copy on write */
DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_around_shared); 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_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_RW_EVENT(xfs_reflink_allocate_cow_range);
DEFINE_INODE_IREC_EVENT(xfs_reflink_allocate_cow_extent); DEFINE_INODE_IREC_EVENT(xfs_reflink_allocate_cow_extent);
DEFINE_INODE_IREC_EVENT(xfs_reflink_bounce_dio_write); DEFINE_INODE_IREC_EVENT(xfs_reflink_bounce_dio_write);
DEFINE_IOMAP_EVENT(xfs_reflink_find_cow_mapping); DEFINE_IOMAP_EVENT(xfs_reflink_find_cow_mapping);
DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_irec); 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_cancel_cow_range);
DEFINE_SIMPLE_IO_EVENT(xfs_reflink_end_cow); DEFINE_SIMPLE_IO_EVENT(xfs_reflink_end_cow);
...@@ -3346,7 +3347,6 @@ DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap); ...@@ -3346,7 +3347,6 @@ DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap);
DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap_piece); 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_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_allocate_cow_range_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_cow_range_error); DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_cow_range_error);
DEFINE_INODE_ERROR_EVENT(xfs_reflink_end_cow_error); DEFINE_INODE_ERROR_EVENT(xfs_reflink_end_cow_error);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment