|
@@ -31,7 +31,8 @@
|
|
int
|
|
int
|
|
xfs_break_layouts(
|
|
xfs_break_layouts(
|
|
struct inode *inode,
|
|
struct inode *inode,
|
|
- uint *iolock)
|
|
|
|
|
|
+ uint *iolock,
|
|
|
|
+ bool with_imutex)
|
|
{
|
|
{
|
|
struct xfs_inode *ip = XFS_I(inode);
|
|
struct xfs_inode *ip = XFS_I(inode);
|
|
int error;
|
|
int error;
|
|
@@ -40,8 +41,12 @@ xfs_break_layouts(
|
|
|
|
|
|
while ((error = break_layout(inode, false) == -EWOULDBLOCK)) {
|
|
while ((error = break_layout(inode, false) == -EWOULDBLOCK)) {
|
|
xfs_iunlock(ip, *iolock);
|
|
xfs_iunlock(ip, *iolock);
|
|
|
|
+ if (with_imutex && (*iolock & XFS_IOLOCK_EXCL))
|
|
|
|
+ mutex_unlock(&inode->i_mutex);
|
|
error = break_layout(inode, true);
|
|
error = break_layout(inode, true);
|
|
*iolock = XFS_IOLOCK_EXCL;
|
|
*iolock = XFS_IOLOCK_EXCL;
|
|
|
|
+ if (with_imutex)
|
|
|
|
+ mutex_lock(&inode->i_mutex);
|
|
xfs_ilock(ip, *iolock);
|
|
xfs_ilock(ip, *iolock);
|
|
}
|
|
}
|
|
|
|
|