diff options
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
| -rw-r--r-- | fs/xfs/xfs_vnodeops.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index eaab355f5a8..a478f42e63f 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -615,6 +615,7 @@ xfs_setattr(  			code = xfs_igrow_start(ip, vap->va_size, credp);  		}  		xfs_iunlock(ip, XFS_ILOCK_EXCL); +		vn_iowait(vp); /* wait for the completion of any pending DIOs */  		if (!code)  			code = xfs_itruncate_data(ip, vap->va_size);  		if (code) { @@ -1556,7 +1557,7 @@ xfs_release(  			if ((error = xfs_inactive_free_eofblocks(mp, ip)))  				return error;  			/* Update linux inode block count after free above */ -			LINVFS_GET_IP(vp)->i_blocks = XFS_FSB_TO_BB(mp, +			vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,  				ip->i_d.di_nblocks + ip->i_delayed_blks);  		}  	} @@ -1637,7 +1638,7 @@ xfs_inactive(  			if ((error = xfs_inactive_free_eofblocks(mp, ip)))  				return VN_INACTIVE_CACHE;  			/* Update linux inode block count after free above */ -			LINVFS_GET_IP(vp)->i_blocks = XFS_FSB_TO_BB(mp, +			vn_to_inode(vp)->i_blocks = XFS_FSB_TO_BB(mp,  				ip->i_d.di_nblocks + ip->i_delayed_blks);  		}  		goto out; @@ -3186,7 +3187,7 @@ xfs_rmdir(  	/* Fall through to std_return with error = 0 or the errno  	 * from xfs_trans_commit. */ -std_return: + std_return:  	if (DM_EVENT_ENABLED(dir_vp->v_vfsp, dp, DM_EVENT_POSTREMOVE)) {  		(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,  					dir_vp, DM_RIGHT_NULL, @@ -3196,12 +3197,12 @@ std_return:  	}  	return error; -error1: + error1:  	xfs_bmap_cancel(&free_list);  	cancel_flags |= XFS_TRANS_ABORT;  	/* FALLTHROUGH */ -error_return: + error_return:  	xfs_trans_cancel(tp, cancel_flags);  	goto std_return;  } @@ -4310,8 +4311,10 @@ xfs_free_file_space(  	ASSERT(attr_flags & ATTR_NOLOCK ? attr_flags & ATTR_DMI : 1);  	if (attr_flags & ATTR_NOLOCK)  		need_iolock = 0; -	if (need_iolock) +	if (need_iolock) {  		xfs_ilock(ip, XFS_IOLOCK_EXCL); +		vn_iowait(vp);	/* wait for the completion of any pending DIOs */ +	}  	rounding = MAX((__uint8_t)(1 << mp->m_sb.sb_blocklog),  			(__uint8_t)NBPP); | 
