Merge git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml
[linux-2.6-block.git] / fs / xfs / xfs_reflink.c
index 270246943a065fff8224b36b225e2572e213ef05..cdbd342a5249988aeecadcc695ac2f51c6a3c085 100644 (file)
@@ -394,7 +394,7 @@ xfs_reflink_allocate_cow(
 
 retry:
        ASSERT(xfs_is_reflink_inode(ip));
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED));
+       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 
        /*
         * Even if the extent is not shared we might have a preallocation for
@@ -668,7 +668,7 @@ xfs_reflink_cancel_cow_range(
 
        /* Start a rolling transaction to remove the mappings */
        error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_write,
-                       0, 0, 0, &tp);
+                       0, 0, XFS_TRANS_NOFS, &tp);
        if (error)
                goto out;
 
@@ -741,7 +741,7 @@ xfs_reflink_end_cow(
                        (unsigned int)(end_fsb - offset_fsb),
                        XFS_DATA_FORK);
        error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_write,
-                       resblks, 0, XFS_TRANS_RESERVE, &tp);
+                       resblks, 0, XFS_TRANS_RESERVE | XFS_TRANS_NOFS, &tp);
        if (error)
                goto out;
 
@@ -762,10 +762,8 @@ xfs_reflink_end_cow(
                xfs_trim_extent(&del, offset_fsb, end_fsb - offset_fsb);
 
                /* Extent delete may have bumped ext forward */
-               if (!del.br_blockcount) {
-                       xfs_iext_prev(ifp, &icur);
-                       goto next_extent;
-               }
+               if (!del.br_blockcount)
+                       goto prev_extent;
 
                ASSERT(!isnullstartblock(got.br_startblock));
 
@@ -774,10 +772,8 @@ xfs_reflink_end_cow(
                 * speculatively preallocated CoW extents that have been
                 * allocated but have not yet been involved in a write.
                 */
-               if (got.br_state == XFS_EXT_UNWRITTEN) {
-                       xfs_iext_prev(ifp, &icur);
-                       goto next_extent;
-               }
+               if (got.br_state == XFS_EXT_UNWRITTEN)
+                       goto prev_extent;
 
                /* Unmap the old blocks in the data fork. */
                xfs_defer_init(&dfops, &firstfsb);
@@ -816,9 +812,12 @@ xfs_reflink_end_cow(
                error = xfs_defer_finish(&tp, &dfops);
                if (error)
                        goto out_defer;
-next_extent:
                if (!xfs_iext_get_extent(ifp, &icur, &got))
                        break;
+               continue;
+prev_extent:
+               if (!xfs_iext_prev_extent(ifp, &icur, &got))
+                       break;
        }
 
        error = xfs_trans_commit(tp);
@@ -1061,7 +1060,7 @@ xfs_reflink_ag_has_free_space(
                return 0;
 
        pag = xfs_perag_get(mp, agno);
-       if (xfs_ag_resv_critical(pag, XFS_AG_RESV_AGFL) ||
+       if (xfs_ag_resv_critical(pag, XFS_AG_RESV_RMAPBT) ||
            xfs_ag_resv_critical(pag, XFS_AG_RESV_METADATA))
                error = -ENOSPC;
        xfs_perag_put(pag);