Enabling quota is expensive: All inodes in the filesystem are scanned.
Only do it when the requested quota configuration does not match the
existing configuration.
Test:
Add a tiny patch to print out when core of function
handle_quota_options() is triggered.
Issue commands:
truncate -s 1G unused ; mkfs.ext4 unused
| commands | trigger |
comments
+---------------------------------------------------------+---------+---------
| tune2fs -Qusrquota,grpquota -Qprjquota -O quota unused | Y |
Quota not set at formatting.
| tune2fs -Qusrquota,grpquota -Qprjquota -O quota unused | N |
Already set just above
| tune2fs -Qusrquota,grpquota -Q^prjquota -O quota unused | Y |
Disabling a quota
| tune2fs -Qusrquota,grpquota -Q^prjquota -O quota unused | N |
No change from previous line.
| tune2fs -Qusrquota,grpquota -O quota unused | N |
No change from previous line.
| tune2fs -Qusrquota,^grpquota -O quota unused | Y |
Disabling a quota
| tune2fs -Qusrquota -O quota unused | N |
No change from previous line.
| tune2fs -O ^quota unused | Y |
Remove quota
| tune2fs -O quota unused | Y |
Re-enable quota, default values
(-Qusrquota,grpquota) used.
| tune2fs -O quota -Qusrquota unused | N |
Already set just above
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20250103235042.4029197-1-gwendal@chromium.org
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
return 1;
}
+ for (qtype = 0; qtype < MAXQUOTAS; qtype++) {
+ if (quota_enable[qtype] == QOPT_ENABLE &&
+ *quota_sb_inump(fs->super, qtype) == 0) {
+ /* Some work needed to match the configuration. */
+ break;
+ }
+ if (quota_enable[qtype] == QOPT_DISABLE &&
+ *quota_sb_inump(fs->super, qtype)) {
+ /* Some work needed to match the configuration. */
+ break;
+ }
+ }
+ if (qtype == MAXQUOTAS) {
+ /* Nothing to do. */
+ return 0;
+ }
+
for (qtype = 0; qtype < MAXQUOTAS; qtype++) {
if (quota_enable[qtype] == QOPT_ENABLE)
qtype_bits |= 1 << qtype;
}
-
retval = quota_init_context(&qctx, fs, qtype_bits);
if (retval) {
com_err(program_name, retval,