to = user_pos + user_len;
        struct page *tmppage;
 
-       ocfs2_zero_new_buffers(wc->w_target_page, from, to);
+       if (wc->w_target_page)
+               ocfs2_zero_new_buffers(wc->w_target_page, from, to);
 
        for(i = 0; i < wc->w_num_pages; i++) {
                tmppage = wc->w_pages[i];
 
-               if (page_has_buffers(tmppage)) {
+               if (tmppage && page_has_buffers(tmppage)) {
                        if (ocfs2_should_order_data(inode))
                                ocfs2_jbd2_file_inode(wc->w_handle, inode);
 
                wc->w_num_pages = 1;
                start = target_index;
        }
+       end_index = (user_pos + user_len - 1) >> PAGE_CACHE_SHIFT;
 
        for(i = 0; i < wc->w_num_pages; i++) {
                index = start + i;
 
-               if (index == target_index && mmap_page) {
+               if (index >= target_index && index <= end_index &&
+                   wc->w_type == OCFS2_WRITE_MMAP) {
                        /*
                         * ocfs2_pagemkwrite() is a little different
                         * and wants us to directly use the page
                        page_cache_get(mmap_page);
                        wc->w_pages[i] = mmap_page;
                        wc->w_target_locked = true;
+               } else if (index >= target_index && index <= end_index &&
+                          wc->w_type == OCFS2_WRITE_DIRECT) {
+                       /* Direct write has no mapping page. */
+                       wc->w_pages[i] = NULL;
+                       continue;
                } else {
                        wc->w_pages[i] = find_or_create_page(mapping, index,
                                                             GFP_NOFS);
        for(i = 0; i < wc->w_num_pages; i++) {
                int tmpret;
 
+               /* This is the direct io target page. */
+               if (wc->w_pages[i] == NULL) {
+                       p_blkno++;
+                       continue;
+               }
+
                tmpret = ocfs2_prepare_page_for_write(inode, &p_blkno, wc,
                                                      wc->w_pages[i], cpos,
                                                      user_pos, user_len,
                ocfs2_free_alloc_context(meta_ac);
 
 success:
-       *pagep = wc->w_target_page;
+       if (pagep)
+               *pagep = wc->w_target_page;
        *fsdata = wc;
        return 0;
 out_quota:
                goto out_write_size;
        }
 
-       if (unlikely(copied < len)) {
+       if (unlikely(copied < len) && wc->w_target_page) {
                if (!PageUptodate(wc->w_target_page))
                        copied = 0;
 
                ocfs2_zero_new_buffers(wc->w_target_page, start+copied,
                                       start+len);
        }
-       flush_dcache_page(wc->w_target_page);
+       if (wc->w_target_page)
+               flush_dcache_page(wc->w_target_page);
 
        for(i = 0; i < wc->w_num_pages; i++) {
                tmppage = wc->w_pages[i];
 
+               /* This is the direct io target page. */
+               if (tmppage == NULL)
+                       continue;
+
                if (tmppage == wc->w_target_page) {
                        from = wc->w_target_from;
                        to = wc->w_target_to;