提交 172ed391 编写于 作者: C Christoph Hellwig 提交者: Darrick J. Wong

xfs: don't allocate COW blocks for zeroing holes or unwritten extents

The iomap zeroing interface is smart enough to skip zeroing holes or
unwritten extents.  Don't subvert this logic for reflink files.
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
上级 5b4c845e
...@@ -955,6 +955,13 @@ static inline bool imap_needs_alloc(struct inode *inode, ...@@ -955,6 +955,13 @@ static inline bool imap_needs_alloc(struct inode *inode,
(IS_DAX(inode) && imap->br_state == XFS_EXT_UNWRITTEN); (IS_DAX(inode) && imap->br_state == XFS_EXT_UNWRITTEN);
} }
static inline bool needs_cow_for_zeroing(struct xfs_bmbt_irec *imap, int nimaps)
{
return nimaps &&
imap->br_startblock != HOLESTARTBLOCK &&
imap->br_state != XFS_EXT_UNWRITTEN;
}
static inline bool need_excl_ilock(struct xfs_inode *ip, unsigned flags) static inline bool need_excl_ilock(struct xfs_inode *ip, unsigned flags)
{ {
/* /*
...@@ -1024,7 +1031,9 @@ xfs_file_iomap_begin( ...@@ -1024,7 +1031,9 @@ xfs_file_iomap_begin(
goto out_unlock; goto out_unlock;
} }
if ((flags & (IOMAP_WRITE | IOMAP_ZERO)) && xfs_is_reflink_inode(ip)) { if (xfs_is_reflink_inode(ip) &&
((flags & IOMAP_WRITE) ||
((flags & IOMAP_ZERO) && needs_cow_for_zeroing(&imap, nimaps)))) {
if (flags & IOMAP_DIRECT) { if (flags & IOMAP_DIRECT) {
/* /*
* A reflinked inode will result in CoW alloc. * A reflinked inode will result in CoW alloc.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册