Btrfs: move O_DIRECT space reservation to btrfs_direct_IO

This moves the delalloc space reservation done for O_DIRECT
into btrfs_direct_IO.  This way we don't leak reserved space
if the generic O_DIRECT write code errors out before it
calls into btrfs_direct_IO.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 54556ca..79437c5 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -888,14 +888,9 @@
 	BTRFS_I(inode)->sequence++;
 
 	if (unlikely(file->f_flags & O_DIRECT)) {
-		ret = btrfs_delalloc_reserve_space(inode, count);
-		if (ret)
-			goto out;
-
 		num_written = generic_file_direct_write(iocb, iov, &nr_segs,
 							pos, ppos, count,
 							ocount);
-
 		/*
 		 * the generic O_DIRECT will update in-memory i_size after the
 		 * DIOs are done.  But our endio handlers that update the on
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 00aefbd..ca9d550 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5602,9 +5602,16 @@
 	ssize_t ret;
 	int writing = rw & WRITE;
 	int write_bits = 0;
+	size_t count = iov_length(iov, nr_segs);
 
 	lockstart = offset;
-	lockend = offset + iov_length(iov, nr_segs) - 1;
+	lockend = offset + count - 1;
+
+	if (writing) {
+		ret = btrfs_delalloc_reserve_space(inode, count);
+		if (ret)
+			goto out;
+	}
 
 	while (1) {
 		lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend,