aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/inode.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b0292333fd84..5a5b902e647f 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -7155,6 +7155,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
7155 u64 start = iblock << inode->i_blkbits; 7155 u64 start = iblock << inode->i_blkbits;
7156 u64 lockstart, lockend; 7156 u64 lockstart, lockend;
7157 u64 len = bh_result->b_size; 7157 u64 len = bh_result->b_size;
7158 u64 orig_len = len;
7158 int unlock_bits = EXTENT_LOCKED; 7159 int unlock_bits = EXTENT_LOCKED;
7159 int ret = 0; 7160 int ret = 0;
7160 7161
@@ -7290,9 +7291,11 @@ unlock:
7290 if (start + len > i_size_read(inode)) 7291 if (start + len > i_size_read(inode))
7291 i_size_write(inode, start + len); 7292 i_size_write(inode, start + len);
7292 7293
7293 spin_lock(&BTRFS_I(inode)->lock); 7294 if (len < orig_len) {
7294 BTRFS_I(inode)->outstanding_extents++; 7295 spin_lock(&BTRFS_I(inode)->lock);
7295 spin_unlock(&BTRFS_I(inode)->lock); 7296 BTRFS_I(inode)->outstanding_extents++;
7297 spin_unlock(&BTRFS_I(inode)->lock);
7298 }
7296 7299
7297 ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, 7300 ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart,
7298 lockstart + len - 1, EXTENT_DELALLOC, NULL, 7301 lockstart + len - 1, EXTENT_DELALLOC, NULL,
@@ -8073,8 +8076,6 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
8073 else if (ret >= 0 && (size_t)ret < count) 8076 else if (ret >= 0 && (size_t)ret < count)
8074 btrfs_delalloc_release_space(inode, 8077 btrfs_delalloc_release_space(inode,
8075 count - (size_t)ret); 8078 count - (size_t)ret);
8076 else
8077 btrfs_delalloc_release_metadata(inode, 0);
8078 } 8079 }
8079out: 8080out:
8080 if (wakeup) 8081 if (wakeup)