aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2015-03-13 15:12:23 -0400
committerChris Mason <clm@fb.com>2015-03-13 16:46:59 -0400
commit6a41dd0922e3c63e677c2d8f7906ce6a3e097af1 (patch)
tree80d324d61437f08db1e4c67d3255c6eb96965792 /fs/btrfs
parent8461a3de770477a9a7b8eeaebcc4804dbc26ca38 (diff)
Btrfs: account for the correct number of extents for delalloc reservations
Direct IO can easily pass in an buffer that is greater than BTRFS_MAX_EXTENT_SIZE, so take this into account when reserving extents in the delalloc reservation code. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/extent-tree.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 92146a5afdc1..96c613bfe157 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5110,7 +5110,11 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
5110 num_bytes = ALIGN(num_bytes, root->sectorsize); 5110 num_bytes = ALIGN(num_bytes, root->sectorsize);
5111 5111
5112 spin_lock(&BTRFS_I(inode)->lock); 5112 spin_lock(&BTRFS_I(inode)->lock);
5113 BTRFS_I(inode)->outstanding_extents++; 5113 nr_extents = (unsigned)div64_u64(num_bytes +
5114 BTRFS_MAX_EXTENT_SIZE - 1,
5115 BTRFS_MAX_EXTENT_SIZE);
5116 BTRFS_I(inode)->outstanding_extents += nr_extents;
5117 nr_extents = 0;
5114 5118
5115 if (BTRFS_I(inode)->outstanding_extents > 5119 if (BTRFS_I(inode)->outstanding_extents >
5116 BTRFS_I(inode)->reserved_extents) 5120 BTRFS_I(inode)->reserved_extents)