Explorar o código

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>
Chris Mason %!s(int64=15) %!d(string=hai) anos
pai
achega
3f7c579c41
Modificáronse 2 ficheiros con 8 adicións e 6 borrados
  1. 0 5
      fs/btrfs/file.c
  2. 8 1
      fs/btrfs/inode.c

+ 0 - 5
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

+ 8 - 1
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,