]> git.hungrycats.org Git - linux/commitdiff
Btrfs: account for the correct number of extents for delalloc reservations
authorJosef Bacik <jbacik@fb.com>
Fri, 13 Mar 2015 19:12:23 +0000 (15:12 -0400)
committerZygo Blaxell <zblaxell@serenity.furryterror.org>
Sun, 19 Apr 2015 15:51:54 +0000 (11:51 -0400)
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>
(cherry picked from commit 6a41dd0922e3c63e677c2d8f7906ce6a3e097af1)

fs/btrfs/extent-tree.c

index 43af686b0378efcd7ef40078493ffcf9cff78471..9ad61b046a0552ad866f6621e4950f90b0a9fbd8 100644 (file)
@@ -5135,7 +5135,11 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
        num_bytes = ALIGN(num_bytes, root->sectorsize);
 
        spin_lock(&BTRFS_I(inode)->lock);
-       BTRFS_I(inode)->outstanding_extents++;
+       nr_extents = (unsigned)div64_u64(num_bytes +
+                                        BTRFS_MAX_EXTENT_SIZE - 1,
+                                        BTRFS_MAX_EXTENT_SIZE);
+       BTRFS_I(inode)->outstanding_extents += nr_extents;
+       nr_extents = 0;
 
        if (BTRFS_I(inode)->outstanding_extents >
            BTRFS_I(inode)->reserved_extents)