/* First cluster allocated in a nonsparse extend */
        u32                             w_first_new_cpos;
 
+       /* Type of caller. Must be one of buffer, mmap, direct.  */
+       ocfs2_write_type_t              w_type;
+
        struct ocfs2_write_cluster_desc w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE];
 
        /*
 
 static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp,
                                  struct ocfs2_super *osb, loff_t pos,
-                                 unsigned len, struct buffer_head *di_bh)
+                                 unsigned len, ocfs2_write_type_t type,
+                                 struct buffer_head *di_bh)
 {
        u32 cend;
        struct ocfs2_write_ctxt *wc;
        wc->w_clen = cend - wc->w_cpos + 1;
        get_bh(di_bh);
        wc->w_di_bh = di_bh;
+       wc->w_type = type;
 
        if (unlikely(PAGE_CACHE_SHIFT > osb->s_clustersize_bits))
                wc->w_large_pages = 1;
        return ret;
 }
 
-int ocfs2_write_begin_nolock(struct file *filp,
-                            struct address_space *mapping,
-                            loff_t pos, unsigned len, unsigned flags,
+int ocfs2_write_begin_nolock(struct address_space *mapping,
+                            loff_t pos, unsigned len, ocfs2_write_type_t type,
                             struct page **pagep, void **fsdata,
                             struct buffer_head *di_bh, struct page *mmap_page)
 {
        int try_free = 1, ret1;
 
 try_again:
-       ret = ocfs2_alloc_write_ctxt(&wc, osb, pos, len, di_bh);
+       ret = ocfs2_alloc_write_ctxt(&wc, osb, pos, len, type, di_bh);
        if (ret) {
                mlog_errno(ret);
                return ret;
                        (unsigned long long)OCFS2_I(inode)->ip_blkno,
                        (long long)i_size_read(inode),
                        le32_to_cpu(di->i_clusters),
-                       pos, len, flags, mmap_page,
+                       pos, len, type, mmap_page,
                        clusters_to_alloc, extents_to_split);
 
        /*
         */
        down_write(&OCFS2_I(inode)->ip_alloc_sem);
 
-       ret = ocfs2_write_begin_nolock(file, mapping, pos, len, flags, pagep,
-                                      fsdata, di_bh, NULL);
+       ret = ocfs2_write_begin_nolock(mapping, pos, len, OCFS2_WRITE_BUFFER,
+                                      pagep, fsdata, di_bh, NULL);
        if (ret) {
                mlog_errno(ret);
                goto out_fail;
 
                           loff_t pos, unsigned len, unsigned copied,
                           struct page *page, void *fsdata);
 
-int ocfs2_write_begin_nolock(struct file *filp,
-                            struct address_space *mapping,
-                            loff_t pos, unsigned len, unsigned flags,
+typedef enum {
+       OCFS2_WRITE_BUFFER = 0,
+       OCFS2_WRITE_DIRECT,
+       OCFS2_WRITE_MMAP,
+} ocfs2_write_type_t;
+
+int ocfs2_write_begin_nolock(struct address_space *mapping,
+                            loff_t pos, unsigned len, ocfs2_write_type_t type,
                             struct page **pagep, void **fsdata,
                             struct buffer_head *di_bh, struct page *mmap_page);
 
 
        if (page->index == last_index)
                len = ((size - 1) & ~PAGE_CACHE_MASK) + 1;
 
-       ret = ocfs2_write_begin_nolock(file, mapping, pos, len, 0, &locked_page,
-                                      &fsdata, di_bh, page);
+       ret = ocfs2_write_begin_nolock(mapping, pos, len, OCFS2_WRITE_MMAP,
+                                      &locked_page, &fsdata, di_bh, page);
        if (ret) {
                if (ret != -ENOSPC)
                        mlog_errno(ret);