UPSTREAM: ext4: handle the rest of ext4_mb_load_buddy() ENOMEM errors

I've got another report about breaking ext4 by ENOMEM error returned from
ext4_mb_load_buddy() caused by memory shortage in memory cgroup.
This time inside ext4_discard_preallocations().

This patch replaces ext4_error() with ext4_warning() where errors returned
from ext4_mb_load_buddy() are not fatal and handled by caller:
* ext4_mb_discard_group_preallocations() - called before generating ENOSPC,
  we'll try to discard other group or return ENOSPC into user-space.
* ext4_trim_all_free() - just stop trimming and return ENOMEM from ioctl.

Some callers cannot handle errors, thus __GFP_NOFAIL is used for them:
* ext4_discard_preallocations()
* ext4_mb_discard_lg_preallocations()

Fixes: adb7ef600cc9 ("ext4: use __GFP_NOFAIL in ext4_free_blocks()")
Signed-off-by: Konstantin Khlebnikov <>
Signed-off-by: Theodore Ts'o <>
Signed-off-by: Andrey Ulanov <>
(cherry picked from commit 9651e6b2e20648d04d5e1fe6479a3056047e8781)

TEST=kernel compiles

Change-Id: I46e4f20688f25508afa77613cfc1ce4d0b2353ca
Reviewed-by: Guenter Roeck <>
Commit-Queue: Andrey Ulanov <>
Tested-by: Andrey Ulanov <>
1 file changed