xfs: split out attribute fork truncation code into separate file
The attribute inactivation code is not used by userspace, so like the attribute listing, split it out into a separate file to minimise the differences between the filesystem shared with libxfs in userspace. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
@ -610,77 +610,6 @@ xfs_attr_remove(
|
||||
return xfs_attr_remove_int(dp, &xname, flags);
|
||||
}
|
||||
|
||||
int /* error */
|
||||
xfs_attr_inactive(xfs_inode_t *dp)
|
||||
{
|
||||
xfs_trans_t *trans;
|
||||
xfs_mount_t *mp;
|
||||
int error;
|
||||
|
||||
mp = dp->i_mount;
|
||||
ASSERT(! XFS_NOT_DQATTACHED(mp, dp));
|
||||
|
||||
xfs_ilock(dp, XFS_ILOCK_SHARED);
|
||||
if (!xfs_inode_hasattr(dp) ||
|
||||
dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
|
||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
||||
return 0;
|
||||
}
|
||||
xfs_iunlock(dp, XFS_ILOCK_SHARED);
|
||||
|
||||
/*
|
||||
* Start our first transaction of the day.
|
||||
*
|
||||
* All future transactions during this code must be "chained" off
|
||||
* this one via the trans_dup() call. All transactions will contain
|
||||
* the inode, and the inode will always be marked with trans_ihold().
|
||||
* Since the inode will be locked in all transactions, we must log
|
||||
* the inode in every transaction to let it float upward through
|
||||
* the log.
|
||||
*/
|
||||
trans = xfs_trans_alloc(mp, XFS_TRANS_ATTRINVAL);
|
||||
if ((error = xfs_trans_reserve(trans, 0, XFS_ATTRINVAL_LOG_RES(mp), 0,
|
||||
XFS_TRANS_PERM_LOG_RES,
|
||||
XFS_ATTRINVAL_LOG_COUNT))) {
|
||||
xfs_trans_cancel(trans, 0);
|
||||
return(error);
|
||||
}
|
||||
xfs_ilock(dp, XFS_ILOCK_EXCL);
|
||||
|
||||
/*
|
||||
* No need to make quota reservations here. We expect to release some
|
||||
* blocks, not allocate, in the common case.
|
||||
*/
|
||||
xfs_trans_ijoin(trans, dp, 0);
|
||||
|
||||
/*
|
||||
* Decide on what work routines to call based on the inode size.
|
||||
*/
|
||||
if (!xfs_inode_hasattr(dp) ||
|
||||
dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
|
||||
error = 0;
|
||||
goto out;
|
||||
}
|
||||
error = xfs_attr3_root_inactive(&trans, dp);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = xfs_itruncate_extents(&trans, dp, XFS_ATTR_FORK, 0);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = xfs_trans_commit(trans, XFS_TRANS_RELEASE_LOG_RES);
|
||||
xfs_iunlock(dp, XFS_ILOCK_EXCL);
|
||||
|
||||
return(error);
|
||||
|
||||
out:
|
||||
xfs_trans_cancel(trans, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
|
||||
xfs_iunlock(dp, XFS_ILOCK_EXCL);
|
||||
return(error);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*========================================================================
|
||||
* External routines when attribute list is inside the inode
|
||||
|
Reference in New Issue
Block a user