diff options
Diffstat (limited to 'fs/ext4/mballoc.c')
| -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 f6aedf88da43..34b610ea5030 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
| @@ -4816,18 +4816,12 @@ do_more: | |||
| 4816 | /* | 4816 | /* |
| 4817 | * blocks being freed are metadata. these blocks shouldn't | 4817 | * blocks being freed are metadata. these blocks shouldn't |
| 4818 | * be used until this transaction is committed | 4818 | * be used until this transaction is committed |
| 4819 | * | ||
| 4820 | * We use __GFP_NOFAIL because ext4_free_blocks() is not allowed | ||
| 4821 | * to fail. | ||
| 4819 | */ | 4822 | */ |
| 4820 | retry: | 4823 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, |
| 4821 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, GFP_NOFS); | 4824 | GFP_NOFS|__GFP_NOFAIL); |
| 4822 | if (!new_entry) { | ||
| 4823 | /* | ||
| 4824 | * We use a retry loop because | ||
| 4825 | * ext4_free_blocks() is not allowed to fail. | ||
| 4826 | */ | ||
| 4827 | cond_resched(); | ||
| 4828 | congestion_wait(BLK_RW_ASYNC, HZ/50); | ||
| 4829 | goto retry; | ||
| 4830 | } | ||
| 4831 | new_entry->efd_start_cluster = bit; | 4825 | new_entry->efd_start_cluster = bit; |
| 4832 | new_entry->efd_group = block_group; | 4826 | new_entry->efd_group = block_group; |
| 4833 | new_entry->efd_count = count_clusters; | 4827 | new_entry->efd_count = count_clusters; |
