From 3f7c579c41a3d20af76fd6ff1f6b949edf105fd1 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Wed, 26 May 2010 10:59:53 -0400 Subject: 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 --- fs/btrfs/file.c | 5 ----- fs/btrfs/inode.c | 9 ++++++++- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'fs/btrfs') 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, 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 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, 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, -- cgit v1.2.1