forked from Minki/linux
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: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
3993baeb3c
commit
be51f8119c
@ -2760,6 +2760,7 @@ done:
|
||||
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
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user