ext4: handle the rest of ext4_mb_load_buddy() ENOMEM errors
[ Upstream commit 9651e6b2e20648d04d5e1fe6479a3056047e8781 ] 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 <khlebnikov@yandex-team.ru> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
a091f8aba5
commit
5c01f95c20
1 changed files with 14 additions and 9 deletions
|
@ -3874,7 +3874,8 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
|
||||||
|
|
||||||
err = ext4_mb_load_buddy(sb, group, &e4b);
|
err = ext4_mb_load_buddy(sb, group, &e4b);
|
||||||
if (err) {
|
if (err) {
|
||||||
ext4_error(sb, "Error loading buddy information for %u", group);
|
ext4_warning(sb, "Error %d loading buddy information for %u",
|
||||||
|
err, group);
|
||||||
put_bh(bitmap_bh);
|
put_bh(bitmap_bh);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4031,10 +4032,11 @@ repeat:
|
||||||
BUG_ON(pa->pa_type != MB_INODE_PA);
|
BUG_ON(pa->pa_type != MB_INODE_PA);
|
||||||
group = ext4_get_group_number(sb, pa->pa_pstart);
|
group = ext4_get_group_number(sb, pa->pa_pstart);
|
||||||
|
|
||||||
err = ext4_mb_load_buddy(sb, group, &e4b);
|
err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
|
||||||
|
GFP_NOFS|__GFP_NOFAIL);
|
||||||
if (err) {
|
if (err) {
|
||||||
ext4_error(sb, "Error loading buddy information for %u",
|
ext4_error(sb, "Error %d loading buddy information for %u",
|
||||||
group);
|
err, group);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4290,11 +4292,14 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
|
||||||
spin_unlock(&lg->lg_prealloc_lock);
|
spin_unlock(&lg->lg_prealloc_lock);
|
||||||
|
|
||||||
list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
|
list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
|
||||||
|
int err;
|
||||||
|
|
||||||
group = ext4_get_group_number(sb, pa->pa_pstart);
|
group = ext4_get_group_number(sb, pa->pa_pstart);
|
||||||
if (ext4_mb_load_buddy(sb, group, &e4b)) {
|
err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
|
||||||
ext4_error(sb, "Error loading buddy information for %u",
|
GFP_NOFS|__GFP_NOFAIL);
|
||||||
group);
|
if (err) {
|
||||||
|
ext4_error(sb, "Error %d loading buddy information for %u",
|
||||||
|
err, group);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ext4_lock_group(sb, group);
|
ext4_lock_group(sb, group);
|
||||||
|
@ -5116,8 +5121,8 @@ ext4_trim_all_free(struct super_block *sb, ext4_group_t group,
|
||||||
|
|
||||||
ret = ext4_mb_load_buddy(sb, group, &e4b);
|
ret = ext4_mb_load_buddy(sb, group, &e4b);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ext4_error(sb, "Error in loading buddy "
|
ext4_warning(sb, "Error %d loading buddy information for %u",
|
||||||
"information for %u", group);
|
ret, group);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
bitmap = e4b.bd_bitmap;
|
bitmap = e4b.bd_bitmap;
|
||||||
|
|
Loading…
Add table
Reference in a new issue