diff options
author | Jan Kara <jack@suse.cz> | 2020-10-19 17:44:46 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2020-10-19 17:44:46 +0200 |
commit | 7b89abbc983d6cf7f1baf52a9ad90211eee02103 (patch) | |
tree | 5194bff22a5111f401821fb622871a86a58f4995 | |
parent | 4aac5400dfd61416ffe7ff912f32061854e57e45 (diff) | |
download | linuxquota-7b89abbc983d6cf7f1baf52a9ad90211eee02103.tar.gz |
quotacheck,quotaon: Suggest using quota feature for ext4
Ext4 supports quota using internal quota files for quite some time.
Suggest using this quota feature instead of external quota files if the
kernel is new enough since external quota files on ext4 will be
deprecated.
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | quotacheck.c | 59 | ||||
-rw-r--r-- | quotaon.c | 11 | ||||
-rw-r--r-- | quotasys.c | 27 | ||||
-rw-r--r-- | quotasys.h | 3 |
4 files changed, 76 insertions, 24 deletions
diff --git a/quotacheck.c b/quotacheck.c index 1311c10..5810ced 100644 --- a/quotacheck.c +++ b/quotacheck.c @@ -1130,8 +1130,8 @@ static int compatible_fs_qfmt(char *fstype, int fmt) return !!strcmp(fstype, MNTTYPE_GFS2); } -/* Parse kernel version and warn if not using journaled quotas */ -static void warn_if_jquota_supported(void) +/* Parse kernel version and return 1 if journaled quota is supported */ +static int kernel_supports_jquota(void) { struct utsname stats; int v; @@ -1139,28 +1139,25 @@ static void warn_if_jquota_supported(void) if (uname(&stats) < 0) { errstr(_("Cannot get system info: %s\n"), strerror(errno)); - return; + return 0; } if (strcmp(stats.sysname, "Linux")) - return; + return 0; v = strtol(stats.release, &errch, 10); if (v < 2) - return; + return 0; if (v >= 3) - goto warn; + return 1; if (*errch != '.') - return; + return 0; v = strtol(errch + 1, &errch, 10); if (*errch != '.' || v < 6) - return; + return 0; v = strtol(errch + 1, &errch, 10); if (v < 11) - return; -warn: - errstr(_("Your kernel probably supports journaled quota but you are " - "not using it. Consider switching to journaled quota to avoid" - " running quotacheck after an unclean shutdown.\n")); + return 0; + return 1; } /* Return 0 in case of success, non-zero otherwise. */ @@ -1202,17 +1199,31 @@ static int check_all(void) debug(FL_DEBUG, _("Detected quota format %s\n"), fmt2name(cfmt)); } - if (flags & (FL_VERBOSE | FL_DEBUG) && - !str_hasmntopt(mnt->me_opts, MNTOPT_USRJQUOTA) && - !str_hasmntopt(mnt->me_opts, MNTOPT_GRPJQUOTA) && - !warned && - (!strcmp(mnt->me_type, MNTTYPE_EXT3) || - !strcmp(mnt->me_type, MNTTYPE_EXT4) || - !strcmp(mnt->me_type, MNTTYPE_NEXT3) || - !strcmp(mnt->me_type, MNTTYPE_EXT4DEV) || - !strcmp(mnt->me_type, MNTTYPE_REISER))) { - warned = 1; - warn_if_jquota_supported(); + if (flags & (FL_VERBOSE | FL_DEBUG) && !warned) { + if (!strcmp(mnt->me_type, MNTTYPE_EXT4) && + ext4_supports_quota_feature()) { + warned = 1; + errstr(_("Your kernel probably supports ext4 " + "quota feature but you are using " + "external quota files. Please switch " + "your filesystem to use ext4 quota " + "feature as external quota files on " + "ext4 are deprecated.\n")); + } else if (!str_hasmntopt(mnt->me_opts, MNTOPT_USRJQUOTA) && + !str_hasmntopt(mnt->me_opts, MNTOPT_GRPJQUOTA) && + (!strcmp(mnt->me_type, MNTTYPE_EXT3) || + !strcmp(mnt->me_type, MNTTYPE_EXT4) || + !strcmp(mnt->me_type, MNTTYPE_NEXT3) || + !strcmp(mnt->me_type, MNTTYPE_EXT4DEV) || + !strcmp(mnt->me_type, MNTTYPE_REISER)) && + kernel_supports_jquota()) { + warned = 1; + errstr(_("Your kernel probably supports " + "journaled quota but you are not " + "using it. Consider switching to " + "journaled quota to avoid running " + "quotacheck after an unclean shutdown.\n")); + } } checked++; @@ -243,6 +243,7 @@ static int v2_newstate(struct mount_entry *mnt, int type, char *file, int flags, */ static int newstate(struct mount_entry *mnt, int type, char *extra) { + static int warned; int sflags, ret = 0; sflags = flags & FL_OFF ? STATEFLAG_OFF : STATEFLAG_ON; @@ -269,6 +270,16 @@ static int newstate(struct mount_entry *mnt, int type, char *extra) if (!me_hasquota(mnt, type)) return 0; + if (flags & FL_VERBOSE && !warned && + !strcmp(mnt->me_type, MNTTYPE_EXT4) && + ext4_supports_quota_feature()) { + warned = 1; + errstr(_("Your kernel probably supports ext4 quota " + "feature but you are using external quota " + "files. Please switch your filesystem to use " + "ext4 quota feature as external quota files " + "on ext4 are deprecated.\n")); + } if (fmt == -1) { if (get_qf_name(mnt, type, QF_VFSV0, NF_FORMAT, &extra) >= 0) @@ -24,6 +24,7 @@ #include <sys/stat.h> #include <sys/vfs.h> #include <stdint.h> +#include <sys/utsname.h> #include "pot.h" #include "bylabel.h" @@ -1597,3 +1598,29 @@ void end_mounts_scan(void) check_dirs = NULL; check_dirs_cnt = 0; } + +/* Parse kernel version and return 1 if ext4 supports quota feature */ +int ext4_supports_quota_feature(void) +{ + struct utsname stats; + int v; + char *errch; + + if (uname(&stats) < 0) { + errstr(_("Cannot get system info: %s\n"), strerror(errno)); + return 0; + } + if (strcmp(stats.sysname, "Linux")) + return 0; + v = strtol(stats.release, &errch, 10); + if (v < 4) + return 0; + if (v > 4) + return 1; + if (*errch != '.') + return 0; + v = strtol(errch + 1, &errch, 10); + if (*errch != '.' || v < 9) + return 0; + return 1; +} @@ -203,6 +203,9 @@ struct mount_entry *get_next_mount(void); /* Free all structures associated with mountpoints scan */ void end_mounts_scan(void); +/* Parse kernel version and return 1 if ext4 supports quota feature */ +int ext4_supports_quota_feature(void); + /* Quota output formats */ #define QOF_ERROR -1 #define QOF_DEFAULT 0 |