aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/file.c5
-rw-r--r--fs/btrfs/inode.c9
2 files changed, 8 insertions, 6 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 54556cae4497..79437c5eeb1e 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -888,14 +888,9 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
888 BTRFS_I(inode)->sequence++; 888 BTRFS_I(inode)->sequence++;
889 889
890 if (unlikely(file->f_flags & O_DIRECT)) { 890 if (unlikely(file->f_flags & O_DIRECT)) {
891 ret = btrfs_delalloc_reserve_space(inode, count);
892 if (ret)
893 goto out;
894
895 num_written = generic_file_direct_write(iocb, iov, &nr_segs, 891 num_written = generic_file_direct_write(iocb, iov, &nr_segs,
896 pos, ppos, count, 892 pos, ppos, count,
897 ocount); 893 ocount);
898
899 /* 894 /*
900 * the generic O_DIRECT will update in-memory i_size after the 895 * the generic O_DIRECT will update in-memory i_size after the
901 * DIOs are done. But our endio handlers that update the on 896 * DIOs are done. But our endio handlers that update the on
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 00aefbdcc2df..ca9d5501d340 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5602,9 +5602,16 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
5602 ssize_t ret; 5602 ssize_t ret;
5603 int writing = rw & WRITE; 5603 int writing = rw & WRITE;
5604 int write_bits = 0; 5604 int write_bits = 0;
5605 size_t count = iov_length(iov, nr_segs);
5605 5606
5606 lockstart = offset; 5607 lockstart = offset;
5607 lockend = offset + iov_length(iov, nr_segs) - 1; 5608 lockend = offset + count - 1;
5609
5610 if (writing) {
5611 ret = btrfs_delalloc_reserve_space(inode, count);
5612 if (ret)
5613 goto out;
5614 }
5608 5615
5609 while (1) { 5616 while (1) {
5610 lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend, 5617 lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend,