Changes since last update:
- Fix some iomap locking problems - Don't allocate cow blocks when we're zeroing file data -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCgAGBQJamePeAAoJEPh/dxk0SrTryPgP/0sh8xcAFUHR0ad7D74nSp3o 1gjBi6Yl+i+hn5SZ/gkKPa5YFjTMaefcTV8rpZm3uPYbTf75TTscjKDDczFNEqoh CDKOeyfOchVSjhRI5ExElBh5ToxDgh+HMzzlmxk+olfWA+BXjJj2J2iLh871v9Ym hQl7xOYUDPu1xZz+jLhDLKG2Gd/R97ez2KZM43gKMAUsQ7eUbz6CtV73cFT+tNfP jjIe3xp6ohbJYJalMThbNcI2mOOssnCM8BHUDBJib7N4CXucJYTMpDAcGvNoFKul +K2Icyip1/6CS4LkWDpP29ayiH+sTbZk8/ipioe27hXXHGqKG84HQOBefRZmo4o0 CC64SoomuxQX6V7qL6hf0Sz82QQbl+ToSliZ97xXP5o84/OxhggZGqVdykTR2+DB 4POaJzRPmYJKPO4Q0yT2worB4oepAUrridJnaQE0y9F80xnLTvJxpD53atLCHulj Ht9NlvnvqndDYaYjQwvucOmdR9vCos3OjZCaXnYgL+EpbgZUvMeQoxuyBUBTdQeQ CNGq3EDssI75gD67sWeyFc+gOST259XofANw3mvlu3KS2/huviORJkDYdtzi2/LL gkCN9OW9CmXOaAiylE8dSAu98SAR+c83wmahMeBA2mq5vYrQU4rIDGYZi/Mulne4 tD7eW5nlvps9Fsvf58fd =T9nM -----END PGP SIGNATURE----- Merge tag 'xfs-4.16-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux Pull xfs fixes from Darrick Wong: - Fix some iomap locking problems - Don't allocate cow blocks when we're zeroing file data * tag 'xfs-4.16-fixes-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: xfs: don't block on the ilock for RWF_NOWAIT xfs: don't start out with the exclusive ilock for direct I/O xfs: don't allocate COW blocks for zeroing holes or unwritten extents
This commit is contained in:
commit
2d9b1d69c3
@ -955,15 +955,29 @@ static inline bool imap_needs_alloc(struct inode *inode,
|
||||
(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)
|
||||
{
|
||||
/*
|
||||
* COW writes will allocate delalloc space, so we need to make sure
|
||||
* to take the lock exclusively here.
|
||||
* COW writes may allocate delalloc space or convert unwritten COW
|
||||
* extents, so we need to make sure to take the lock exclusively here.
|
||||
*/
|
||||
if (xfs_is_reflink_inode(ip) && (flags & (IOMAP_WRITE | IOMAP_ZERO)))
|
||||
return true;
|
||||
if ((flags & IOMAP_DIRECT) && (flags & IOMAP_WRITE))
|
||||
|
||||
/*
|
||||
* Extents not yet cached requires exclusive access, don't block.
|
||||
* This is an opencoded xfs_ilock_data_map_shared() to cater for the
|
||||
* non-blocking behaviour.
|
||||
*/
|
||||
if (ip->i_d.di_format == XFS_DINODE_FMT_BTREE &&
|
||||
!(ip->i_df.if_flags & XFS_IFEXTENTS))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@ -993,16 +1007,18 @@ xfs_file_iomap_begin(
|
||||
return xfs_file_iomap_begin_delay(inode, offset, length, iomap);
|
||||
}
|
||||
|
||||
if (need_excl_ilock(ip, flags)) {
|
||||
if (need_excl_ilock(ip, flags))
|
||||
lockmode = XFS_ILOCK_EXCL;
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
} else {
|
||||
lockmode = xfs_ilock_data_map_shared(ip);
|
||||
}
|
||||
else
|
||||
lockmode = XFS_ILOCK_SHARED;
|
||||
|
||||
if ((flags & IOMAP_NOWAIT) && !(ip->i_df.if_flags & XFS_IFEXTENTS)) {
|
||||
error = -EAGAIN;
|
||||
goto out_unlock;
|
||||
if (flags & IOMAP_NOWAIT) {
|
||||
if (!(ip->i_df.if_flags & XFS_IFEXTENTS))
|
||||
return -EAGAIN;
|
||||
if (!xfs_ilock_nowait(ip, lockmode))
|
||||
return -EAGAIN;
|
||||
} else {
|
||||
xfs_ilock(ip, lockmode);
|
||||
}
|
||||
|
||||
ASSERT(offset <= mp->m_super->s_maxbytes);
|
||||
@ -1024,7 +1040,9 @@ xfs_file_iomap_begin(
|
||||
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) {
|
||||
/*
|
||||
* A reflinked inode will result in CoW alloc.
|
||||
|
Loading…
Reference in New Issue
Block a user