Skip to content

Commit

Permalink
[XFS] Move xfs_attr_rolltrans to xfs_trans_roll
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Niv Sardi authored and Lachlan McIlroy committed Aug 13, 2008
1 parent a738159 commit 322ff6b
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 79 deletions.
30 changes: 20 additions & 10 deletions fs/xfs/xfs_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
* 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;

}
Expand Down Expand Up @@ -980,7 +982,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
* Commit the current trans (including the inode) and start
* a new one.
*/
if ((error = xfs_attr_rolltrans(&args->trans, dp)))
error = xfs_trans_roll(&args->trans, dp);
if (error)
return (error);

/*
Expand All @@ -994,7 +997,8 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
* Commit the transaction that added the attr name so that
* 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);

/*
Expand Down Expand Up @@ -1083,7 +1087,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
/*
* 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) {
/*
Expand Down Expand Up @@ -1314,7 +1318,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
* Commit the node conversion 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 restart;
Expand Down Expand Up @@ -1365,7 +1370,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
* Commit the leaf addition or btree split 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;

/*
Expand Down Expand Up @@ -1465,7 +1471,8 @@ xfs_attr_node_addname(xfs_da_args_t *args)
/*
* 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;

} else if (args->rmtblkno > 0) {
Expand Down Expand Up @@ -1597,7 +1604,8 @@ xfs_attr_node_removename(xfs_da_args_t *args)
/*
* 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;
}

Expand Down Expand Up @@ -2098,7 +2106,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
/*
* 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);
}

Expand Down Expand Up @@ -2248,7 +2257,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
/*
* 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(0);
Expand Down
75 changes: 8 additions & 67 deletions fs/xfs/xfs_attr_leaf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
error = xfs_attr_rolltrans(&args->trans, args->dp);

return(error);
return xfs_trans_roll(&args->trans, args->dp);
}

/*
Expand Down Expand Up @@ -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.
*/
error = xfs_attr_rolltrans(&args->trans, args->dp);

return(error);
return xfs_trans_roll(&args->trans, args->dp);
}

/*
Expand Down Expand Up @@ -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.
*/
error = xfs_attr_rolltrans(&args->trans, args->dp);
error = xfs_trans_roll(&args->trans, args->dp);

return(error);
}
Expand Down Expand Up @@ -2723,7 +2719,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp)
/*
* Commit the invalidate and start the next transaction.
*/
error = xfs_attr_rolltrans(trans, dp);
error = xfs_trans_roll(trans, dp);

return (error);
}
Expand Down Expand Up @@ -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.
*/
if ((error = xfs_attr_rolltrans(trans, dp)))
error = xfs_trans_roll(trans, dp);
if (error)
return (error);
}

Expand Down Expand Up @@ -2964,7 +2961,8 @@ xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,
/*
* Roll to next transaction.
*/
if ((error = xfs_attr_rolltrans(trans, dp)))
error = xfs_trans_roll(trans, dp);
if (error)
return (error);
}

Expand All @@ -2974,60 +2972,3 @@ xfs_attr_leaf_freextent(xfs_trans_t **trans, xfs_inode_t *dp,

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);

}
2 changes: 0 additions & 2 deletions fs/xfs/xfs_attr_leaf.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,4 @@ int xfs_attr_leaf_order(struct xfs_dabuf *leaf1_bp,
struct xfs_dabuf *leaf2_bp);
int xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize,
int *local);
int xfs_attr_rolltrans(struct xfs_trans **transp, struct xfs_inode *dp);

#endif /* __XFS_ATTR_LEAF_H__ */
63 changes: 63 additions & 0 deletions fs/xfs/xfs_trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "xfs_quota.h"
#include "xfs_trans_priv.h"
#include "xfs_trans_space.h"
#include "xfs_inode_item.h"


STATIC void xfs_trans_apply_sb_deltas(xfs_trans_t *);
Expand Down Expand Up @@ -1216,6 +1217,68 @@ xfs_trans_free(
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().
Expand Down
1 change: 1 addition & 0 deletions fs/xfs/xfs_trans.h
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,7 @@ int _xfs_trans_commit(xfs_trans_t *,
int *);
#define xfs_trans_commit(tp, flags) _xfs_trans_commit(tp, flags, NULL)
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 *);
void xfs_trans_ail_destroy(struct xfs_mount *);
void xfs_trans_push_ail(struct xfs_mount *, xfs_lsn_t);
Expand Down

0 comments on commit 322ff6b

Please sign in to comment.