+@@ -4742,6 +4730,7 @@ static void ext4_mb_poll_new_transaction
+ ext4_mb_free_committed_blocks(sb);
+ }
+
++/* need to be called with ldiskfs group lock held */
+ static noinline_for_stack int
+ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
+ ext4_group_t group, ext4_grpblk_t block, int count)
+@@ -4755,7 +4744,6 @@ ext4_mb_free_metadata(handle_t *handle,
+ BUG_ON(e4b->bd_bitmap_page == NULL);
+ BUG_ON(e4b->bd_buddy_page == NULL);
+
+- ext4_lock_group(sb, group);
+ for (i = 0; i < count; i++) {
+ md = db->bb_md_cur;
+ if (md && db->bb_tid != handle->h_transaction->t_tid) {
+@@ -4766,8 +4754,10 @@ ext4_mb_free_metadata(handle_t *handle,
+ if (md == NULL) {
+ ext4_unlock_group(sb, group);
+ md = kmalloc(sizeof(*md), GFP_NOFS);
+- if (md == NULL)
++ if (md == NULL) {
++ ext4_lock_group(sb, group);
+ return -ENOMEM;
++ }
+ md->num = 0;
+ md->group = group;
+
+@@ -4800,7 +4790,6 @@ ext4_mb_free_metadata(handle_t *handle,
+ db->bb_md_cur = NULL;
+ }
+ }
+- ext4_unlock_group(sb, group);
+ return 0;
+ }
+
+@@ -4901,6 +4890,13 @@ do_more: