aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r--fs/xfs/xfs_inode.c52
1 files changed, 22 insertions, 30 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index d7514f8317df..63e66890f063 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1699,33 +1699,16 @@ xfs_itruncate_finish(
1699 * blocks in the file system, but oh well. 1699 * blocks in the file system, but oh well.
1700 */ 1700 */
1701 xfs_bmap_cancel(&free_list); 1701 xfs_bmap_cancel(&free_list);
1702 if (committed) { 1702 if (committed)
1703 /* 1703 goto error_join;
1704 * If the passed in transaction committed
1705 * in xfs_bmap_finish(), then we want to
1706 * add the inode to this one before returning.
1707 * This keeps things simple for the higher
1708 * level code, because it always knows that
1709 * the inode is locked and held in the
1710 * transaction that returns to it whether
1711 * errors occur or not. We don't mark the
1712 * inode dirty so that this transaction can
1713 * be easily aborted if possible.
1714 */
1715 xfs_trans_ijoin(ntp, ip,
1716 XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1717 xfs_trans_ihold(ntp, ip);
1718 }
1719 return error; 1704 return error;
1720 } 1705 }
1721 1706
1722 if (committed) { 1707 if (committed) {
1723 /* 1708 /*
1724 * The first xact was committed, 1709 * The first xact was committed, so add the inode to
1725 * so add the inode to the new one. 1710 * the new one. Mark it dirty so it will be logged and
1726 * Mark it dirty so it will be logged 1711 * moved forward in the log as part of every commit.
1727 * and moved forward in the log as
1728 * part of every commit.
1729 */ 1712 */
1730 xfs_trans_ijoin(ntp, ip, 1713 xfs_trans_ijoin(ntp, ip,
1731 XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); 1714 XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
@@ -1733,19 +1716,16 @@ xfs_itruncate_finish(
1733 xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE); 1716 xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
1734 } 1717 }
1735 ntp = xfs_trans_dup(ntp); 1718 ntp = xfs_trans_dup(ntp);
1736 (void) xfs_trans_commit(*tp, 0); 1719 error = xfs_trans_commit(*tp, 0);
1737 *tp = ntp; 1720 *tp = ntp;
1721 if (error)
1722 goto error_join;
1738 error = xfs_trans_reserve(ntp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, 1723 error = xfs_trans_reserve(ntp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0,
1739 XFS_TRANS_PERM_LOG_RES, 1724 XFS_TRANS_PERM_LOG_RES,
1740 XFS_ITRUNCATE_LOG_COUNT); 1725 XFS_ITRUNCATE_LOG_COUNT);
1741 /*
1742 * Add the inode being truncated to the next chained
1743 * transaction.
1744 */
1745 xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1746 xfs_trans_ihold(ntp, ip);
1747 if (error) 1726 if (error)
1748 return (error); 1727 goto error_join;
1728
1749 } 1729 }
1750 /* 1730 /*
1751 * Only update the size in the case of the data fork, but 1731 * Only update the size in the case of the data fork, but
@@ -1777,6 +1757,18 @@ xfs_itruncate_finish(
1777 (ip->i_d.di_nextents == 0)); 1757 (ip->i_d.di_nextents == 0));
1778 xfs_itrunc_trace(XFS_ITRUNC_FINISH2, ip, 0, new_size, 0, 0); 1758 xfs_itrunc_trace(XFS_ITRUNC_FINISH2, ip, 0, new_size, 0, 0);
1779 return 0; 1759 return 0;
1760
1761error_join:
1762 /*
1763 * Add the inode being truncated to the next chained transaction. This
1764 * keeps things simple for the higher level code, because it always
1765 * knows that the inode is locked and held in the transaction that
1766 * returns to it whether errors occur or not. We don't mark the inode
1767 * dirty so that this transaction can be easily aborted if possible.
1768 */
1769 xfs_trans_ijoin(ntp, ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
1770 xfs_trans_ihold(ntp, ip);
1771 return error;
1780} 1772}
1781 1773
1782 1774