From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> When we commit a transaction with a dirtied inode, free the inode item once we're done, and check that we never ijoin a transaction twice. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- libxfs/trans.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libxfs/trans.c b/libxfs/trans.c index b0a04ecd..0f9f12b6 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -380,6 +380,7 @@ libxfs_trans_ijoin( xfs_inode_log_item_t *iip; ASSERT(ip->i_transp == NULL); + ASSERT(ip->i_temp == NULL); if (ip->i_itemp == NULL) xfs_inode_item_init(ip, ip->i_mount); iip = ip->i_itemp; @@ -842,11 +843,8 @@ inode_item_done( mp = iip->ili_item.li_mountp; ASSERT(ip != NULL); - if (!(iip->ili_fields & XFS_ILOG_ALL)) { - ip->i_transp = NULL; /* disassociate from transaction */ - iip->ili_flags = 0; /* reset all flags */ - return; - } + if (!(iip->ili_fields & XFS_ILOG_ALL)) + goto free; /* * Get the buffer containing the on-disk inode. @@ -867,7 +865,6 @@ inode_item_done( return; } - ip->i_transp = NULL; /* disassociate from transaction */ bp->b_log_item = NULL; /* remove log item */ bp->b_transp = NULL; /* remove xact ptr */ libxfs_writebuf(bp, 0); @@ -875,6 +872,10 @@ inode_item_done( fprintf(stderr, "flushing dirty inode %llu, buffer %p\n", ip->i_ino, bp); #endif +free: + ip->i_transp = NULL; /* disassociate from transaction */ + ip->i_itemp = NULL; + kmem_zone_free(xfs_ili_zone, iip); } static void