mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 06:52:07 +00:00
xfs: simplify inode to transaction joining
Currently we need to either call IHOLD or xfs_trans_ihold on an inode when joining it to a transaction via xfs_trans_ijoin. This patches instead makes xfs_trans_ijoin usable on it's own by doing an implicity xfs_trans_ihold, which also allows us to drop the third argument. For the case where we want to hold a reference on the inode a xfs_trans_ijoin_ref wrapper is added which does the IHOLD and marks the inode for needing an xfs_iput. In addition to the cleaner interface to the caller this also simplifies the implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
4d16e9246f
commit
898621d5a7
19 changed files with 103 additions and 247 deletions
|
@ -33,6 +33,7 @@
|
|||
#include "xfs_btree.h"
|
||||
#include "xfs_trans_priv.h"
|
||||
#include "xfs_inode_item.h"
|
||||
#include "xfs_trace.h"
|
||||
|
||||
#ifdef XFS_TRANS_DEBUG
|
||||
STATIC void
|
||||
|
@ -42,7 +43,6 @@ xfs_trans_inode_broot_debug(
|
|||
#define xfs_trans_inode_broot_debug(ip)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Get an inode and join it to the transaction.
|
||||
*/
|
||||
|
@ -58,32 +58,31 @@ xfs_trans_iget(
|
|||
int error;
|
||||
|
||||
error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp);
|
||||
if (!error && tp)
|
||||
xfs_trans_ijoin(tp, *ipp, lock_flags);
|
||||
if (!error && tp) {
|
||||
xfs_trans_ijoin(tp, *ipp);
|
||||
(*ipp)->i_itemp->ili_lock_flags = lock_flags;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the locked inode to the transaction.
|
||||
* The inode must be locked, and it cannot be associated with any
|
||||
* transaction. The caller must specify the locks already held
|
||||
* on the inode.
|
||||
* Add a locked inode to the transaction.
|
||||
*
|
||||
* The inode must be locked, and it cannot be associated with any transaction.
|
||||
*/
|
||||
void
|
||||
xfs_trans_ijoin(
|
||||
xfs_trans_t *tp,
|
||||
xfs_inode_t *ip,
|
||||
uint lock_flags)
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_inode *ip)
|
||||
{
|
||||
xfs_inode_log_item_t *iip;
|
||||
|
||||
ASSERT(ip->i_transp == NULL);
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
ASSERT(lock_flags & XFS_ILOCK_EXCL);
|
||||
if (ip->i_itemp == NULL)
|
||||
xfs_inode_item_init(ip, ip->i_mount);
|
||||
iip = ip->i_itemp;
|
||||
ASSERT(iip->ili_flags == 0);
|
||||
ASSERT(iip->ili_lock_flags == 0);
|
||||
|
||||
/*
|
||||
* Get a log_item_desc to point at the new item.
|
||||
|
@ -92,15 +91,6 @@ xfs_trans_ijoin(
|
|||
|
||||
xfs_trans_inode_broot_debug(ip);
|
||||
|
||||
/*
|
||||
* If the IO lock is already held, mark that in the inode log item.
|
||||
*/
|
||||
if (lock_flags & XFS_IOLOCK_EXCL) {
|
||||
iip->ili_flags |= XFS_ILI_IOLOCKED_EXCL;
|
||||
} else if (lock_flags & XFS_IOLOCK_SHARED) {
|
||||
iip->ili_flags |= XFS_ILI_IOLOCKED_SHARED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize i_transp so we can find it with xfs_inode_incore()
|
||||
* in xfs_trans_iget() above.
|
||||
|
@ -108,27 +98,25 @@ xfs_trans_ijoin(
|
|||
ip->i_transp = tp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Mark the inode as not needing to be unlocked when the inode item's
|
||||
* IOP_UNLOCK() routine is called. The inode must already be locked
|
||||
* and associated with the given transaction.
|
||||
* Add a locked inode to the transaction.
|
||||
*
|
||||
*
|
||||
* Grabs a reference to the inode which will be dropped when the transaction
|
||||
* is commited. The inode will also be unlocked at that point. The inode
|
||||
* must be locked, and it cannot be associated with any transaction.
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
xfs_trans_ihold(
|
||||
xfs_trans_t *tp,
|
||||
xfs_inode_t *ip)
|
||||
xfs_trans_ijoin_ref(
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_inode *ip,
|
||||
uint lock_flags)
|
||||
{
|
||||
ASSERT(ip->i_transp == tp);
|
||||
ASSERT(ip->i_itemp != NULL);
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
|
||||
ip->i_itemp->ili_flags |= XFS_ILI_HOLD;
|
||||
xfs_trans_ijoin(tp, ip);
|
||||
IHOLD(ip);
|
||||
ip->i_itemp->ili_lock_flags = lock_flags;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This is called to mark the fields indicated in fieldmask as needing
|
||||
* to be logged when the transaction is committed. The inode must
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue