xfs: refactor xfs_trans_reserve() interface
With the new xfs_trans_res structure has been introduced, the log reservation size, log count as well as log flags are pre-initialized at mount time. So it's time to refine xfs_trans_reserve() interface to be more neat. Also, introduce a new helper M_RES() to return a pointer to the mp->m_resv structure to simplify the input. Signed-off-by: Jie Liu <jeff.liu@oracle.com> 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:
Родитель
783cb6d172
Коммит
3d3c8b5222
|
@ -116,7 +116,7 @@ xfs_setfilesize_trans_alloc(
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
||||||
|
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_fsyncts, 0, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -226,13 +226,14 @@ xfs_attr_set_int(
|
||||||
int valuelen,
|
int valuelen,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
xfs_da_args_t args;
|
xfs_da_args_t args;
|
||||||
xfs_fsblock_t firstblock;
|
xfs_fsblock_t firstblock;
|
||||||
xfs_bmap_free_t flist;
|
xfs_bmap_free_t flist;
|
||||||
int error, err2, committed;
|
int error, err2, committed;
|
||||||
xfs_mount_t *mp = dp->i_mount;
|
struct xfs_mount *mp = dp->i_mount;
|
||||||
int rsvd = (flags & ATTR_ROOT) != 0;
|
struct xfs_trans_res tres;
|
||||||
int local;
|
int rsvd = (flags & ATTR_ROOT) != 0;
|
||||||
|
int local;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach the dquots to the inode.
|
* Attach the dquots to the inode.
|
||||||
|
@ -292,11 +293,11 @@ xfs_attr_set_int(
|
||||||
if (rsvd)
|
if (rsvd)
|
||||||
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
||||||
|
|
||||||
error = xfs_trans_reserve(args.trans, args.total,
|
tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres +
|
||||||
XFS_ATTRSETM_LOG_RES(mp) +
|
M_RES(mp)->tr_attrsetrt.tr_logres * args.total;
|
||||||
XFS_ATTRSETRT_LOG_RES(mp) * args.total,
|
tres.tr_logcount = XFS_ATTRSET_LOG_COUNT;
|
||||||
0, XFS_TRANS_PERM_LOG_RES,
|
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||||
XFS_ATTRSET_LOG_COUNT);
|
error = xfs_trans_reserve(args.trans, &tres, args.total, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(args.trans, 0);
|
xfs_trans_cancel(args.trans, 0);
|
||||||
return(error);
|
return(error);
|
||||||
|
@ -516,11 +517,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags)
|
||||||
if (flags & ATTR_ROOT)
|
if (flags & ATTR_ROOT)
|
||||||
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
args.trans->t_flags |= XFS_TRANS_RESERVE;
|
||||||
|
|
||||||
if ((error = xfs_trans_reserve(args.trans,
|
error = xfs_trans_reserve(args.trans, &M_RES(mp)->tr_attrrm,
|
||||||
XFS_ATTRRM_SPACE_RES(mp),
|
XFS_ATTRRM_SPACE_RES(mp), 0);
|
||||||
XFS_ATTRRM_LOG_RES(mp),
|
if (error) {
|
||||||
0, XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ATTRRM_LOG_COUNT))) {
|
|
||||||
xfs_trans_cancel(args.trans, 0);
|
xfs_trans_cancel(args.trans, 0);
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,9 +412,8 @@ xfs_attr_inactive(xfs_inode_t *dp)
|
||||||
* the log.
|
* the log.
|
||||||
*/
|
*/
|
||||||
trans = xfs_trans_alloc(mp, XFS_TRANS_ATTRINVAL);
|
trans = xfs_trans_alloc(mp, XFS_TRANS_ATTRINVAL);
|
||||||
if ((error = xfs_trans_reserve(trans, 0, XFS_ATTRINVAL_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(trans, &M_RES(mp)->tr_attrinval, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
if (error) {
|
||||||
XFS_ATTRINVAL_LOG_COUNT))) {
|
|
||||||
xfs_trans_cancel(trans, 0);
|
xfs_trans_cancel(trans, 0);
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1148,8 +1148,8 @@ xfs_bmap_add_attrfork(
|
||||||
blks = XFS_ADDAFORK_SPACE_RES(mp);
|
blks = XFS_ADDAFORK_SPACE_RES(mp);
|
||||||
if (rsvd)
|
if (rsvd)
|
||||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||||
if ((error = xfs_trans_reserve(tp, blks, XFS_ADDAFORK_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_addafork, blks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT)))
|
if (error)
|
||||||
goto error0;
|
goto error0;
|
||||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||||
error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
|
error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
|
||||||
|
|
|
@ -78,8 +78,7 @@ xfs_bmap_finish(
|
||||||
xfs_efi_log_item_t *efi; /* extent free intention */
|
xfs_efi_log_item_t *efi; /* extent free intention */
|
||||||
int error; /* error return value */
|
int error; /* error return value */
|
||||||
xfs_bmap_free_item_t *free; /* free extent item */
|
xfs_bmap_free_item_t *free; /* free extent item */
|
||||||
unsigned int logres; /* new log reservation */
|
struct xfs_trans_res tres; /* new log reservation */
|
||||||
unsigned int logcount; /* new log count */
|
|
||||||
xfs_mount_t *mp; /* filesystem mount structure */
|
xfs_mount_t *mp; /* filesystem mount structure */
|
||||||
xfs_bmap_free_item_t *next; /* next item on free list */
|
xfs_bmap_free_item_t *next; /* next item on free list */
|
||||||
xfs_trans_t *ntp; /* new transaction pointer */
|
xfs_trans_t *ntp; /* new transaction pointer */
|
||||||
|
@ -94,8 +93,10 @@ xfs_bmap_finish(
|
||||||
for (free = flist->xbf_first; free; free = free->xbfi_next)
|
for (free = flist->xbf_first; free; free = free->xbfi_next)
|
||||||
xfs_trans_log_efi_extent(ntp, efi, free->xbfi_startblock,
|
xfs_trans_log_efi_extent(ntp, efi, free->xbfi_startblock,
|
||||||
free->xbfi_blockcount);
|
free->xbfi_blockcount);
|
||||||
logres = ntp->t_log_res;
|
|
||||||
logcount = ntp->t_log_count;
|
tres.tr_logres = ntp->t_log_res;
|
||||||
|
tres.tr_logcount = ntp->t_log_count;
|
||||||
|
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||||
ntp = xfs_trans_dup(*tp);
|
ntp = xfs_trans_dup(*tp);
|
||||||
error = xfs_trans_commit(*tp, 0);
|
error = xfs_trans_commit(*tp, 0);
|
||||||
*tp = ntp;
|
*tp = ntp;
|
||||||
|
@ -113,8 +114,8 @@ xfs_bmap_finish(
|
||||||
*/
|
*/
|
||||||
xfs_log_ticket_put(ntp->t_ticket);
|
xfs_log_ticket_put(ntp->t_ticket);
|
||||||
|
|
||||||
if ((error = xfs_trans_reserve(ntp, 0, logres, 0, XFS_TRANS_PERM_LOG_RES,
|
error = xfs_trans_reserve(ntp, &tres, 0, 0);
|
||||||
logcount)))
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count);
|
efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count);
|
||||||
for (free = flist->xbf_first; free != NULL; free = next) {
|
for (free = flist->xbf_first; free != NULL; free = next) {
|
||||||
|
@ -929,10 +930,7 @@ xfs_free_eofblocks(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
XFS_ITRUNCATE_LOG_RES(mp),
|
|
||||||
0, XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ITRUNCATE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
|
@ -1085,10 +1083,8 @@ xfs_alloc_file_space(
|
||||||
* Allocate and setup the transaction.
|
* Allocate and setup the transaction.
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
||||||
error = xfs_trans_reserve(tp, resblks,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
|
||||||
XFS_WRITE_LOG_RES(mp), resrtextents,
|
resblks, resrtextents);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
/*
|
/*
|
||||||
* Check for running out of space
|
* Check for running out of space
|
||||||
*/
|
*/
|
||||||
|
@ -1378,12 +1374,7 @@ xfs_free_file_space(
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
||||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||||
error = xfs_trans_reserve(tp,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, resblks, 0);
|
||||||
resblks,
|
|
||||||
XFS_WRITE_LOG_RES(mp),
|
|
||||||
0,
|
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check for running out of space
|
* check for running out of space
|
||||||
|
@ -1657,10 +1648,8 @@ xfs_change_file_space(
|
||||||
* update the inode timestamp, mode, and prealloc flag bits
|
* update the inode timestamp, mode, and prealloc flag bits
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_WRITEID);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_WRITEID);
|
||||||
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_writeid, 0, 0);
|
||||||
if ((error = xfs_trans_reserve(tp, 0, XFS_WRITEID_LOG_RES(mp),
|
if (error) {
|
||||||
0, 0, 0))) {
|
|
||||||
/* ASSERT(0); */
|
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -1905,9 +1894,8 @@ xfs_swap_extents(
|
||||||
truncate_pagecache_range(VFS_I(ip), 0, -1);
|
truncate_pagecache_range(VFS_I(ip), 0, -1);
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT);
|
||||||
if ((error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
|
||||||
XFS_ICHANGE_LOG_RES(mp), 0,
|
if (error) {
|
||||||
0, 0))) {
|
|
||||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||||
xfs_iunlock(tip, XFS_IOLOCK_EXCL);
|
xfs_iunlock(tip, XFS_IOLOCK_EXCL);
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
|
|
|
@ -712,10 +712,8 @@ xfs_qm_dqread(
|
||||||
|
|
||||||
if (flags & XFS_QMOPT_DQALLOC) {
|
if (flags & XFS_QMOPT_DQALLOC) {
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC);
|
||||||
error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_attrsetm,
|
||||||
XFS_QM_DQALLOC_LOG_RES(mp), 0,
|
XFS_QM_DQALLOC_SPACE_RES(mp), 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto error1;
|
goto error1;
|
||||||
cancelflags = XFS_TRANS_RELEASE_LOG_RES;
|
cancelflags = XFS_TRANS_RELEASE_LOG_RES;
|
||||||
|
|
|
@ -203,8 +203,9 @@ xfs_growfs_data_private(
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
|
||||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||||
if ((error = xfs_trans_reserve(tp, XFS_GROWFS_SPACE_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growdata,
|
||||||
XFS_GROWDATA_LOG_RES(mp), 0, 0, 0))) {
|
XFS_GROWFS_SPACE_RES(mp), 0);
|
||||||
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -739,8 +740,7 @@ xfs_fs_log_dummy(
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP);
|
tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0);
|
||||||
XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -892,8 +892,6 @@ xfs_dir_ialloc(
|
||||||
xfs_inode_t *ip;
|
xfs_inode_t *ip;
|
||||||
xfs_buf_t *ialloc_context = NULL;
|
xfs_buf_t *ialloc_context = NULL;
|
||||||
int code;
|
int code;
|
||||||
uint log_res;
|
|
||||||
uint log_count;
|
|
||||||
void *dqinfo;
|
void *dqinfo;
|
||||||
uint tflags;
|
uint tflags;
|
||||||
|
|
||||||
|
@ -939,6 +937,8 @@ xfs_dir_ialloc(
|
||||||
* to succeed the second time.
|
* to succeed the second time.
|
||||||
*/
|
*/
|
||||||
if (ialloc_context) {
|
if (ialloc_context) {
|
||||||
|
struct xfs_trans_res tres;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Normally, xfs_trans_commit releases all the locks.
|
* Normally, xfs_trans_commit releases all the locks.
|
||||||
* We call bhold to hang on to the ialloc_context across
|
* We call bhold to hang on to the ialloc_context across
|
||||||
|
@ -951,8 +951,8 @@ xfs_dir_ialloc(
|
||||||
* Save the log reservation so we can use
|
* Save the log reservation so we can use
|
||||||
* them in the next transaction.
|
* them in the next transaction.
|
||||||
*/
|
*/
|
||||||
log_res = xfs_trans_get_log_res(tp);
|
tres.tr_logres = xfs_trans_get_log_res(tp);
|
||||||
log_count = xfs_trans_get_log_count(tp);
|
tres.tr_logcount = xfs_trans_get_log_count(tp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want the quota changes to be associated with the next
|
* We want the quota changes to be associated with the next
|
||||||
|
@ -995,8 +995,9 @@ xfs_dir_ialloc(
|
||||||
* reference that we gained in xfs_trans_dup()
|
* reference that we gained in xfs_trans_dup()
|
||||||
*/
|
*/
|
||||||
xfs_log_ticket_put(tp->t_ticket);
|
xfs_log_ticket_put(tp->t_ticket);
|
||||||
code = xfs_trans_reserve(tp, 0, log_res, 0,
|
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
code = xfs_trans_reserve(tp, &tres, 0, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Re-attach the quota info that we detached from prev trx.
|
* Re-attach the quota info that we detached from prev trx.
|
||||||
*/
|
*/
|
||||||
|
@ -1161,9 +1162,8 @@ xfs_create(
|
||||||
struct xfs_dquot *udqp = NULL;
|
struct xfs_dquot *udqp = NULL;
|
||||||
struct xfs_dquot *gdqp = NULL;
|
struct xfs_dquot *gdqp = NULL;
|
||||||
struct xfs_dquot *pdqp = NULL;
|
struct xfs_dquot *pdqp = NULL;
|
||||||
|
struct xfs_trans_res tres;
|
||||||
uint resblks;
|
uint resblks;
|
||||||
uint log_res;
|
|
||||||
uint log_count;
|
|
||||||
|
|
||||||
trace_xfs_create(dp, name);
|
trace_xfs_create(dp, name);
|
||||||
|
|
||||||
|
@ -1187,13 +1187,13 @@ xfs_create(
|
||||||
if (is_dir) {
|
if (is_dir) {
|
||||||
rdev = 0;
|
rdev = 0;
|
||||||
resblks = XFS_MKDIR_SPACE_RES(mp, name->len);
|
resblks = XFS_MKDIR_SPACE_RES(mp, name->len);
|
||||||
log_res = XFS_MKDIR_LOG_RES(mp);
|
tres.tr_logres = M_RES(mp)->tr_mkdir.tr_logres;
|
||||||
log_count = XFS_MKDIR_LOG_COUNT;
|
tres.tr_logcount = XFS_MKDIR_LOG_COUNT;
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
|
||||||
} else {
|
} else {
|
||||||
resblks = XFS_CREATE_SPACE_RES(mp, name->len);
|
resblks = XFS_CREATE_SPACE_RES(mp, name->len);
|
||||||
log_res = XFS_CREATE_LOG_RES(mp);
|
tres.tr_logres = M_RES(mp)->tr_create.tr_logres;
|
||||||
log_count = XFS_CREATE_LOG_COUNT;
|
tres.tr_logcount = XFS_CREATE_LOG_COUNT;
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1205,19 +1205,17 @@ xfs_create(
|
||||||
* the case we'll drop the one we have and get a more
|
* the case we'll drop the one we have and get a more
|
||||||
* appropriate transaction later.
|
* appropriate transaction later.
|
||||||
*/
|
*/
|
||||||
error = xfs_trans_reserve(tp, resblks, log_res, 0,
|
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
error = xfs_trans_reserve(tp, &tres, resblks, 0);
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
/* flush outstanding delalloc blocks and retry */
|
/* flush outstanding delalloc blocks and retry */
|
||||||
xfs_flush_inodes(mp);
|
xfs_flush_inodes(mp);
|
||||||
error = xfs_trans_reserve(tp, resblks, log_res, 0,
|
error = xfs_trans_reserve(tp, &tres, resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
|
||||||
}
|
}
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
/* No space at all so try a "no-allocation" reservation */
|
/* No space at all so try a "no-allocation" reservation */
|
||||||
resblks = 0;
|
resblks = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, log_res, 0,
|
error = xfs_trans_reserve(tp, &tres, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
cancel_flags = 0;
|
cancel_flags = 0;
|
||||||
|
@ -1371,12 +1369,10 @@ xfs_link(
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
|
||||||
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
|
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
|
||||||
resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
|
resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
|
||||||
error = xfs_trans_reserve(tp, resblks, XFS_LINK_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_link, resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
|
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
resblks = 0;
|
resblks = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_LINK_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_link, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
|
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
cancel_flags = 0;
|
cancel_flags = 0;
|
||||||
|
@ -1551,10 +1547,7 @@ xfs_itruncate_extents(
|
||||||
* reference that we gained in xfs_trans_dup()
|
* reference that we gained in xfs_trans_dup()
|
||||||
*/
|
*/
|
||||||
xfs_log_ticket_put(tp->t_ticket);
|
xfs_log_ticket_put(tp->t_ticket);
|
||||||
error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
XFS_ITRUNCATE_LOG_RES(mp), 0,
|
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ITRUNCATE_LOG_COUNT);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1680,13 +1673,14 @@ int
|
||||||
xfs_inactive(
|
xfs_inactive(
|
||||||
xfs_inode_t *ip)
|
xfs_inode_t *ip)
|
||||||
{
|
{
|
||||||
xfs_bmap_free_t free_list;
|
xfs_bmap_free_t free_list;
|
||||||
xfs_fsblock_t first_block;
|
xfs_fsblock_t first_block;
|
||||||
int committed;
|
int committed;
|
||||||
xfs_trans_t *tp;
|
struct xfs_trans *tp;
|
||||||
xfs_mount_t *mp;
|
struct xfs_mount *mp;
|
||||||
int error;
|
struct xfs_trans_res *resp;
|
||||||
int truncate = 0;
|
int error;
|
||||||
|
int truncate = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the inode is already free, then there can be nothing
|
* If the inode is already free, then there can be nothing
|
||||||
|
@ -1730,13 +1724,10 @@ xfs_inactive(
|
||||||
return VN_INACTIVE_CACHE;
|
return VN_INACTIVE_CACHE;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
|
||||||
error = xfs_trans_reserve(tp, 0,
|
resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ?
|
||||||
(truncate || S_ISLNK(ip->i_d.di_mode)) ?
|
&M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree;
|
||||||
XFS_ITRUNCATE_LOG_RES(mp) :
|
|
||||||
XFS_IFREE_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, resp, 0, 0);
|
||||||
0,
|
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ITRUNCATE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
|
@ -1781,10 +1772,7 @@ xfs_inactive(
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
|
||||||
error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0);
|
||||||
XFS_IFREE_LOG_RES(mp),
|
|
||||||
0, XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_INACTIVE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2431,12 +2419,10 @@ xfs_remove(
|
||||||
* block from the directory.
|
* block from the directory.
|
||||||
*/
|
*/
|
||||||
resblks = XFS_REMOVE_SPACE_RES(mp);
|
resblks = XFS_REMOVE_SPACE_RES(mp);
|
||||||
error = xfs_trans_reserve(tp, resblks, XFS_REMOVE_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_remove, resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
resblks = 0;
|
resblks = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_remove, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, log_count);
|
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
ASSERT(error != ENOSPC);
|
ASSERT(error != ENOSPC);
|
||||||
|
@ -2631,12 +2617,10 @@ xfs_rename(
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
|
||||||
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
|
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
|
||||||
spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
|
spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
|
||||||
error = xfs_trans_reserve(tp, spaceres, XFS_RENAME_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
|
|
||||||
if (error == ENOSPC) {
|
if (error == ENOSPC) {
|
||||||
spaceres = 0;
|
spaceres = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_RENAME_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
|
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
|
|
|
@ -367,7 +367,7 @@ xfs_set_dmattrs(
|
||||||
return XFS_ERROR(EIO);
|
return XFS_ERROR(EIO);
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SET_DMATTRS);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SET_DMATTRS);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES (mp), 0, 0, 0);
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
@ -1001,7 +1001,7 @@ xfs_ioctl_setattr(
|
||||||
* first do an error checking pass.
|
* first do an error checking pass.
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
|
||||||
code = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0);
|
code = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
|
||||||
if (code)
|
if (code)
|
||||||
goto error_return;
|
goto error_return;
|
||||||
|
|
||||||
|
|
|
@ -188,10 +188,8 @@ xfs_iomap_write_direct(
|
||||||
* Allocate and setup the transaction
|
* Allocate and setup the transaction
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT);
|
||||||
error = xfs_trans_reserve(tp, resblks,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
|
||||||
XFS_WRITE_LOG_RES(mp), resrtextents,
|
resblks, resrtextents);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
/*
|
/*
|
||||||
* Check for running out of space, note: need lock to return
|
* Check for running out of space, note: need lock to return
|
||||||
*/
|
*/
|
||||||
|
@ -699,10 +697,8 @@ xfs_iomap_write_allocate(
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE);
|
||||||
tp->t_flags |= XFS_TRANS_RESERVE;
|
tp->t_flags |= XFS_TRANS_RESERVE;
|
||||||
nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
|
nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK);
|
||||||
error = xfs_trans_reserve(tp, nres,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
|
||||||
XFS_WRITE_LOG_RES(mp),
|
nres, 0);
|
||||||
0, XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return XFS_ERROR(error);
|
return XFS_ERROR(error);
|
||||||
|
@ -865,10 +861,8 @@ xfs_iomap_write_unwritten(
|
||||||
sb_start_intwrite(mp->m_super);
|
sb_start_intwrite(mp->m_super);
|
||||||
tp = _xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE, KM_NOFS);
|
tp = _xfs_trans_alloc(mp, XFS_TRANS_STRAT_WRITE, KM_NOFS);
|
||||||
tp->t_flags |= XFS_TRANS_RESERVE | XFS_TRANS_FREEZE_PROT;
|
tp->t_flags |= XFS_TRANS_RESERVE | XFS_TRANS_FREEZE_PROT;
|
||||||
error = xfs_trans_reserve(tp, resblks,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
|
||||||
XFS_WRITE_LOG_RES(mp), 0,
|
resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_WRITE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return XFS_ERROR(error);
|
return XFS_ERROR(error);
|
||||||
|
|
|
@ -546,7 +546,7 @@ xfs_setattr_nonsize(
|
||||||
}
|
}
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0);
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_dqrele;
|
goto out_dqrele;
|
||||||
|
|
||||||
|
@ -808,9 +808,7 @@ xfs_setattr_size(
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ITRUNCATE_LOG_COUNT);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto out_trans_cancel;
|
goto out_trans_cancel;
|
||||||
|
|
||||||
|
@ -933,7 +931,7 @@ xfs_vn_update_time(
|
||||||
trace_xfs_update_time(ip);
|
trace_xfs_update_time(ip);
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_fsyncts, 0, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return -error;
|
return -error;
|
||||||
|
|
|
@ -3377,7 +3377,7 @@ xlog_recover_process_efi(
|
||||||
}
|
}
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, 0);
|
tp = xfs_trans_alloc(mp, 0);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, 0, 0);
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
if (error)
|
if (error)
|
||||||
goto abort_error;
|
goto abort_error;
|
||||||
efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents);
|
efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents);
|
||||||
|
@ -3483,8 +3483,7 @@ xlog_recover_clear_agi_bucket(
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_CLEAR_AGI_BUCKET);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_CLEAR_AGI_BUCKET);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_CLEAR_AGI_BUCKET_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_clearagi, 0, 0);
|
||||||
0, 0, 0);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto out_abort;
|
goto out_abort;
|
||||||
|
|
||||||
|
|
|
@ -597,8 +597,7 @@ xfs_mount_reset_sbqflags(
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_sbchange, 0, 0);
|
||||||
0, 0, XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
xfs_alert(mp, "%s: Superblock update failed!", __func__);
|
xfs_alert(mp, "%s: Superblock update failed!", __func__);
|
||||||
|
@ -1071,8 +1070,7 @@ xfs_log_sbcount(xfs_mount_t *mp)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP);
|
tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0);
|
||||||
XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
@ -1392,8 +1390,7 @@ xfs_mount_log_sb(
|
||||||
XFS_SB_VERSIONNUM));
|
XFS_SB_VERSIONNUM));
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0);
|
||||||
XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -865,11 +865,9 @@ xfs_qm_qino_alloc(
|
||||||
}
|
}
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QINOCREATE);
|
||||||
if ((error = xfs_trans_reserve(tp,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_create,
|
||||||
XFS_QM_QINOCREATE_SPACE_RES(mp),
|
XFS_QM_QINOCREATE_SPACE_RES(mp), 0);
|
||||||
XFS_CREATE_LOG_RES(mp), 0,
|
if (error) {
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_CREATE_LOG_COUNT))) {
|
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -1740,8 +1738,7 @@ xfs_qm_write_sb_changes(
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_sbchange, 0, 0);
|
||||||
0, 0, XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -247,9 +247,7 @@ xfs_qm_scall_trunc_qfile(
|
||||||
xfs_ilock(ip, XFS_IOLOCK_EXCL);
|
xfs_ilock(ip, XFS_IOLOCK_EXCL);
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_TRUNCATE_FILE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_TRUNCATE_FILE);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
|
||||||
XFS_ITRUNCATE_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||||
|
@ -540,8 +538,7 @@ xfs_qm_scall_setqlim(
|
||||||
xfs_dqunlock(dqp);
|
xfs_dqunlock(dqp);
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_setqlim, 0, 0);
|
||||||
0, 0, XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
goto out_rele;
|
goto out_rele;
|
||||||
|
@ -675,8 +672,7 @@ xfs_qm_log_quotaoff_end(
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END);
|
||||||
|
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_END_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_equotaoff, 0, 0);
|
||||||
0, 0, XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_trans_cancel(tp, 0);
|
xfs_trans_cancel(tp, 0);
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -709,8 +705,7 @@ xfs_qm_log_quotaoff(
|
||||||
uint oldsbqflag=0;
|
uint oldsbqflag=0;
|
||||||
|
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF);
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp),
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_quotaoff, 0, 0);
|
||||||
0, 0, XFS_DEFAULT_LOG_COUNT);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto error0;
|
goto error0;
|
||||||
|
|
||||||
|
|
|
@ -100,10 +100,9 @@ xfs_growfs_rt_alloc(
|
||||||
/*
|
/*
|
||||||
* Reserve space & log for one extent added to the file.
|
* Reserve space & log for one extent added to the file.
|
||||||
*/
|
*/
|
||||||
if ((error = xfs_trans_reserve(tp, resblks,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growdata,
|
||||||
XFS_GROWRTALLOC_LOG_RES(mp), 0,
|
resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES,
|
if (error)
|
||||||
XFS_DEFAULT_PERM_LOG_COUNT)))
|
|
||||||
goto error_cancel;
|
goto error_cancel;
|
||||||
cancelflags = XFS_TRANS_RELEASE_LOG_RES;
|
cancelflags = XFS_TRANS_RELEASE_LOG_RES;
|
||||||
/*
|
/*
|
||||||
|
@ -146,8 +145,9 @@ xfs_growfs_rt_alloc(
|
||||||
/*
|
/*
|
||||||
* Reserve log for one block zeroing.
|
* Reserve log for one block zeroing.
|
||||||
*/
|
*/
|
||||||
if ((error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtzero,
|
||||||
XFS_GROWRTZERO_LOG_RES(mp), 0, 0, 0)))
|
0, 0);
|
||||||
|
if (error)
|
||||||
goto error_cancel;
|
goto error_cancel;
|
||||||
/*
|
/*
|
||||||
* Lock the bitmap inode.
|
* Lock the bitmap inode.
|
||||||
|
@ -1957,8 +1957,9 @@ xfs_growfs_rt(
|
||||||
* Start a transaction, get the log reservation.
|
* Start a transaction, get the log reservation.
|
||||||
*/
|
*/
|
||||||
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE);
|
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE);
|
||||||
if ((error = xfs_trans_reserve(tp, 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtfree,
|
||||||
XFS_GROWRTFREE_LOG_RES(nmp), 0, 0, 0)))
|
0, 0);
|
||||||
|
if (error)
|
||||||
goto error_cancel;
|
goto error_cancel;
|
||||||
/*
|
/*
|
||||||
* Lock out other callers by grabbing the bitmap inode lock.
|
* Lock out other callers by grabbing the bitmap inode lock.
|
||||||
|
|
|
@ -231,12 +231,10 @@ xfs_symlink(
|
||||||
else
|
else
|
||||||
fs_blocks = xfs_symlink_blocks(mp, pathlen);
|
fs_blocks = xfs_symlink_blocks(mp, pathlen);
|
||||||
resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);
|
resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);
|
||||||
error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_symlink, resblks, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
|
|
||||||
if (error == ENOSPC && fs_blocks == 0) {
|
if (error == ENOSPC && fs_blocks == 0) {
|
||||||
resblks = 0;
|
resblks = 0;
|
||||||
error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_symlink, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
|
|
||||||
}
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
cancel_flags = 0;
|
cancel_flags = 0;
|
||||||
|
@ -539,8 +537,8 @@ xfs_inactive_symlink_rmt(
|
||||||
* Put an itruncate log reservation in the new transaction
|
* Put an itruncate log reservation in the new transaction
|
||||||
* for our caller.
|
* for our caller.
|
||||||
*/
|
*/
|
||||||
if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
|
error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
|
||||||
XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) {
|
if (error) {
|
||||||
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
ASSERT(XFS_FORCED_SHUTDOWN(mp));
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ void
|
||||||
xfs_trans_init(
|
xfs_trans_init(
|
||||||
struct xfs_mount *mp)
|
struct xfs_mount *mp)
|
||||||
{
|
{
|
||||||
xfs_trans_resv_calc(mp, &mp->m_resv);
|
xfs_trans_resv_calc(mp, M_RES(mp));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -180,12 +180,10 @@ xfs_trans_dup(
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
xfs_trans_reserve(
|
xfs_trans_reserve(
|
||||||
xfs_trans_t *tp,
|
struct xfs_trans *tp,
|
||||||
uint blocks,
|
struct xfs_trans_res *resp,
|
||||||
uint logspace,
|
uint blocks,
|
||||||
uint rtextents,
|
uint rtextents)
|
||||||
uint flags,
|
|
||||||
uint logcount)
|
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
|
int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0;
|
||||||
|
@ -211,13 +209,15 @@ xfs_trans_reserve(
|
||||||
/*
|
/*
|
||||||
* Reserve the log space needed for this transaction.
|
* Reserve the log space needed for this transaction.
|
||||||
*/
|
*/
|
||||||
if (logspace > 0) {
|
if (resp->tr_logres > 0) {
|
||||||
bool permanent = false;
|
bool permanent = false;
|
||||||
|
|
||||||
ASSERT(tp->t_log_res == 0 || tp->t_log_res == logspace);
|
ASSERT(tp->t_log_res == 0 ||
|
||||||
ASSERT(tp->t_log_count == 0 || tp->t_log_count == logcount);
|
tp->t_log_res == resp->tr_logres);
|
||||||
|
ASSERT(tp->t_log_count == 0 ||
|
||||||
|
tp->t_log_count == resp->tr_logcount);
|
||||||
|
|
||||||
if (flags & XFS_TRANS_PERM_LOG_RES) {
|
if (resp->tr_logflags & XFS_TRANS_PERM_LOG_RES) {
|
||||||
tp->t_flags |= XFS_TRANS_PERM_LOG_RES;
|
tp->t_flags |= XFS_TRANS_PERM_LOG_RES;
|
||||||
permanent = true;
|
permanent = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -226,20 +226,21 @@ xfs_trans_reserve(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tp->t_ticket != NULL) {
|
if (tp->t_ticket != NULL) {
|
||||||
ASSERT(flags & XFS_TRANS_PERM_LOG_RES);
|
ASSERT(resp->tr_logflags & XFS_TRANS_PERM_LOG_RES);
|
||||||
error = xfs_log_regrant(tp->t_mountp, tp->t_ticket);
|
error = xfs_log_regrant(tp->t_mountp, tp->t_ticket);
|
||||||
} else {
|
} else {
|
||||||
error = xfs_log_reserve(tp->t_mountp, logspace,
|
error = xfs_log_reserve(tp->t_mountp,
|
||||||
logcount, &tp->t_ticket,
|
resp->tr_logres,
|
||||||
XFS_TRANSACTION, permanent,
|
resp->tr_logcount,
|
||||||
tp->t_type);
|
&tp->t_ticket, XFS_TRANSACTION,
|
||||||
|
permanent, tp->t_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
goto undo_blocks;
|
goto undo_blocks;
|
||||||
|
|
||||||
tp->t_log_res = logspace;
|
tp->t_log_res = resp->tr_logres;
|
||||||
tp->t_log_count = logcount;
|
tp->t_log_count = resp->tr_logcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -264,10 +265,10 @@ xfs_trans_reserve(
|
||||||
* reservations which have already been performed.
|
* reservations which have already been performed.
|
||||||
*/
|
*/
|
||||||
undo_log:
|
undo_log:
|
||||||
if (logspace > 0) {
|
if (resp->tr_logres > 0) {
|
||||||
int log_flags;
|
int log_flags;
|
||||||
|
|
||||||
if (flags & XFS_TRANS_PERM_LOG_RES) {
|
if (resp->tr_logflags & XFS_TRANS_PERM_LOG_RES) {
|
||||||
log_flags = XFS_LOG_REL_PERM_RESERV;
|
log_flags = XFS_LOG_REL_PERM_RESERV;
|
||||||
} else {
|
} else {
|
||||||
log_flags = 0;
|
log_flags = 0;
|
||||||
|
@ -1014,7 +1015,7 @@ xfs_trans_roll(
|
||||||
struct xfs_inode *dp)
|
struct xfs_inode *dp)
|
||||||
{
|
{
|
||||||
struct xfs_trans *trans;
|
struct xfs_trans *trans;
|
||||||
unsigned int logres, count;
|
struct xfs_trans_res tres;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1026,8 +1027,8 @@ xfs_trans_roll(
|
||||||
/*
|
/*
|
||||||
* Copy the critical parameters from one trans to the next.
|
* Copy the critical parameters from one trans to the next.
|
||||||
*/
|
*/
|
||||||
logres = trans->t_log_res;
|
tres.tr_logres = trans->t_log_res;
|
||||||
count = trans->t_log_count;
|
tres.tr_logcount = trans->t_log_count;
|
||||||
*tpp = xfs_trans_dup(trans);
|
*tpp = xfs_trans_dup(trans);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1058,8 +1059,8 @@ xfs_trans_roll(
|
||||||
* across this call, or that anything that is locked be logged in
|
* across this call, or that anything that is locked be logged in
|
||||||
* the prior and the next transactions.
|
* the prior and the next transactions.
|
||||||
*/
|
*/
|
||||||
error = xfs_trans_reserve(trans, 0, logres, 0,
|
tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
|
||||||
XFS_TRANS_PERM_LOG_RES, count);
|
error = xfs_trans_reserve(trans, &tres, 0, 0);
|
||||||
/*
|
/*
|
||||||
* Ensure that the inode is in the new transaction and locked.
|
* Ensure that the inode is in the new transaction and locked.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -34,6 +34,7 @@ struct xfs_log_iovec;
|
||||||
struct xfs_log_item_desc;
|
struct xfs_log_item_desc;
|
||||||
struct xfs_mount;
|
struct xfs_mount;
|
||||||
struct xfs_trans;
|
struct xfs_trans;
|
||||||
|
struct xfs_trans_res;
|
||||||
struct xfs_dquot_acct;
|
struct xfs_dquot_acct;
|
||||||
struct xfs_busy_extent;
|
struct xfs_busy_extent;
|
||||||
|
|
||||||
|
@ -170,7 +171,7 @@ typedef struct xfs_trans {
|
||||||
xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint);
|
xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint);
|
||||||
xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, xfs_km_flags_t);
|
xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, xfs_km_flags_t);
|
||||||
xfs_trans_t *xfs_trans_dup(xfs_trans_t *);
|
xfs_trans_t *xfs_trans_dup(xfs_trans_t *);
|
||||||
int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint,
|
int xfs_trans_reserve(struct xfs_trans *, struct xfs_trans_res *,
|
||||||
uint, uint);
|
uint, uint);
|
||||||
void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t);
|
void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t);
|
||||||
|
|
||||||
|
|
|
@ -547,7 +547,8 @@ xfs_calc_attrsetm_reservation(
|
||||||
* Since the runtime attribute transaction space is dependent on the total
|
* Since the runtime attribute transaction space is dependent on the total
|
||||||
* blocks needed for the 1st bmap, here we calculate out the space unit for
|
* blocks needed for the 1st bmap, here we calculate out the space unit for
|
||||||
* one block so that the caller could figure out the total space according
|
* one block so that the caller could figure out the total space according
|
||||||
* to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp).
|
* to the attibute extent length in blocks by:
|
||||||
|
* ext * M_RES(mp)->tr_attrsetrt.tr_logres
|
||||||
*/
|
*/
|
||||||
STATIC uint
|
STATIC uint
|
||||||
xfs_calc_attrsetrt_reservation(
|
xfs_calc_attrsetrt_reservation(
|
||||||
|
@ -619,14 +620,14 @@ xfs_calc_qm_setqlim_reservation(
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocating quota on disk if needed.
|
* Allocating quota on disk if needed.
|
||||||
* the write transaction log space: XFS_WRITE_LOG_RES(mp)
|
* the write transaction log space: M_RES(mp)->tr_write.tr_logres
|
||||||
* the unit of quota allocation: one system block size
|
* the unit of quota allocation: one system block size
|
||||||
*/
|
*/
|
||||||
STATIC uint
|
STATIC uint
|
||||||
xfs_calc_qm_dqalloc_reservation(
|
xfs_calc_qm_dqalloc_reservation(
|
||||||
struct xfs_mount *mp)
|
struct xfs_mount *mp)
|
||||||
{
|
{
|
||||||
return XFS_WRITE_LOG_RES(mp) +
|
return M_RES(mp)->tr_write.tr_logres +
|
||||||
xfs_calc_buf_res(1,
|
xfs_calc_buf_res(1,
|
||||||
XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1);
|
XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,9 @@ struct xfs_trans_resv {
|
||||||
struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */
|
struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* shorthand way of accessing reservation structure */
|
||||||
|
#define M_RES(mp) (&(mp)->m_resv)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Per-extent log reservation for the allocation btree changes
|
* Per-extent log reservation for the allocation btree changes
|
||||||
* involved in freeing or allocating an extent.
|
* involved in freeing or allocating an extent.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче