|
@@ -436,11 +436,7 @@ xfs_release(
|
|
|
if (ip->i_d.di_nlink == 0)
|
|
|
return 0;
|
|
|
|
|
|
- if ((S_ISREG(ip->i_d.di_mode) &&
|
|
|
- (VFS_I(ip)->i_size > 0 ||
|
|
|
- (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
|
|
|
- (ip->i_df.if_flags & XFS_IFEXTENTS)) &&
|
|
|
- (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) {
|
|
|
+ if (xfs_can_free_eofblocks(ip, false)) {
|
|
|
|
|
|
/*
|
|
|
* If we can't get the iolock just skip truncating the blocks
|
|
@@ -516,13 +512,12 @@ xfs_inactive(
|
|
|
goto out;
|
|
|
|
|
|
if (ip->i_d.di_nlink != 0) {
|
|
|
- if ((S_ISREG(ip->i_d.di_mode) &&
|
|
|
- (VFS_I(ip)->i_size > 0 ||
|
|
|
- (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) &&
|
|
|
- (ip->i_df.if_flags & XFS_IFEXTENTS) &&
|
|
|
- (!(ip->i_d.di_flags &
|
|
|
- (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) ||
|
|
|
- ip->i_delayed_blks != 0))) {
|
|
|
+ /*
|
|
|
+ * force is true because we are evicting an inode from the
|
|
|
+ * cache. Post-eof blocks must be freed, lest we end up with
|
|
|
+ * broken free space accounting.
|
|
|
+ */
|
|
|
+ if (xfs_can_free_eofblocks(ip, true)) {
|
|
|
error = xfs_free_eofblocks(mp, ip, false);
|
|
|
if (error)
|
|
|
return VN_INACTIVE_CACHE;
|