Btrfs: Add O_DIRECT read and write (writes == buffered + cache flush)

This adds basic O_DIRECT read and write support.  In the write case, we
just do a normal buffered write followed by a cache flush.  O_DIRECT +
O_SYNC are required to trigger metadata syncs.

In the read case, there is a basic btrfs_get_block call for use by
the generic O_DIRECT code.  This does honor multi-volume mapping rules
but it skips all checksumming.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 5fa4504..5b93864 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -796,8 +796,6 @@
 		     PAGE_CACHE_SIZE / (sizeof(struct page *)));
 	pinned[0] = NULL;
 	pinned[1] = NULL;
-	if (file->f_flags & O_DIRECT)
-		return -EINVAL;
 
 	pos = *ppos;
 	start_pos = pos;
@@ -909,6 +907,15 @@
 				      start_pos, num_written);
 		if (err < 0)
 			num_written = err;
+	} else if (num_written > 0 && (file->f_flags & O_DIRECT)) {
+		do_sync_mapping_range(inode->i_mapping, start_pos,
+				      start_pos + num_written - 1,
+				      SYNC_FILE_RANGE_WRITE |
+				      SYNC_FILE_RANGE_WAIT_AFTER);
+
+		invalidate_mapping_pages(inode->i_mapping,
+		      start_pos >> PAGE_CACHE_SHIFT,
+		     (start_pos + num_written - 1) >> PAGE_CACHE_SHIFT);
 	}
 	current->backing_dev_info = NULL;
 	return num_written ? num_written : err;