diff options
author | David Sterba <dsterba@suse.com> | 2016-02-26 09:38:31 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-02-26 09:38:31 -0500 |
commit | e9ddd77a31e6ba2867b9c33547f6f079d55f7a72 (patch) | |
tree | 3c2b40e73c989b49826b16e1294e95c01058e3e9 | |
parent | ff7db6e05a93a23eb43c7d20dc2027bcc939b6a8 (diff) | |
parent | baee8790641eac0c0fcb2524a925aec39d9be6e0 (diff) |
Merge branch 'foreign/josef/space-updates' into for-chris-4.6
-rw-r--r-- | fs/btrfs/extent-tree.c | 36 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 11 | ||||
-rw-r--r-- | fs/btrfs/transaction.c | 6 |
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; |