[quota] Report quotacheck failures by return code

Petr Pisar ppisar at fedoraproject.org
Fri Jul 15 07:10:51 UTC 2011


commit 9f434c0180ee758fd8899dde2e01d040009e58e9
Author: Petr Písař <ppisar at redhat.com>
Date:   Fri Jul 15 08:48:31 2011 +0200

    Report quotacheck failures by return code

 ...Report-quotacheck-failures-by-return-code.patch |  203 ++++++++++++++++++++
 quota.spec                                         |    8 +-
 2 files changed, 210 insertions(+), 1 deletions(-)
---
diff --git a/quota-4.00_pre1-Report-quotacheck-failures-by-return-code.patch b/quota-4.00_pre1-Report-quotacheck-failures-by-return-code.patch
new file mode 100644
index 0000000..21607d7
--- /dev/null
+++ b/quota-4.00_pre1-Report-quotacheck-failures-by-return-code.patch
@@ -0,0 +1,203 @@
+From 0694c7dae6acec8ee54ca885417b0628cf0501d6 Mon Sep 17 00:00:00 2001
+From: Petr Pisar <ppisar at redhat.com>
+Date: Fri, 1 Jul 2011 10:13:54 +0200
+Subject: [PATCH] Report quotacheck failures by return code
+
+Signed-off-by: Jan Kara <jack at suse.cz>
+
+Petr Pisar: Back-ported (missing NEXT3 support)
+---
+ quotacheck.c |   57 ++++++++++++++++++++++++++++++++++++---------------------
+ 1 files changed, 36 insertions(+), 21 deletions(-)
+
+diff --git a/quotacheck.c b/quotacheck.c
+index 07b0c0d..cf2be9c 100644
+--- a/quotacheck.c
++++ b/quotacheck.c
+@@ -859,8 +859,9 @@ static int dump_to_file(struct mntent *mnt, int type)
+ 	return 0;
+ }
+ 
+-/* Substract space used by old quota file from usage */
+-static void sub_quota_file(struct mntent *mnt, int qtype, int ftype)
++/* Substract space used by old quota file from usage.
++ * Return non-zero in case of failure, zero otherwise. */
++static int sub_quota_file(struct mntent *mnt, int qtype, int ftype)
+ {
+ 	char *filename;
+ 	struct stat st;
+@@ -871,13 +872,13 @@ static void sub_quota_file(struct mntent *mnt, int qtype, int ftype)
+ 	debug(FL_DEBUG, _("Substracting space used by old %s quota file.\n"), type2name(ftype));
+ 	if (get_qf_name(mnt, ftype, cfmt, 0, &filename) < 0) {
+ 		debug(FL_VERBOSE, _("Old %s file not found. Usage will not be substracted.\n"), type2name(ftype));
+-		return;
++		return 0;
+ 	}
+ 
+ 	if (stat(filename, &st) < 0) {
+ 		debug(FL_VERBOSE, _("Cannot stat old %s quota file: %s\n"), type2name(ftype), strerror(errno));
+ 		free(filename);
+-		return;
++		return 0;
+ 	}
+ 	qspace = getqsize(filename, &st);
+ 	free(filename);
+@@ -888,18 +889,21 @@ static void sub_quota_file(struct mntent *mnt, int qtype, int ftype)
+ 		id = st.st_gid;
+ 	if ((d = lookup_dquot(id, qtype)) == NODQUOT) {
+ 		errstr(_("Quota structure for %s owning quota file not present! Something is really wrong...\n"), type2name(qtype));
+-		return;
++		return -1;
+ 	}
+ 	d->dq_dqb.dqb_curinodes--;
+ 	d->dq_dqb.dqb_curspace -= qspace;
+ 	debug(FL_DEBUG, _("Substracted %lu bytes.\n"), (unsigned long)qspace);
++    return 0;
+ }
+ 
+-/* Buffer quotafile, run filesystem scan, dump quotafiles */
+-static void check_dir(struct mntent *mnt)
++/* Buffer quotafile, run filesystem scan, dump quotafiles.
++ * Return non-zero value in case of failure, zero otherwise. */
++static int check_dir(struct mntent *mnt)
+ {
+ 	struct stat st;
+ 	int remounted = 0;
++	int failed = 0;
+ 
+ 	if (lstat(mnt->mnt_dir, &st) < 0)
+ 		die(2, _("Cannot stat mountpoint %s: %s\n"), mnt->mnt_dir, strerror(errno));
+@@ -922,7 +926,7 @@ static void check_dir(struct mntent *mnt)
+ 		if (process_file(mnt, GRPQUOTA) < 0)
+ 			gcheck = 0;
+ 	if (!ucheck && !gcheck)	/* Nothing to check? */
+-		return;
++		return 0;
+ 	if (!(flags & FL_NOREMOUNT)) {
+ 		/* Now we try to remount fs read-only to prevent races when scanning filesystem */
+ 		if (mount
+@@ -932,12 +936,14 @@ static void check_dir(struct mntent *mnt)
+ 				printf(_("Cannot remount filesystem mounted on %s read-only. Counted values might not be right.\n"), mnt->mnt_dir);
+ 				if (!ask_yn(_("Should I continue"), 0)) {
+ 					printf(_("As you wish... Canceling check of this file.\n"));
++					failed = -1;
+ 					goto out;
+ 				}
+ 			}
+ 			else {
+ 				errstr(_("Cannot remount filesystem mounted on %s read-only so counted values might not be right.\n\
+ Please stop all programs writing to filesystem or use -m flag to force checking.\n"), mnt->mnt_dir);
++				failed = -1;
+ 				goto out;
+ 			}
+ 		}
+@@ -949,7 +955,7 @@ start_scan:
+ 	debug(FL_VERBOSE, _("Scanning %s [%s] "), mnt->mnt_fsname, mnt->mnt_dir);
+ #if defined(EXT2_DIRECT)
+ 	if (!strcmp(mnt->mnt_type, MNTTYPE_EXT2) || !strcmp(mnt->mnt_type, MNTTYPE_EXT3)) {
+-		if (ext2_direct_scan(mnt->mnt_fsname) < 0)
++		if ((failed = ext2_direct_scan(mnt->mnt_fsname)) < 0)
+ 			goto out;
+ 	}
+ 	else {
+@@ -958,19 +964,19 @@ start_scan:
+ #endif
+ 		if (flags & FL_VERYVERBOSE)
+ 			putchar('\n');
+-		if (scan_dir(mnt->mnt_dir) < 0)
++		if ((failed = scan_dir(mnt->mnt_dir)) < 0)
+ 			goto out;
+ 	}
+ 	dirs_done++;
+ 	if (flags & FL_VERBOSE || flags & FL_VERYVERBOSE)
+ 		fputs(_("done\n"), stdout);
+ 	if (ucheck) {
+-		sub_quota_file(mnt, USRQUOTA, USRQUOTA);
+-		sub_quota_file(mnt, USRQUOTA, GRPQUOTA);
++		failed |= sub_quota_file(mnt, USRQUOTA, USRQUOTA);
++		failed |= sub_quota_file(mnt, USRQUOTA, GRPQUOTA);
+ 	}
+ 	if (gcheck) {
+-		sub_quota_file(mnt, GRPQUOTA, USRQUOTA);
+-		sub_quota_file(mnt, GRPQUOTA, GRPQUOTA);
++		failed |= sub_quota_file(mnt, GRPQUOTA, USRQUOTA);
++		failed |= sub_quota_file(mnt, GRPQUOTA, GRPQUOTA);
+ 	}
+ 	debug(FL_DEBUG | FL_VERBOSE, _("Checked %d directories and %d files\n"), dirs_done,
+ 	      files_done);
+@@ -980,11 +986,12 @@ start_scan:
+ 		debug(FL_DEBUG, _("Filesystem remounted RW.\n"));
+ 	}
+ 	if (ucheck)
+-		dump_to_file(mnt, USRQUOTA);
++		failed |= dump_to_file(mnt, USRQUOTA);
+ 	if (gcheck)
+-		dump_to_file(mnt, GRPQUOTA);
++		failed |= dump_to_file(mnt, GRPQUOTA);
+ out:
+ 	remove_list();
++	return failed;
+ }
+ 
+ /* Detect quota format from filename of present files */
+@@ -1083,11 +1090,13 @@ static int compatible_fs_qfmt(char *fstype, int fmt)
+ 	return !!strcmp(fstype, MNTTYPE_GFS2);
+ }
+ 
+-static void check_all(void)
++/* Return 0 in case of success, non-zero otherwise. */
++static int check_all(void)
+ {
+ 	struct mntent *mnt;
+ 	int checked = 0;
+ 	static int warned;
++	int failed = 0;
+ 
+ 	if (init_mounts_scan((flags & FL_ALL) ? 0 : 1, &mntpoint, 0) < 0)
+ 		die(2, _("Cannot initialize mountpoint scan.\n"));
+@@ -1114,6 +1123,7 @@ static void check_all(void)
+ 			if (cfmt == -1) {
+ 				errstr(_("Cannot guess format from filename on %s. Please specify format on commandline.\n"),
+ 					mnt->mnt_fsname);
++				failed = -1;
+ 				continue;
+ 			}
+ 			debug(FL_DEBUG, _("Detected quota format %s\n"), fmt2name(cfmt));
+@@ -1150,25 +1160,30 @@ static void check_all(void)
+ 		}
+ 
+ 		checked++;
+-		check_dir(mnt);
++		failed |= check_dir(mnt);
+ 	}
+ 	end_mounts_scan();
+-	if (!checked && (!(flags & FL_ALL) || flags & (FL_VERBOSE | FL_DEBUG)))
++	if (!checked && (!(flags & FL_ALL) || flags & (FL_VERBOSE | FL_DEBUG))) {
+ 		errstr(_("Cannot find filesystem to check or filesystem not mounted with quota option.\n"));
++		failed = -1;
++    }
++    return failed;
+ }
+ 
+ int main(int argc, char **argv)
+ {
++	int failed;
++
+ 	gettexton();
+ 	progname = basename(argv[0]);
+ 
+ 	parse_options(argc, argv);
+ 	init_kernel_interface();
+ 
+-	check_all();
++	failed = check_all();
+ #ifdef DEBUG_MALLOC
+ 	errstr(_("Allocated %d bytes memory\nFree'd %d bytes\nLost %d bytes\n"),
+ 		malloc_mem, free_mem, malloc_mem - free_mem);
+ #endif
+-	return 0;
++	return (failed ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
+-- 
+1.7.6
+
diff --git a/quota.spec b/quota.spec
index 553fa20..ab07a72 100644
--- a/quota.spec
+++ b/quota.spec
@@ -5,7 +5,7 @@ Name: quota
 Summary: System administration tools for monitoring users' disk usage
 Epoch: 1
 Version: 4.00
-Release: 0.15.pre1%{?dist}
+Release: 0.16.pre1%{?dist}
 License: BSD and GPLv2+
 URL: http://sourceforge.net/projects/linuxquota/
 Group: System Environment/Base
@@ -81,6 +81,8 @@ Patch31: quota-4.00_pre1-Initialize-v2r1-ddquot-padding-in-dump.patch
 Patch32: quota-4.00_pre1-We-shouldn-t-pass-NULL-to-XGETQSTAT-quotactl-since-k.patch
 # In upstream 4.00_pre2 (SF#3300978), bug #703567
 Patch33: quota-4.00_pre1-Make-dirname-static.patch
+# In upstream 4.00_pre2 (SF#3347047), bug #717982
+Patch34: quota-4.00_pre1-Report-quotacheck-failures-by-return-code.patch
 
 
 %description
@@ -185,6 +187,7 @@ Linux/UNIX environment.
 %patch31 -p1 -b .initizalize_ddquot_paddding
 %patch32 -p1 -b .do_not_pass_null_to_XGETQSTAT
 %patch33 -p1 -b .static_dirname
+%patch34 -p1 -b .report_quotacheck_failures
 # quotactl(2) moved into `man-pages' package (bug #640590)
 rm -f quotactl.2
 # remove VCS files
@@ -296,6 +299,9 @@ fi
 
 
 %changelog
+* Fri Jul 15 2011 Petr Pisar <ppisar at redhat.com> - 1:4.00-0.16.pre1
+- Report quotacheck failures by return code (bug #717982)
+
 * Thu May 12 2011 Petr Pisar <ppisar at redhat.com> - 1:4.00-0.15.pre1
 - Make dirname static to work with nss_db (bug #703567)
 - Clean spec file


More information about the scm-commits mailing list