Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 108306
b: refs/heads/master
c: 322ff6b
h: refs/heads/master
v: v3
  • Loading branch information
Niv Sardi authored and Lachlan McIlroy committed Aug 13, 2008
1 parent f57fe87 commit 9999b06
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 80 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a738159df2b97398f960978272944cbdd8f726ef
refs/heads/master: 322ff6b8cd54feb1c4c0426630f3642ab1dd2176
30 changes: 20 additions & 10 deletions trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 9999b06

Please sign in to comment.