diff options
author | Josef Bacik <jbacik@fb.com> | 2015-03-13 15:12:23 -0400 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-03-13 16:46:59 -0400 |
commit | 6a41dd0922e3c63e677c2d8f7906ce6a3e097af1 (patch) | |
tree | 80d324d61437f08db1e4c67d3255c6eb96965792 /fs/btrfs | |
parent | 8461a3de770477a9a7b8eeaebcc4804dbc26ca38 (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.c | 6 |
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) |