Commit 33b25808 authored by Chris Mason's avatar Chris Mason

Btrfs: allow more metadata chunk preallocation

On an FS where all of the space has not been allocated into chunks yet,
the enospc can return enospc just because the existing metadata chunks
are full.

We get around this by allowing more metadata chunks to be allocated up
to a certain limit, and finding the right limit is a little fuzzy.  The
problem is the reservations for delalloc would preallocate way too much
of the FS as metadata.  We need to start saying no and just force some
IO to happen.

But we also need to let a reasonable amount of the FS become metadata.
This bumps the hard limit up, later releases will have a better system.
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent f5a84ee3
...@@ -2976,10 +2976,10 @@ static int maybe_allocate_chunk(struct btrfs_root *root, ...@@ -2976,10 +2976,10 @@ static int maybe_allocate_chunk(struct btrfs_root *root,
free_space = btrfs_super_total_bytes(disk_super); free_space = btrfs_super_total_bytes(disk_super);
/* /*
* we allow the metadata to grow to a max of either 5gb or 5% of the * we allow the metadata to grow to a max of either 10gb or 5% of the
* space in the volume. * space in the volume.
*/ */
min_metadata = min((u64)5 * 1024 * 1024 * 1024, min_metadata = min((u64)10 * 1024 * 1024 * 1024,
div64_u64(free_space * 5, 100)); div64_u64(free_space * 5, 100));
if (info->total_bytes >= min_metadata) { if (info->total_bytes >= min_metadata) {
spin_unlock(&info->lock); spin_unlock(&info->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment