[XFS] Move xfs_attr_rolltrans to xfs_trans_roll

Move it from the attr code to the transaction code and make
the attr code call the new function.

We rolltrans is really usefull whenever we want to use rolling
transaction, should be generic, it isn't dependent on any part
of the attr code anyway.

We use this excuse to change all the:

if ((error = xfs_attr_rolltrans()))

calls into:

error = xfs_trans_roll();

if (error)

SGI-PV: 981498

SGI-Modid: xfs-linux-melb:xfs-kern:31729a

Signed-off-by: Niv Sardi <xaiki@sgi.com>
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
Niv Sardi 2008-08-13 16:05:49 +10:00 committed by Lachlan McIlroy
parent a738159df2
commit 322ff6b8cd
5 changed files with 92 additions and 79 deletions

View File

@ -400,7 +400,9 @@ xfs_attr_set_int(xfs_inode_t *dp, struct xfs_name *name,
* Commit the leaf transformation. We'll need another (linked) * Commit the leaf transformation. We'll need another (linked)
* transaction to add the new attribute to the leaf. * transaction to add the new attribute to the leaf.
*/ */
if ((error = xfs_attr_rolltrans(&args.trans, dp)))
error = xfs_trans_roll(&args.trans, dp);
if (error)
goto out; goto out;
} }
@ -980,7 +982,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
* Commit the current trans (including the inode) and start * Commit the current trans (including the inode) and start
* a new one. * a new one.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
return (error); return (error);
/* /*
@ -994,7 +997,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
* Commit the transaction that added the attr name so that * Commit the transaction that added the attr name so that
* later routines can manage their own transactions. * later routines can manage their own transactions.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
return (error); return (error);
/* /*
@ -1083,7 +1087,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
/* /*
* Commit the remove and start the next trans in series. * Commit the remove and start the next trans in series.
*/ */
error = xfs_attr_rolltrans(&args->trans, dp); error = xfs_trans_roll(&args->trans, dp);
} else if (args->rmtblkno > 0) { } else if (args->rmtblkno > 0) {
/* /*
@ -1314,7 +1318,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
* Commit the node conversion and start the next * Commit the node conversion and start the next
* trans in the chain. * trans in the chain.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
goto out; goto out;
goto restart; goto restart;
@ -1365,7 +1370,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
* Commit the leaf addition or btree split and start the next * Commit the leaf addition or btree split and start the next
* trans in the chain. * trans in the chain.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
goto out; goto out;
/* /*
@ -1465,7 +1471,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
/* /*
* Commit and start the next trans in the chain. * Commit and start the next trans in the chain.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
goto out; goto out;
} else if (args->rmtblkno > 0) { } else if (args->rmtblkno > 0) {
@ -1597,7 +1604,8 @@ xfs_attr_node_removename(xfs_da_args_t *args)
/* /*
* Commit the Btree join operation and start a new trans. * Commit the Btree join operation and start a new trans.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
goto out; goto out;
} }
@ -2098,7 +2106,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
/* /*
* Start the next trans in the chain. * Start the next trans in the chain.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, dp))) error = xfs_trans_roll(&args->trans, dp);
if (error)
return (error); return (error);
} }
@ -2248,7 +2257,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
/* /*
* Close out trans and start the next one in the chain. * Close out trans and start the next one in the chain.
*/ */
if ((error = xfs_attr_rolltrans(&args->trans, args->dp))) error = xfs_trans_roll(&args->trans, args->dp);
if (error)
return (error); return (error);
} }
return(0); return(0);

View File

@ -2498,9 +2498,7 @@ xfs_attr_leaf_clearflag(xfs_da_args_t *args)
/* /*
* Commit the flag value change and start the next trans in series. * Commit the flag value change and start the next trans in series.
*/ */
error = xfs_attr_rolltrans(&args->trans, args->dp); return xfs_trans_roll(&args->trans, args->dp);
return(error);
} }
/* /*
@ -2547,9 +2545,7 @@ xfs_attr_leaf_setflag(xfs_da_args_t *args)
/* /*
* Commit the flag value change and start the next trans in series. * Commit the flag value change and start the next trans in series.
*/ */
error = xfs_attr_rolltrans(&args->trans, args->dp); return xfs_trans_roll(&args->trans, args->dp);
return(error);
} }
/* /*
@ -2665,7 +2661,7 @@ xfs_attr_leaf_flipflags(xfs_da_args_t *args)
/* /*
* Commit the flag value change and start the next trans in series. * Commit the flag value change and start the next trans in series.
*/ */
error = xfs_attr_rolltrans(&args->trans, args->dp); error = xfs_trans_roll(&args->trans, args->dp);
return(error); return(error);
} }
@ -2723,7 +2719,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp)
/* /*
* Commit the invalidate and start the next transaction. * Commit the invalidate and start the next transaction.
*/ */
error = xfs_attr_rolltrans(trans, dp); error = xfs_trans_roll(trans, dp);
return (error); return (error);
} }
@ -2825,7 +2821,8 @@ xfs_attr_node_inactive(xfs_trans_t **trans, xfs_inode_t *dp, xfs_dabuf_t *bp,
/* /*
* Atomically commit the whole invalidate stuff. * Atomically commit the whole invalidate stuff.
*/ */
if ((error = xfs_attr_rolltrans(trans, dp))) error = xfs_trans_roll(trans, dp);
if (error)
return (error); return (error);
} }
@ -2964,7 +2961,8 @@ xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,
/* /*
* Roll to next transaction. * Roll to next transaction.
*/ */
if ((error = xfs_attr_rolltrans(trans, dp))) error = xfs_trans_roll(trans, dp);
if (error)
return (error); return (error);
} }
@ -2974,60 +2972,3 @@ xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,
return(0); return(0);
} }
/*
* Roll from one trans in the sequence of PERMANENT transactions to the next.
*/
int
xfs_attr_rolltrans(xfs_trans_t **transp, xfs_inode_t *dp)
{
xfs_trans_t *trans;
unsigned int logres, count;
int error;
/*
* Ensure that the inode is always logged.
*/
trans = *transp;
xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE);
/*
* Copy the critical parameters from one trans to the next.
*/
logres = trans->t_log_res;
count = trans->t_log_count;
*transp = xfs_trans_dup(trans);
/*
* Commit the current transaction.
* If this commit failed, then it'd just unlock those items that
* are not marked ihold. That also means that a filesystem shutdown
* is in progress. The caller takes the responsibility to cancel
* the duplicate transaction that gets returned.
*/
if ((error = xfs_trans_commit(trans, 0)))
return (error);
trans = *transp;
/*
* Reserve space in the log for th next transaction.
* This also pushes items in the "AIL", the list of logged items,
* out to disk if they are taking up space at the tail of the log
* that we want to use. This requires that either nothing be locked
* across this call, or that anything that is locked be logged in
* the prior and the next transactions.
*/
error = xfs_trans_reserve(trans, 0, logres, 0,
XFS_TRANS_PERM_LOG_RES, count);
/*
* Ensure that the inode is in the new transaction and locked.
*/
if (!error) {
xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL);
xfs_trans_ihold(trans, dp);
}
return (error);
}

View File

@ -274,6 +274,4 @@ int xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp,
struct xfs_dabuf *leaf2_bp); struct xfs_dabuf *leaf2_bp);
int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize,
int *local); int *local);
int xfs_attr_rolltrans(struct xfs_trans **transp, struct xfs_inode *dp);
#endif /* __XFS_ATTR_LEAF_H__ */ #endif /* __XFS_ATTR_LEAF_H__ */

View File

@ -43,6 +43,7 @@
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_trans_priv.h" #include "xfs_trans_priv.h"
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_inode_item.h"
STATIC void xfs_trans_apply_sb_deltas(xfs_trans_t *); STATIC void xfs_trans_apply_sb_deltas(xfs_trans_t *);
@ -1216,6 +1217,68 @@ xfs_trans_free(
kmem_zone_free(xfs_trans_zone, tp); kmem_zone_free(xfs_trans_zone, tp);
} }
/*
* Roll from one trans in the sequence of PERMANENT transactions to
* the next: permanent transactions are only flushed out when
* committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon
* as possible to let chunks of it go to the log. So we commit the
* chunk we've been working on and get a new transaction to continue.
*/
int
xfs_trans_roll(
struct xfs_trans **tpp,
struct xfs_inode *dp)
{
struct xfs_trans *trans;
unsigned int logres, count;
int error;
/*
* Ensure that the inode is always logged.
*/
trans = *tpp;
xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE);
/*
* Copy the critical parameters from one trans to the next.
*/
logres = trans->t_log_res;
count = trans->t_log_count;
*tpp = xfs_trans_dup(trans);
/*
* Commit the current transaction.
* If this commit failed, then it'd just unlock those items that
* are not marked ihold. That also means that a filesystem shutdown
* is in progress. The caller takes the responsibility to cancel
* the duplicate transaction that gets returned.
*/
error = xfs_trans_commit(trans, 0);
if (error)
return (error);
trans = *tpp;
/*
* Reserve space in the log for th next transaction.
* This also pushes items in the "AIL", the list of logged items,
* out to disk if they are taking up space at the tail of the log
* that we want to use. This requires that either nothing be locked
* across this call, or that anything that is locked be logged in
* the prior and the next transactions.
*/
error = xfs_trans_reserve(trans, 0, logres, 0,
XFS_TRANS_PERM_LOG_RES, count);
/*
* Ensure that the inode is in the new transaction and locked.
*/
if (error)
return error;
xfs_trans_ijoin(trans, dp, XFS_ILOCK_EXCL);
xfs_trans_ihold(trans, dp);
return 0;
}
/* /*
* THIS SHOULD BE REWRITTEN TO USE xfs_trans_next_item(). * THIS SHOULD BE REWRITTEN TO USE xfs_trans_next_item().

View File

@ -986,6 +986,7 @@ int _xfs_trans_commit(xfs_trans_t *,
int *); int *);
#define xfs_trans_commit(tp, flags) _xfs_trans_commit(tp, flags, NULL) #define xfs_trans_commit(tp, flags) _xfs_trans_commit(tp, flags, NULL)
void xfs_trans_cancel(xfs_trans_t *, int); void xfs_trans_cancel(xfs_trans_t *, int);
int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *);
int xfs_trans_ail_init(struct xfs_mount *); int xfs_trans_ail_init(struct xfs_mount *);
void xfs_trans_ail_destroy(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *);
void xfs_trans_push_ail(struct xfs_mount *, xfs_lsn_t); void xfs_trans_push_ail(struct xfs_mount *, xfs_lsn_t);