Loading fs/btrfs/extent-tree.c +15 −5 Original line number Diff line number Diff line Loading @@ -3235,7 +3235,8 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode, u64 bytes) { struct btrfs_space_info *data_sinfo; int ret = 0, committed = 0; u64 used; int ret = 0, committed = 0, flushed = 0; /* make sure bytes are sectorsize aligned */ bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1); Loading @@ -3247,12 +3248,21 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode, again: /* make sure we have enough space to handle the data first */ spin_lock(&data_sinfo->lock); if (data_sinfo->total_bytes - data_sinfo->bytes_used - data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved - data_sinfo->bytes_pinned - data_sinfo->bytes_readonly - data_sinfo->bytes_may_use - data_sinfo->bytes_super < bytes) { used = data_sinfo->bytes_used + data_sinfo->bytes_delalloc + data_sinfo->bytes_reserved + data_sinfo->bytes_pinned + data_sinfo->bytes_readonly + data_sinfo->bytes_may_use + data_sinfo->bytes_super; if (used + bytes > data_sinfo->total_bytes) { struct btrfs_trans_handle *trans; if (!flushed) { spin_unlock(&data_sinfo->lock); flush_delalloc(root, data_sinfo); flushed = 1; goto again; } /* * if we don't have enough free bytes in this space then we need * to alloc a new chunk. Loading fs/btrfs/volumes.c +6 −0 Original line number Diff line number Diff line Loading @@ -2250,6 +2250,12 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, if (!looped) calc_size = max_t(u64, min_stripe_size, calc_size); /* * we're about to do_div by the stripe_len so lets make sure * we end up with something bigger than a stripe */ calc_size = max_t(u64, calc_size, stripe_len * 4); do_div(calc_size, stripe_len); calc_size *= stripe_len; Loading Loading
fs/btrfs/extent-tree.c +15 −5 Original line number Diff line number Diff line Loading @@ -3235,7 +3235,8 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode, u64 bytes) { struct btrfs_space_info *data_sinfo; int ret = 0, committed = 0; u64 used; int ret = 0, committed = 0, flushed = 0; /* make sure bytes are sectorsize aligned */ bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1); Loading @@ -3247,12 +3248,21 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode, again: /* make sure we have enough space to handle the data first */ spin_lock(&data_sinfo->lock); if (data_sinfo->total_bytes - data_sinfo->bytes_used - data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved - data_sinfo->bytes_pinned - data_sinfo->bytes_readonly - data_sinfo->bytes_may_use - data_sinfo->bytes_super < bytes) { used = data_sinfo->bytes_used + data_sinfo->bytes_delalloc + data_sinfo->bytes_reserved + data_sinfo->bytes_pinned + data_sinfo->bytes_readonly + data_sinfo->bytes_may_use + data_sinfo->bytes_super; if (used + bytes > data_sinfo->total_bytes) { struct btrfs_trans_handle *trans; if (!flushed) { spin_unlock(&data_sinfo->lock); flush_delalloc(root, data_sinfo); flushed = 1; goto again; } /* * if we don't have enough free bytes in this space then we need * to alloc a new chunk. Loading
fs/btrfs/volumes.c +6 −0 Original line number Diff line number Diff line Loading @@ -2250,6 +2250,12 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, if (!looped) calc_size = max_t(u64, min_stripe_size, calc_size); /* * we're about to do_div by the stripe_len so lets make sure * we end up with something bigger than a stripe */ calc_size = max_t(u64, calc_size, stripe_len * 4); do_div(calc_size, stripe_len); calc_size *= stripe_len; Loading