From: Gwendal Grignou Date: Fri, 3 Jan 2025 23:50:42 +0000 (-0800) Subject: tune2fs: do not update quota when not needed X-Git-Tag: v1.47.3-rc1~112 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ea1d7f202bb4350e8f517e604c6300a521a762c;p=thirdparty%2Fe2fsprogs.git tune2fs: do not update quota when not needed 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 Reviewed-by: Jan Kara Link: https://lore.kernel.org/r/20250103235042.4029197-1-gwendal@chromium.org Signed-off-by: Theodore Ts'o --- diff --git a/misc/tune2fs.c b/misc/tune2fs.c index 2548a766..3db57632 100644 --- a/misc/tune2fs.c +++ b/misc/tune2fs.c @@ -1799,11 +1799,27 @@ static int handle_quota_options(ext2_filsys fs) 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,