--- /dev/null
+diff -up a/fs/ext4/super.c b/s/ext4/super.c
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -706,9 +767,47 @@ static inline struct inode *dquot_to_ino
+ static ssize_t ext4_quota_write(struct super_block *sb, int type,
+ const char *data, size_t len, loff_t off);
+
++static int ext4_dquot_initialize(struct inode *inode, int type)
++{
++ handle_t *handle;
++ int ret, err;
++
++ /* We may create quota structure so we need to reserve enough blocks */
++ handle = ext4_journal_start(inode, 2*EXT4_QUOTA_INIT_BLOCKS(inode->i_sb));
++ if (IS_ERR(handle))
++ return PTR_ERR(handle);
++ ret = dquot_initialize(inode, type);
++ err = ext4_journal_stop(handle);
++ if (!ret)
++ ret = err;
++ return ret;
++}
++
++static int ext4_dquot_drop(struct inode *inode)
++{
++ handle_t *handle;
++ int ret, err;
++
++ /* We may delete quota structure so we need to reserve enough blocks */
++ handle = ext4_journal_start(inode, 2*EXT4_QUOTA_DEL_BLOCKS(inode->i_sb));
++ if (IS_ERR(handle)) {
++ /*
++ * We call dquot_drop() anyway to at least release references
++ * to quota structures so that umount does not hang.
++ */
++ dquot_drop(inode);
++ return PTR_ERR(handle);
++ }
++ ret = dquot_drop(inode);
++ err = ext4_journal_stop(handle);
++ if (!ret)
++ ret = err;
++ return ret;
++}
++
+ static struct dquot_operations ext4_quota_operations = {
+- .initialize = dquot_initialize,
+- .drop = dquot_drop,
++ .initialize = ext4_dquot_initialize,
++ .drop = ext4_dquot_drop,
+ .alloc_space = dquot_alloc_space,
+ .alloc_inode = dquot_alloc_inode,
+ .free_space = dquot_free_space,