ext4: Disable dirty list tracking of dquots when journalling quotas
authorJan Kara <jack@suse.cz>
Thu, 3 Aug 2017 09:25:55 +0000 (11:25 +0200)
committerJan Kara <jack@suse.cz>
Thu, 17 Aug 2017 20:00:54 +0000 (22:00 +0200)
When journalling quotas, we writeback all dquots immediately after
changing them as part of current transation. Thus there's no need to
write anything in dquot_writeback_dquots() and so we can avoid updating
list of dirty dquots to reduce dq_list_lock contention.

This change reduces time to create 500000 files on ext4 on ramdisk by 50
different processes in separate directories by 15% when user quota is
turned on.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/ext4/super.c

index 4c168b90903c25a6915cd12c96227ec05d4f3e6a..16a877a0f30934467b897e624c7969c0f024f18d 100644 (file)
@@ -5404,6 +5404,13 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
                        ext4_msg(sb, KERN_WARNING,
                                "Quota file not on filesystem root. "
                                "Journaled quota will not work");
                        ext4_msg(sb, KERN_WARNING,
                                "Quota file not on filesystem root. "
                                "Journaled quota will not work");
+               sb_dqopt(sb)->flags |= DQUOT_NOLIST_DIRTY;
+       } else {
+               /*
+                * Clear the flag just in case mount options changed since
+                * last time.
+                */
+               sb_dqopt(sb)->flags &= ~DQUOT_NOLIST_DIRTY;
        }
 
        /*
        }
 
        /*
@@ -5500,7 +5507,7 @@ static int ext4_enable_quotas(struct super_block *sb)
                test_opt(sb, PRJQUOTA),
        };
 
                test_opt(sb, PRJQUOTA),
        };
 
-       sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
+       sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE | DQUOT_NOLIST_DIRTY;
        for (type = 0; type < EXT4_MAXQUOTAS; type++) {
                if (qf_inums[type]) {
                        err = ext4_quota_enable(sb, type, QFMT_VFS_V1,
        for (type = 0; type < EXT4_MAXQUOTAS; type++) {
                if (qf_inums[type]) {
                        err = ext4_quota_enable(sb, type, QFMT_VFS_V1,