aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2016-02-26 09:38:31 -0500
committerDavid Sterba <dsterba@suse.com>2016-02-26 09:38:31 -0500
commite9ddd77a31e6ba2867b9c33547f6f079d55f7a72 (patch)
tree3c2b40e73c989b49826b16e1294e95c01058e3e9
parentff7db6e05a93a23eb43c7d20dc2027bcc939b6a8 (diff)
parentbaee8790641eac0c0fcb2524a925aec39d9be6e0 (diff)
Merge branch 'foreign/josef/space-updates' into for-chris-4.6
-rw-r--r--fs/btrfs/extent-tree.c36
-rw-r--r--fs/btrfs/inode.c11
-rw-r--r--fs/btrfs/transaction.c6
3 files changed, 36 insertions, 17 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index e2287c7c10be..aa31fe97c47a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4838,7 +4838,7 @@ static inline int need_do_async_reclaim(struct btrfs_space_info *space_info,
4838 u64 thresh = div_factor_fine(space_info->total_bytes, 98); 4838 u64 thresh = div_factor_fine(space_info->total_bytes, 98);
4839 4839
4840 /* If we're just plain full then async reclaim just slows us down. */ 4840 /* If we're just plain full then async reclaim just slows us down. */
4841 if (space_info->bytes_used >= thresh) 4841 if ((space_info->bytes_used + space_info->bytes_reserved) >= thresh)
4842 return 0; 4842 return 0;
4843 4843
4844 return (used >= thresh && !btrfs_fs_closing(fs_info) && 4844 return (used >= thresh && !btrfs_fs_closing(fs_info) &&
@@ -5373,27 +5373,33 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info)
5373 5373
5374 block_rsv->size = min_t(u64, num_bytes, SZ_512M); 5374 block_rsv->size = min_t(u64, num_bytes, SZ_512M);
5375 5375
5376 num_bytes = sinfo->bytes_used + sinfo->bytes_pinned + 5376 if (block_rsv->reserved < block_rsv->size) {
5377 sinfo->bytes_reserved + sinfo->bytes_readonly + 5377 num_bytes = sinfo->bytes_used + sinfo->bytes_pinned +
5378 sinfo->bytes_may_use; 5378 sinfo->bytes_reserved + sinfo->bytes_readonly +
5379 5379 sinfo->bytes_may_use;
5380 if (sinfo->total_bytes > num_bytes) { 5380 if (sinfo->total_bytes > num_bytes) {
5381 num_bytes = sinfo->total_bytes - num_bytes; 5381 num_bytes = sinfo->total_bytes - num_bytes;
5382 block_rsv->reserved += num_bytes; 5382 num_bytes = min(num_bytes,
5383 sinfo->bytes_may_use += num_bytes; 5383 block_rsv->size - block_rsv->reserved);
5384 trace_btrfs_space_reservation(fs_info, "space_info", 5384 block_rsv->reserved += num_bytes;
5385 sinfo->flags, num_bytes, 1); 5385 sinfo->bytes_may_use += num_bytes;
5386 } 5386 trace_btrfs_space_reservation(fs_info, "space_info",
5387 5387 sinfo->flags, num_bytes,
5388 if (block_rsv->reserved >= block_rsv->size) { 5388 1);
5389 }
5390 } else if (block_rsv->reserved > block_rsv->size) {
5389 num_bytes = block_rsv->reserved - block_rsv->size; 5391 num_bytes = block_rsv->reserved - block_rsv->size;
5390 sinfo->bytes_may_use -= num_bytes; 5392 sinfo->bytes_may_use -= num_bytes;
5391 trace_btrfs_space_reservation(fs_info, "space_info", 5393 trace_btrfs_space_reservation(fs_info, "space_info",
5392 sinfo->flags, num_bytes, 0); 5394 sinfo->flags, num_bytes, 0);
5393 block_rsv->reserved = block_rsv->size; 5395 block_rsv->reserved = block_rsv->size;
5394 block_rsv->full = 1;
5395 } 5396 }
5396 5397
5398 if (block_rsv->reserved == block_rsv->size)
5399 block_rsv->full = 1;
5400 else
5401 block_rsv->full = 0;
5402
5397 spin_unlock(&block_rsv->lock); 5403 spin_unlock(&block_rsv->lock);
5398 spin_unlock(&sinfo->lock); 5404 spin_unlock(&sinfo->lock);
5399} 5405}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index f8be74037f34..350b77220153 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4212,11 +4212,20 @@ static int truncate_space_check(struct btrfs_trans_handle *trans,
4212{ 4212{
4213 int ret; 4213 int ret;
4214 4214
4215 /*
4216 * This is only used to apply pressure to the enospc system, we don't
4217 * intend to use this reservation at all.
4218 */
4215 bytes_deleted = btrfs_csum_bytes_to_leaves(root, bytes_deleted); 4219 bytes_deleted = btrfs_csum_bytes_to_leaves(root, bytes_deleted);
4220 bytes_deleted *= root->nodesize;
4216 ret = btrfs_block_rsv_add(root, &root->fs_info->trans_block_rsv, 4221 ret = btrfs_block_rsv_add(root, &root->fs_info->trans_block_rsv,
4217 bytes_deleted, BTRFS_RESERVE_NO_FLUSH); 4222 bytes_deleted, BTRFS_RESERVE_NO_FLUSH);
4218 if (!ret) 4223 if (!ret) {
4224 trace_btrfs_space_reservation(root->fs_info, "transaction",
4225 trans->transid,
4226 bytes_deleted, 1);
4219 trans->bytes_reserved += bytes_deleted; 4227 trans->bytes_reserved += bytes_deleted;
4228 }
4220 return ret; 4229 return ret;
4221 4230
4222} 4231}
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index b6031ce474f7..e9e95ef0644f 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -637,6 +637,8 @@ struct btrfs_trans_handle *btrfs_start_transaction_fallback_global_rsv(
637 637
638 trans->block_rsv = &root->fs_info->trans_block_rsv; 638 trans->block_rsv = &root->fs_info->trans_block_rsv;
639 trans->bytes_reserved = num_bytes; 639 trans->bytes_reserved = num_bytes;
640 trace_btrfs_space_reservation(root->fs_info, "transaction",
641 trans->transid, num_bytes, 1);
640 642
641 return trans; 643 return trans;
642} 644}
@@ -1375,7 +1377,9 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
1375 rsv = trans->block_rsv; 1377 rsv = trans->block_rsv;
1376 trans->block_rsv = &pending->block_rsv; 1378 trans->block_rsv = &pending->block_rsv;
1377 trans->bytes_reserved = trans->block_rsv->reserved; 1379 trans->bytes_reserved = trans->block_rsv->reserved;
1378 1380 trace_btrfs_space_reservation(root->fs_info, "transaction",
1381 trans->transid,
1382 trans->bytes_reserved, 1);
1379 dentry = pending->dentry; 1383 dentry = pending->dentry;
1380 parent_inode = pending->dir; 1384 parent_inode = pending->dir;
1381 parent_root = BTRFS_I(parent_inode)->root; 1385 parent_root = BTRFS_I(parent_inode)->root;