@@ -1429,9 +1429,7 @@ void
libxfs_irele(
struct xfs_inode *ip)
{
- if (ip->i_itemp)
- kmem_zone_free(xfs_ili_zone, ip->i_itemp);
- ip->i_itemp = NULL;
+ ASSERT(ip->i_itemp == NULL);
libxfs_idestroy(ip);
kmem_zone_free(xfs_inode_zone, ip);
}
@@ -820,6 +820,16 @@ _("Transaction block reservation exceeded! %u > %u\n"),
tp->t_flags |= (XFS_TRANS_SB_DIRTY | XFS_TRANS_DIRTY);
}
+void
+xfs_inode_item_put(
+ struct xfs_inode_log_item *iip)
+{
+ struct xfs_inode *ip = iip->ili_inode;
+
+ ip->i_itemp = NULL;
+ kmem_zone_free(xfs_ili_zone, iip);
+}
+
/*
* Transaction commital code follows (i.e. write to disk in libxfs)
@@ -844,7 +854,7 @@ inode_item_done(
if (!(iip->ili_fields & XFS_ILOG_ALL)) {
ip->i_transp = NULL; /* disassociate from transaction */
iip->ili_flags = 0; /* reset all flags */
- return;
+ goto free;
}
/*
@@ -854,7 +864,7 @@ inode_item_done(
if (error) {
fprintf(stderr, _("%s: warning - imap_to_bp failed (%d)\n"),
progname, error);
- return;
+ goto free;
}
/*
@@ -870,7 +880,7 @@ inode_item_done(
fprintf(stderr, _("%s: warning - iflush_int failed (%d)\n"),
progname, error);
libxfs_putbuf(bp);
- return;
+ goto free;
}
libxfs_writebuf(bp, 0);
@@ -878,6 +888,8 @@ inode_item_done(
fprintf(stderr, "flushing dirty inode %llu, buffer %p\n",
ip->i_ino, bp);
#endif
+free:
+ xfs_inode_item_put(iip);
}
static void
@@ -955,6 +967,7 @@ inode_item_unlock(
ip->i_transp = NULL;
iip->ili_flags = 0;
+ xfs_inode_item_put(iip);
}
/* Detach and unlock all of the items in a transaction */