Ping... Dmitry Monakhov <dmonakhov@xxxxxxxxxx> writes: > We must use GFP_NOFS instead GFP_KERNEL inside ext4_mb_add_groupinfo because resize-path > call it inside journal transaction. Call trace: > ioctl > ->ext4_group_add > ->journal_start > ->ext4_setup_new_descs > ->ext4_mb_add_groupinfo -> GFP_KERNEL > ->ext4_flex_group_add > ->ext4_update_super > ->ext4_calculate_overhead -> GFP_KERNEL > ->journal_stop > > Changes from V1: > - Fix up gfp flags for ext4_calculate_overhead > > ext4_update_super > > Signed-off-by: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> > --- > fs/ext4/mballoc.c | 6 +++--- > fs/ext4/super.c | 2 +- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index dbfe15c..654e70d 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -2385,7 +2385,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, > if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { > metalen = sizeof(*meta_group_info) << > EXT4_DESC_PER_BLOCK_BITS(sb); > - meta_group_info = kmalloc(metalen, GFP_KERNEL); > + meta_group_info = kmalloc(metalen, GFP_NOFS); > if (meta_group_info == NULL) { > ext4_msg(sb, KERN_ERR, "can't allocate mem " > "for a buddy group"); > @@ -2399,7 +2399,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, > sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]; > i = group & (EXT4_DESC_PER_BLOCK(sb) - 1); > > - meta_group_info[i] = kmem_cache_zalloc(cachep, GFP_KERNEL); > + meta_group_info[i] = kmem_cache_zalloc(cachep, GFP_NOFS); > if (meta_group_info[i] == NULL) { > ext4_msg(sb, KERN_ERR, "can't allocate buddy mem"); > goto exit_group_info; > @@ -2428,7 +2428,7 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group, > { > struct buffer_head *bh; > meta_group_info[i]->bb_bitmap = > - kmalloc(sb->s_blocksize, GFP_KERNEL); > + kmalloc(sb->s_blocksize, GFP_NOFS); > BUG_ON(meta_group_info[i]->bb_bitmap == NULL); > bh = ext4_read_block_bitmap(sb, group); > BUG_ON(bh == NULL); > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 2c9e686..5f6cab8 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -3310,7 +3310,7 @@ int ext4_calculate_overhead(struct super_block *sb) > struct ext4_super_block *es = sbi->s_es; > ext4_group_t i, ngroups = ext4_get_groups_count(sb); > ext4_fsblk_t overhead = 0; > - char *buf = (char *) get_zeroed_page(GFP_KERNEL); > + char *buf = (char *) get_zeroed_page(GFP_NOFS); > > if (!buf) > return -ENOMEM; > -- > 1.7.1
Attachment:
signature.asc
Description: PGP signature