diff options
author | Michal Hocko <mhocko@suse.cz> | 2015-07-05 12:33:44 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2015-07-05 12:33:44 -0400 |
commit | 7444a072c387a93ebee7066e8aee776954ab0e41 (patch) | |
tree | 4f8dfad9045bc662071717b477958efb2a43d328 /fs/ext4 | |
parent | 8974fec7d72e3e02752fe0f27b4c3719c78d9a15 (diff) |
ext4: replace open coded nofail allocation in ext4_free_blocks()
ext4_free_blocks is looping around the allocation request and mimics
__GFP_NOFAIL behavior without any allocation fallback strategy. Let's
remove the open coded loop and replace it with __GFP_NOFAIL. Without the
flag the allocator has no way to find out never-fail requirement and
cannot help in any way.
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/mballoc.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 1c535fa67640..2299d629eeb1 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -4815,18 +4815,12 @@ do_more: | |||
4815 | /* | 4815 | /* |
4816 | * blocks being freed are metadata. these blocks shouldn't | 4816 | * blocks being freed are metadata. these blocks shouldn't |
4817 | * be used until this transaction is committed | 4817 | * be used until this transaction is committed |
4818 | * | ||
4819 | * We use __GFP_NOFAIL because ext4_free_blocks() is not allowed | ||
4820 | * to fail. | ||
4818 | */ | 4821 | */ |
4819 | retry: | 4822 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, |
4820 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, GFP_NOFS); | 4823 | GFP_NOFS|__GFP_NOFAIL); |
4821 | if (!new_entry) { | ||
4822 | /* | ||
4823 | * We use a retry loop because | ||
4824 | * ext4_free_blocks() is not allowed to fail. | ||
4825 | */ | ||
4826 | cond_resched(); | ||
4827 | congestion_wait(BLK_RW_ASYNC, HZ/50); | ||
4828 | goto retry; | ||
4829 | } | ||
4830 | new_entry->efd_start_cluster = bit; | 4824 | new_entry->efd_start_cluster = bit; |
4831 | new_entry->efd_group = block_group; | 4825 | new_entry->efd_group = block_group; |
4832 | new_entry->efd_count = count_clusters; | 4826 | new_entry->efd_count = count_clusters; |