mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
xfs: factor out a xfs_bmap_is_real_extent helper
This checks for all the non-normal extent types, including handling both encodings of delayed allocations. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
696a562072
commit
9c4f29d391
@ -171,6 +171,18 @@ static inline int xfs_bmapi_whichfork(int bmapi_flags)
|
||||
{ BMAP_COWFORK, "COW" }
|
||||
|
||||
|
||||
/*
|
||||
* Return true if the extent is a real, allocated extent, or false if it is a
|
||||
* delayed allocation, and unwritten extent or a hole.
|
||||
*/
|
||||
static inline bool xfs_bmap_is_real_extent(struct xfs_bmbt_irec *irec)
|
||||
{
|
||||
return irec->br_state != XFS_EXT_UNWRITTEN &&
|
||||
irec->br_startblock != HOLESTARTBLOCK &&
|
||||
irec->br_startblock != DELAYSTARTBLOCK &&
|
||||
!isnullstartblock(irec->br_startblock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This macro is used to determine how many extents will be shifted
|
||||
* in one write transaction. We could require two splits,
|
||||
|
@ -1276,9 +1276,7 @@ xfs_get_blocks(
|
||||
* For unwritten extents do not report a disk address in the buffered
|
||||
* read case (treat as if we're reading into a hole).
|
||||
*/
|
||||
if (imap.br_startblock != HOLESTARTBLOCK &&
|
||||
imap.br_startblock != DELAYSTARTBLOCK &&
|
||||
!ISUNWRITTEN(&imap))
|
||||
if (xfs_bmap_is_real_extent(&imap))
|
||||
xfs_map_buffer(inode, bh_result, &imap, offset);
|
||||
|
||||
/*
|
||||
|
@ -448,10 +448,9 @@ xfs_getbmap_adjust_shared(
|
||||
next_map->br_blockcount = 0;
|
||||
|
||||
/* Only written data blocks can be shared. */
|
||||
if (!xfs_is_reflink_inode(ip) || whichfork != XFS_DATA_FORK ||
|
||||
map->br_startblock == DELAYSTARTBLOCK ||
|
||||
map->br_startblock == HOLESTARTBLOCK ||
|
||||
ISUNWRITTEN(map))
|
||||
if (!xfs_is_reflink_inode(ip) ||
|
||||
whichfork != XFS_DATA_FORK ||
|
||||
!xfs_bmap_is_real_extent(map))
|
||||
return 0;
|
||||
|
||||
agno = XFS_FSB_TO_AGNO(mp, map->br_startblock);
|
||||
|
@ -206,11 +206,7 @@ xfs_reflink_trim_around_shared(
|
||||
int error = 0;
|
||||
|
||||
/* Holes, unwritten, and delalloc extents cannot be shared */
|
||||
if (!xfs_is_reflink_inode(ip) ||
|
||||
ISUNWRITTEN(irec) ||
|
||||
irec->br_startblock == HOLESTARTBLOCK ||
|
||||
irec->br_startblock == DELAYSTARTBLOCK ||
|
||||
isnullstartblock(irec->br_startblock)) {
|
||||
if (!xfs_is_reflink_inode(ip) || !xfs_bmap_is_real_extent(irec)) {
|
||||
*shared = false;
|
||||
return 0;
|
||||
}
|
||||
@ -1045,12 +1041,12 @@ xfs_reflink_remap_extent(
|
||||
xfs_off_t new_isize)
|
||||
{
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
bool real_extent = xfs_bmap_is_real_extent(irec);
|
||||
struct xfs_trans *tp;
|
||||
xfs_fsblock_t firstfsb;
|
||||
unsigned int resblks;
|
||||
struct xfs_defer_ops dfops;
|
||||
struct xfs_bmbt_irec uirec;
|
||||
bool real_extent;
|
||||
xfs_filblks_t rlen;
|
||||
xfs_filblks_t unmap_len;
|
||||
xfs_off_t newlen;
|
||||
@ -1059,11 +1055,6 @@ xfs_reflink_remap_extent(
|
||||
unmap_len = irec->br_startoff + irec->br_blockcount - destoff;
|
||||
trace_xfs_reflink_punch_range(ip, destoff, unmap_len);
|
||||
|
||||
/* Only remap normal extents. */
|
||||
real_extent = (irec->br_startblock != HOLESTARTBLOCK &&
|
||||
irec->br_startblock != DELAYSTARTBLOCK &&
|
||||
!ISUNWRITTEN(irec));
|
||||
|
||||
/* No reflinking if we're low on space */
|
||||
if (real_extent) {
|
||||
error = xfs_reflink_ag_has_free_space(mp,
|
||||
@ -1359,9 +1350,7 @@ xfs_reflink_dirty_extents(
|
||||
goto out;
|
||||
if (nmaps == 0)
|
||||
break;
|
||||
if (map[0].br_startblock == HOLESTARTBLOCK ||
|
||||
map[0].br_startblock == DELAYSTARTBLOCK ||
|
||||
ISUNWRITTEN(&map[0]))
|
||||
if (!xfs_bmap_is_real_extent(&map[0]))
|
||||
goto next;
|
||||
|
||||
map[1] = map[0];
|
||||
@ -1435,9 +1424,7 @@ xfs_reflink_clear_inode_flag(
|
||||
return error;
|
||||
if (nmaps == 0)
|
||||
break;
|
||||
if (map.br_startblock == HOLESTARTBLOCK ||
|
||||
map.br_startblock == DELAYSTARTBLOCK ||
|
||||
ISUNWRITTEN(&map))
|
||||
if (!xfs_bmap_is_real_extent(&map))
|
||||
goto next;
|
||||
|
||||
agno = XFS_FSB_TO_AGNO(mp, map.br_startblock);
|
||||
|
Loading…
Reference in New Issue
Block a user