quota: factor out dquot_write_dquot()
authorBaokun Li <libaokun1@huawei.com>
Fri, 30 Jun 2023 11:08:18 +0000 (19:08 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:42:36 +0000 (09:42 +0200)
[ Upstream commit 024128477809f8073d870307c8157b8826ebfd08 ]

Refactor out dquot_write_dquot() to reduce duplicate code.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Message-Id: <20230630110822.3881712-2-libaokun1@huawei.com>
Stable-dep-of: dabc8b207566 ("quota: fix dqput() to follow the guarantees dquot_srcu should provide")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/quota/dquot.c

index 46dca88..5541960 100644 (file)
@@ -628,6 +628,18 @@ out:
 }
 EXPORT_SYMBOL(dquot_scan_active);
 
+static inline int dquot_write_dquot(struct dquot *dquot)
+{
+       int ret = dquot->dq_sb->dq_op->write_dquot(dquot);
+       if (ret < 0) {
+               quota_error(dquot->dq_sb, "Can't write quota structure "
+                           "(error %d). Quota may get out of sync!", ret);
+               /* Clear dirty bit anyway to avoid infinite loop. */
+               clear_dquot_dirty(dquot);
+       }
+       return ret;
+}
+
 /* Write all dquot structures to quota files */
 int dquot_writeback_dquots(struct super_block *sb, int type)
 {
@@ -658,16 +670,9 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
                         * use count */
                        dqgrab(dquot);
                        spin_unlock(&dq_list_lock);
-                       err = sb->dq_op->write_dquot(dquot);
-                       if (err) {
-                               /*
-                                * Clear dirty bit anyway to avoid infinite
-                                * loop here.
-                                */
-                               clear_dquot_dirty(dquot);
-                               if (!ret)
-                                       ret = err;
-                       }
+                       err = dquot_write_dquot(dquot);
+                       if (err && !ret)
+                               ret = err;
                        dqput(dquot);
                        spin_lock(&dq_list_lock);
                }
@@ -765,8 +770,6 @@ static struct shrinker dqcache_shrinker = {
  */
 void dqput(struct dquot *dquot)
 {
-       int ret;
-
        if (!dquot)
                return;
 #ifdef CONFIG_QUOTA_DEBUG
@@ -794,17 +797,7 @@ we_slept:
        if (dquot_dirty(dquot)) {
                spin_unlock(&dq_list_lock);
                /* Commit dquot before releasing */
-               ret = dquot->dq_sb->dq_op->write_dquot(dquot);
-               if (ret < 0) {
-                       quota_error(dquot->dq_sb, "Can't write quota structure"
-                                   " (error %d). Quota may get out of sync!",
-                                   ret);
-                       /*
-                        * We clear dirty bit anyway, so that we avoid
-                        * infinite loop here
-                        */
-                       clear_dquot_dirty(dquot);
-               }
+               dquot_write_dquot(dquot);
                goto we_slept;
        }
        if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {