xfs: better xfs_trans_alloc interface
Merge xfs_trans_reserve and xfs_trans_alloc into a single function call that returns a transaction with all the required log and block reservations, and which allows passing transaction flags directly to avoid the cumbersome _xfs_trans_alloc interface. While we're at it we also get rid of the transaction type argument that has been superflous since we stopped supporting the non-CIL logging mode. The guts of it will be removed in another patch. [dchinner: fixed transaction leak in error path in xfs_setattr_nonsize] Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:

committed by
Dave Chinner

parent
f55532a0c0
commit
253f4911f2
@@ -242,37 +242,21 @@ xfs_attr_set(
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
args.trans = xfs_trans_alloc(mp, XFS_TRANS_ATTR_SET);
|
||||
tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
|
||||
M_RES(mp)->tr_attrsetrt.tr_logres * args.total;
|
||||
tres.tr_logcount = XFS_ATTRSET_LOG_COUNT;
|
||||
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||
|
||||
/*
|
||||
* Root fork attributes can use reserved data blocks for this
|
||||
* operation if necessary
|
||||
*/
|
||||
|
||||
if (rsvd)
|
||||
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
||||
|
||||
tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
|
||||
M_RES(mp)->tr_attrsetrt.tr_logres * args.total;
|
||||
tres.tr_logcount = XFS_ATTRSET_LOG_COUNT;
|
||||
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||
error = xfs_trans_reserve(args.trans, &tres, args.total, 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(args.trans);
|
||||
error = xfs_trans_alloc(mp, &tres, args.total, 0,
|
||||
rsvd ? XFS_TRANS_RESERVE : 0, &args.trans);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
xfs_ilock(dp, XFS_ILOCK_EXCL);
|
||||
|
||||
xfs_ilock(dp, XFS_ILOCK_EXCL);
|
||||
error = xfs_trans_reserve_quota_nblks(args.trans, dp, args.total, 0,
|
||||
rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
|
||||
XFS_QMOPT_RES_REGBLKS);
|
||||
@@ -428,32 +412,16 @@ xfs_attr_remove(
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
args.trans = xfs_trans_alloc(mp, XFS_TRANS_ATTR_RM);
|
||||
|
||||
/*
|
||||
* Root fork attributes can use reserved data blocks for this
|
||||
* operation if necessary
|
||||
*/
|
||||
|
||||
if (flags & ATTR_ROOT)
|
||||
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
||||
|
||||
error = xfs_trans_reserve(args.trans, &M_RES(mp)->tr_attrrm,
|
||||
XFS_ATTRRM_SPACE_RES(mp), 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(args.trans);
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_attrrm,
|
||||
XFS_ATTRRM_SPACE_RES(mp), 0,
|
||||
(flags & ATTR_ROOT) ? XFS_TRANS_RESERVE : 0,
|
||||
&args.trans);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_ilock(dp, XFS_ILOCK_EXCL);
|
||||
/*
|
||||
|
@@ -1121,15 +1121,14 @@ xfs_bmap_add_attrfork(
|
||||
|
||||
mp = ip->i_mount;
|
||||
ASSERT(!XFS_NOT_DQATTACHED(mp, ip));
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_ADDAFORK);
|
||||
|
||||
blks = XFS_ADDAFORK_SPACE_RES(mp);
|
||||
if (rsvd)
|
||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_addafork, blks, 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(tp);
|
||||
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_addafork, blks, 0,
|
||||
rsvd ? XFS_TRANS_RESERVE : 0, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
|
||||
XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES :
|
||||
@@ -6026,13 +6025,10 @@ xfs_bmap_split_extent(
|
||||
xfs_fsblock_t firstfsb;
|
||||
int error;
|
||||
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
||||
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
|
||||
XFS_DIOSTRAT_SPACE_RES(mp, 0), 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(tp);
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write,
|
||||
XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, 0, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
|
||||
|
@@ -838,12 +838,10 @@ xfs_sync_sb(
|
||||
struct xfs_trans *tp;
|
||||
int error;
|
||||
|
||||
tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP);
|
||||
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0);
|
||||
if (error) {
|
||||
xfs_trans_cancel(tp);
|
||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_sb, 0, 0,
|
||||
XFS_TRANS_NO_WRITECOUNT, &tp);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
xfs_log_sb(tp);
|
||||
if (wait)
|
||||
|
@@ -181,8 +181,9 @@ int xfs_log_calc_minimum_size(struct xfs_mount *);
|
||||
#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */
|
||||
#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */
|
||||
#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */
|
||||
#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer
|
||||
count in superblock */
|
||||
#define XFS_TRANS_NO_WRITECOUNT 0x40 /* do not elevate SB writecount */
|
||||
#define XFS_TRANS_NOFS 0x80 /* pass KM_NOFS to kmem_alloc */
|
||||
|
||||
/*
|
||||
* Field values for xfs_trans_mod_sb.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user