Skip to content

Commit

Permalink
Btrfs: move O_DIRECT space reservation to btrfs_direct_IO
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chris Mason committed May 26, 2010
1 parent 4845e44 commit 3f7c579
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
5 changes: 0 additions & 5 deletions fs/btrfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 8 additions & 1 deletion fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 3f7c579

Please sign in to comment.