mlog_entry_void();
 
-       down_write(&OCFS2_I(inode)->ip_alloc_sem);
-
        new_highest_cpos = ocfs2_clusters_for_bytes(osb->sb,
                                                     i_size_read(inode));
 
        goto start;
 
 bail:
-       up_write(&OCFS2_I(inode)->ip_alloc_sem);
 
        ocfs2_schedule_truncate_log_flush(osb, 1);
 
 
                   (unsigned long long)OCFS2_I(inode)->ip_blkno,
                   (unsigned long long)new_i_size);
 
-       unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
-       truncate_inode_pages(inode->i_mapping, new_i_size);
-
        fe = (struct ocfs2_dinode *) di_bh->b_data;
        if (!OCFS2_IS_VALID_DINODE(fe)) {
                OCFS2_RO_ON_INVALID_DINODE(inode->i_sb, fe);
        if (new_i_size == le64_to_cpu(fe->i_size))
                goto bail;
 
+       down_write(&OCFS2_I(inode)->ip_alloc_sem);
+
        /* This forces other nodes to sync and drop their pages. Do
         * this even if we have a truncate without allocation change -
         * ocfs2 cluster sizes can be much greater than page size, so
         * we have to truncate them anyway.  */
        status = ocfs2_data_lock(inode, 1);
        if (status < 0) {
+               up_write(&OCFS2_I(inode)->ip_alloc_sem);
+
                mlog_errno(status);
                goto bail;
        }
 
+       unmap_mapping_range(inode->i_mapping, new_i_size + PAGE_SIZE - 1, 0, 1);
+       truncate_inode_pages(inode->i_mapping, new_i_size);
+
        /* alright, we're going to need to do a full blown alloc size
         * change. Orphan the inode so that recovery can complete the
         * truncate if necessary. This does the task of marking
 bail_unlock_data:
        ocfs2_data_unlock(inode, 1);
 
+       up_write(&OCFS2_I(inode)->ip_alloc_sem);
+
 bail:
 
        mlog_exit(status);