diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/extent-tree.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index b9526f749049..afc3ac5e57d7 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3689,6 +3689,20 @@ static int can_overcommit(struct btrfs_root *root, | |||
3689 | return 0; | 3689 | return 0; |
3690 | } | 3690 | } |
3691 | 3691 | ||
3692 | static int writeback_inodes_sb_nr_if_idle_safe(struct super_block *sb, | ||
3693 | unsigned long nr_pages, | ||
3694 | enum wb_reason reason) | ||
3695 | { | ||
3696 | if (!writeback_in_progress(sb->s_bdi) && | ||
3697 | down_read_trylock(&sb->s_umount)) { | ||
3698 | writeback_inodes_sb_nr(sb, nr_pages, reason); | ||
3699 | up_read(&sb->s_umount); | ||
3700 | return 1; | ||
3701 | } | ||
3702 | |||
3703 | return 0; | ||
3704 | } | ||
3705 | |||
3692 | /* | 3706 | /* |
3693 | * shrink metadata reservation for delalloc | 3707 | * shrink metadata reservation for delalloc |
3694 | */ | 3708 | */ |
@@ -3721,8 +3735,9 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3721 | while (delalloc_bytes && loops < 3) { | 3735 | while (delalloc_bytes && loops < 3) { |
3722 | max_reclaim = min(delalloc_bytes, to_reclaim); | 3736 | max_reclaim = min(delalloc_bytes, to_reclaim); |
3723 | nr_pages = max_reclaim >> PAGE_CACHE_SHIFT; | 3737 | nr_pages = max_reclaim >> PAGE_CACHE_SHIFT; |
3724 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, | 3738 | writeback_inodes_sb_nr_if_idle_safe(root->fs_info->sb, |
3725 | WB_REASON_FS_FREE_SPACE); | 3739 | nr_pages, |
3740 | WB_REASON_FS_FREE_SPACE); | ||
3726 | 3741 | ||
3727 | /* | 3742 | /* |
3728 | * We need to wait for the async pages to actually start before | 3743 | * We need to wait for the async pages to actually start before |