|
@@ -552,6 +552,9 @@ xfs_reflink_trim_irec_to_next_cow(
|
|
|
*
|
|
|
* If cancel_real is true this function cancels all COW fork extents for the
|
|
|
* inode; if cancel_real is false, real extents are not cleared.
|
|
|
+ *
|
|
|
+ * Caller must have already joined the inode to the current transaction. The
|
|
|
+ * inode will be joined to the transaction returned to the caller.
|
|
|
*/
|
|
|
int
|
|
|
xfs_reflink_cancel_cow_blocks(
|
|
@@ -592,7 +595,6 @@ xfs_reflink_cancel_cow_blocks(
|
|
|
if (error)
|
|
|
break;
|
|
|
} else if (del.br_state == XFS_EXT_UNWRITTEN || cancel_real) {
|
|
|
- xfs_trans_ijoin(*tpp, ip, 0);
|
|
|
xfs_defer_init(&dfops, &firstfsb);
|
|
|
|
|
|
/* Free the CoW orphan record. */
|
|
@@ -1570,6 +1572,7 @@ xfs_reflink_clear_inode_flag(
|
|
|
* We didn't find any shared blocks so turn off the reflink flag.
|
|
|
* First, get rid of any leftover CoW mappings.
|
|
|
*/
|
|
|
+ xfs_trans_ijoin(*tpp, ip, 0);
|
|
|
error = xfs_reflink_cancel_cow_blocks(ip, tpp, 0, NULLFILEOFF, true);
|
|
|
if (error)
|
|
|
return error;
|
|
@@ -1578,7 +1581,6 @@ xfs_reflink_clear_inode_flag(
|
|
|
trace_xfs_reflink_unset_inode_flag(ip);
|
|
|
ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
|
|
|
xfs_inode_clear_cowblocks_tag(ip);
|
|
|
- xfs_trans_ijoin(*tpp, ip, 0);
|
|
|
xfs_trans_log_inode(*tpp, ip, XFS_ILOG_CORE);
|
|
|
|
|
|
return error;
|