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)
committerChris Mason <clm@fb.com>
Fri, 13 Mar 2015 20:46:59 +0000 (13:46 -0700)
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>
fs/btrfs/extent-tree.c

index 92146a5afdc1a5f5ec3bfc9adcd14089843ae322..96c613bfe157ea6e3b98ff65541c4e791e4cc077 100644 (file)
@@ -5110,7 +5110,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)