diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
| -rw-r--r-- | fs/xfs/xfs_inode.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 61d1cb7dc10d..801274126648 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2401,6 +2401,24 @@ retry:  }  /* + * Free any local-format buffers sitting around before we reset to + * extents format. + */ +static inline void +xfs_ifree_local_data( +	struct xfs_inode	*ip, +	int			whichfork) +{ +	struct xfs_ifork	*ifp; + +	if (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL) +		return; + +	ifp = XFS_IFORK_PTR(ip, whichfork); +	xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); +} + +/*   * This is called to return an inode to the inode free list.   * The inode should already be truncated to 0 length and have   * no pages associated with it.  This routine also assumes that @@ -2437,6 +2455,9 @@ xfs_ifree(  	if (error)  		return error; +	xfs_ifree_local_data(ip, XFS_DATA_FORK); +	xfs_ifree_local_data(ip, XFS_ATTR_FORK); +  	VFS_I(ip)->i_mode = 0;		/* mark incore inode as free */  	ip->i_d.di_flags = 0;  	ip->i_d.di_dmevmask = 0;  |