jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);
 
-       jbd2_journal_force_commit_nested(EXT4_SB(sb)->s_journal);
+       smp_mb();
+       if (EXT4_SB(sb)->s_mb_free_pending)
+               jbd2_journal_force_commit_nested(EXT4_SB(sb)->s_journal);
        return 1;
 }
 
 
        unsigned short *s_mb_offsets;
        unsigned int *s_mb_maxs;
        unsigned int s_group_info_size;
+       unsigned int s_mb_free_pending;
 
        /* tunables */
        unsigned long s_stripe;
 
  * There is no guaranteed calling order of multiple registered callbacks on
  * the same transaction.
  */
+static inline void _ext4_journal_callback_add(handle_t *handle,
+                       struct ext4_journal_cb_entry *jce)
+{
+       /* Add the jce to transaction's private list */
+       list_add_tail(&jce->jce_list, &handle->h_transaction->t_private_list);
+}
+
 static inline void ext4_journal_callback_add(handle_t *handle,
                        void (*func)(struct super_block *sb,
                                     struct ext4_journal_cb_entry *jce,
        /* Add the jce to transaction's private list */
        jce->jce_func = func;
        spin_lock(&sbi->s_md_lock);
-       list_add_tail(&jce->jce_list, &handle->h_transaction->t_private_list);
+       _ext4_journal_callback_add(handle, jce);
        spin_unlock(&sbi->s_md_lock);
 }
 
+
 /**
  * ext4_journal_callback_del: delete a registered callback
  * @handle: active journal transaction handle on which callback was registered
 
 
        spin_lock_init(&sbi->s_md_lock);
        spin_lock_init(&sbi->s_bal_lock);
+       sbi->s_mb_free_pending = 0;
 
        sbi->s_mb_max_to_scan = MB_DEFAULT_MAX_TO_SCAN;
        sbi->s_mb_min_to_scan = MB_DEFAULT_MIN_TO_SCAN;
        /* we expect to find existing buddy because it's pinned */
        BUG_ON(err != 0);
 
+       spin_lock(&EXT4_SB(sb)->s_md_lock);
+       EXT4_SB(sb)->s_mb_free_pending -= entry->efd_count;
+       spin_unlock(&EXT4_SB(sb)->s_md_lock);
 
        db = e4b.bd_info;
        /* there are blocks to put in buddy to make them really free */
 {
        ext4_group_t group = e4b->bd_group;
        ext4_grpblk_t cluster;
+       ext4_grpblk_t clusters = new_entry->efd_count;
        struct ext4_free_data *entry;
        struct ext4_group_info *db = e4b->bd_info;
        struct super_block *sb = e4b->bd_sb;
                }
        }
        /* Add the extent to transaction's private list */
-       ext4_journal_callback_add(handle, ext4_free_data_callback,
-                                 &new_entry->efd_jce);
+       new_entry->efd_jce.jce_func = ext4_free_data_callback;
+       spin_lock(&sbi->s_md_lock);
+       _ext4_journal_callback_add(handle, &new_entry->efd_jce);
+       sbi->s_mb_free_pending += clusters;
+       spin_unlock(&sbi->s_md_lock);
        return 0;
 }