diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 980d6a3c342c..59c8daaacf0c 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3328,15 +3328,14 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3328 | u64 reserved; | 3328 | u64 reserved; |
| 3329 | u64 max_reclaim; | 3329 | u64 max_reclaim; |
| 3330 | u64 reclaimed = 0; | 3330 | u64 reclaimed = 0; |
| 3331 | int no_reclaim = 0; | ||
| 3332 | int pause = 1; | 3331 | int pause = 1; |
| 3333 | int ret; | 3332 | int nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT; |
| 3334 | 3333 | ||
| 3335 | block_rsv = &root->fs_info->delalloc_block_rsv; | 3334 | block_rsv = &root->fs_info->delalloc_block_rsv; |
| 3336 | space_info = block_rsv->space_info; | 3335 | space_info = block_rsv->space_info; |
| 3337 | spin_lock(&space_info->lock); | 3336 | |
| 3337 | smp_mb(); | ||
| 3338 | reserved = space_info->bytes_reserved; | 3338 | reserved = space_info->bytes_reserved; |
| 3339 | spin_unlock(&space_info->lock); | ||
| 3340 | 3339 | ||
| 3341 | if (reserved == 0) | 3340 | if (reserved == 0) |
| 3342 | return 0; | 3341 | return 0; |
| @@ -3344,20 +3343,11 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3344 | max_reclaim = min(reserved, to_reclaim); | 3343 | max_reclaim = min(reserved, to_reclaim); |
| 3345 | 3344 | ||
| 3346 | while (1) { | 3345 | while (1) { |
| 3347 | ret = btrfs_start_one_delalloc_inode(root, trans ? 1 : 0, sync); | 3346 | /* have the flusher threads jump in and do some IO */ |
| 3348 | if (!ret) { | 3347 | smp_mb(); |
| 3349 | if (no_reclaim > 2) | 3348 | nr_pages = min_t(unsigned long, nr_pages, |
| 3350 | break; | 3349 | root->fs_info->delalloc_bytes >> PAGE_CACHE_SHIFT); |
| 3351 | no_reclaim++; | 3350 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages); |
| 3352 | __set_current_state(TASK_INTERRUPTIBLE); | ||
| 3353 | schedule_timeout(pause); | ||
| 3354 | pause <<= 1; | ||
| 3355 | if (pause > HZ / 10) | ||
| 3356 | pause = HZ / 10; | ||
| 3357 | } else { | ||
| 3358 | no_reclaim = 0; | ||
| 3359 | pause = 1; | ||
| 3360 | } | ||
| 3361 | 3351 | ||
| 3362 | spin_lock(&space_info->lock); | 3352 | spin_lock(&space_info->lock); |
| 3363 | if (reserved > space_info->bytes_reserved) | 3353 | if (reserved > space_info->bytes_reserved) |
| @@ -3370,6 +3360,13 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans, | |||
| 3370 | 3360 | ||
| 3371 | if (trans && trans->transaction->blocked) | 3361 | if (trans && trans->transaction->blocked) |
| 3372 | return -EAGAIN; | 3362 | return -EAGAIN; |
| 3363 | |||
| 3364 | __set_current_state(TASK_INTERRUPTIBLE); | ||
| 3365 | schedule_timeout(pause); | ||
| 3366 | pause <<= 1; | ||
| 3367 | if (pause > HZ / 10) | ||
| 3368 | pause = HZ / 10; | ||
| 3369 | |||
| 3373 | } | 3370 | } |
| 3374 | return reclaimed >= to_reclaim; | 3371 | return reclaimed >= to_reclaim; |
| 3375 | } | 3372 | } |
