diff options
-rw-r--r-- | fs/ext4/mballoc.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index a9ff5e5137ca..4bbbf13bd743 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -4740,11 +4740,16 @@ do_more: | |||
4740 | * blocks being freed are metadata. these blocks shouldn't | 4740 | * blocks being freed are metadata. these blocks shouldn't |
4741 | * be used until this transaction is committed | 4741 | * be used until this transaction is committed |
4742 | */ | 4742 | */ |
4743 | retry: | ||
4743 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, GFP_NOFS); | 4744 | new_entry = kmem_cache_alloc(ext4_free_data_cachep, GFP_NOFS); |
4744 | if (!new_entry) { | 4745 | if (!new_entry) { |
4745 | ext4_mb_unload_buddy(&e4b); | 4746 | /* |
4746 | err = -ENOMEM; | 4747 | * We use a retry loop because |
4747 | goto error_return; | 4748 | * ext4_free_blocks() is not allowed to fail. |
4749 | */ | ||
4750 | cond_resched(); | ||
4751 | congestion_wait(BLK_RW_ASYNC, HZ/50); | ||
4752 | goto retry; | ||
4748 | } | 4753 | } |
4749 | new_entry->efd_start_cluster = bit; | 4754 | new_entry->efd_start_cluster = bit; |
4750 | new_entry->efd_group = block_group; | 4755 | new_entry->efd_group = block_group; |