--- /dev/null
+From dd5f6279732e8885061d7455b9d86fdcfdf7f183 Mon Sep 17 00:00:00 2001
+From: "zhangyi (F)" <yi.zhang@huawei.com>
+Date: Wed, 1 Nov 2017 18:40:45 +0800
+Subject: [PATCH] quota: fix potential infinite loop
+
+In dquot_writeback_dquots(), we write back dquot from dirty dquots
+list. There is a potential infinite loop if ->write_dquot() failure
+and forget remove dquot from the list. This patch clear dirty bit
+anyway to avoid it.
+
+Signed-off-by: zhangyi (F) <yi.zhang@huawei.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+---
+ fs/quota/dquot.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
+index 50b0556..f683979 100644
+--- a/fs/quota/dquot.c
++++ b/fs/quota/dquot.c
+@@ -644,8 +644,15 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
+ spin_unlock(&dq_list_lock);
+ dqstats_inc(DQST_LOOKUPS);
+ err = sb->dq_op->write_dquot(dquot);
+- if (!ret && err)
+- ret = err;
++ if (err) {
++ /*
++ * Clear dirty bit anyway to avoid infinite
++ * loop here.
++ */
++ clear_dquot_dirty(dquot);
++ if (!ret)
++ ret = err;
++ }
+ dqput(dquot);
+ spin_lock(&dq_list_lock);
+ }
+--
+1.8.3.1
+