svn commit: r201147 - projects/quota64/sbin/quotacheck

Kirk McKusick mckusick at FreeBSD.org
Mon Dec 28 23:01:47 UTC 2009


Author: mckusick
Date: Mon Dec 28 23:01:47 2009
New Revision: 201147
URL: http://svn.freebsd.org/changeset/base/201147

Log:
  Add the -c option to quotacheck to use the quota_convert(3) function to
  convert between quota file formats.

Modified:
  projects/quota64/sbin/quotacheck/quotacheck.8
  projects/quota64/sbin/quotacheck/quotacheck.c

Modified: projects/quota64/sbin/quotacheck/quotacheck.8
==============================================================================
--- projects/quota64/sbin/quotacheck/quotacheck.8	Mon Dec 28 23:01:24 2009	(r201146)
+++ projects/quota64/sbin/quotacheck/quotacheck.8	Mon Dec 28 23:01:47 2009	(r201147)
@@ -40,10 +40,12 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl guv
+.Op Fl c Ar 32 | 64
 .Op Fl l Ar maxrun
 .Fl a
 .Nm
 .Op Fl guv
+.Op Fl c Ar 32 | 64
 .Ar filesystem ...
 .Sh DESCRIPTION
 The
@@ -69,6 +71,22 @@ to be read-write with disk quotas.
 By default only the types of quotas listed in
 .Pa /etc/fstab
 are checked.
+.It Fl c Ar 32 | 64
+Before performing its checks,
+.Nm
+will convert the quota file to the specified word size.
+A conversion size of 64 is given to request conversion to
+the new 64-bit quota file format.
+A conversion size of 32 is given to request conversion back to
+the old 32-bit quota file format.
+The original quota file is left unchanged and moved aside with an
+underscore and its format size plus a
+.Pa .orig
+extension added to its name.
+Thus, the original 32-bit
+.Pa quota.user
+quota file converted to the 64-bit format quota file will be renamed to
+.Pa quota.user_32.orig .
 .It Fl g
 Only group quotas listed in
 .Pa /etc/fstab

Modified: projects/quota64/sbin/quotacheck/quotacheck.c
==============================================================================
--- projects/quota64/sbin/quotacheck/quotacheck.c	Mon Dec 28 23:01:24 2009	(r201146)
+++ projects/quota64/sbin/quotacheck/quotacheck.c	Mon Dec 28 23:01:47 2009	(r201147)
@@ -110,6 +110,7 @@ struct fileusage {
 struct fileusage *fuhead[MAXQUOTAS][FUHASH];
 
 int	aflag;			/* all file systems */
+int	cflag;			/* convert format to 32 or 64 bit size */
 int	gflag;			/* check group quotas */
 int	uflag;			/* check user quotas */
 int	vflag;			/* verbose */
@@ -143,11 +144,16 @@ main(int argc, char *argv[])
 	char *name;
 
 	errs = maxrun = 0;
-	while ((ch = getopt(argc, argv, "aguvl:")) != -1) {
+	while ((ch = getopt(argc, argv, "ac:guvl:")) != -1) {
 		switch(ch) {
 		case 'a':
 			aflag++;
 			break;
+		case 'c':
+			if (cflag)
+				usage();
+			cflag = atoi(optarg);
+			break;
 		case 'g':
 			gflag++;
 			break;
@@ -168,6 +174,8 @@ main(int argc, char *argv[])
 	argv += optind;
 	if ((argc == 0 && !aflag) || (argc > 0 && aflag))
 		usage();
+	if (cflag && cflag != 32 && cflag != 64)
+		usage();
 	if (!gflag && !uflag) {
 		gflag++;
 		uflag++;
@@ -227,8 +235,8 @@ void
 usage(void)
 {
 	(void)fprintf(stderr, "%s\n%s\n",
-		"usage: quotacheck [-guv] [-l maxrun] -a",
-		"       quotacheck [-guv] filesystem ...");
+		"usage: quotacheck [-guv] [-c 32 | 64] [-l maxrun] -a",
+		"       quotacheck [-guv] [-c 32 | 64] filesystem ...");
 	exit(1);
 }
 
@@ -257,7 +265,31 @@ chkquota(char *specname, struct quotafil
 	else if (qfg != NULL)
 		mntpt = quota_fsname(qfg);
 	else
-		err(1, "null quotafile information passed to chkquota()\n");
+		errx(1, "null quotafile information passed to chkquota()\n");
+	if (cflag) {
+		if (vflag && qfu != NULL)
+			printf("%s: convert user quota to %d bits\n",
+			    mntpt, cflag);
+		if (qfu != NULL && quota_convert(qfu, cflag) < 0) {
+			if (errno == EBADF)
+				errx(1,
+				    "%s: cannot convert an active quota file",
+				    mntpt);
+			err(1, "user quota conversion to size %d failed",
+			    cflag);
+		}
+		if (vflag && qfg != NULL)
+			printf("%s: convert group quota to %d bits\n",
+			    mntpt, cflag);
+		if (qfg != NULL && quota_convert(qfg, cflag) < 0) {
+			if (errno == EBADF)
+				errx(1,
+				    "%s: cannot convert an active quota file",
+				    mntpt);
+			err(1, "group quota conversion to size %d failed",
+			    cflag);
+		}
+	}
 	if ((fi = open(specname, O_RDONLY, 0)) < 0) {
 		warn("%s", specname);
 		return (1);
@@ -407,6 +439,7 @@ update(const char *fsname, struct quotaf
 	struct fileusage *fup;
 	u_long id, lastid, highid = 0;
 	struct dqblk dqbuf;
+	struct stat sb;
 	static struct dqblk zerodqbuf;
 	static struct fileusage zerofileusage;
 
@@ -459,7 +492,14 @@ update(const char *fsname, struct quotaf
 			fup->fu_curblocks = 0;
 		}
 	}
-	if (highid < lastid)
+	/*
+	 * If this is old format file, then size may be smaller,
+	 * so ensure that we only truncate when it will make things
+	 * smaller, and not if it will grow an old format file.
+	 */
+	if (highid < lastid &&
+	    stat(quota_qfname(qf), &sb) == 0 &&
+	    sb.st_size > (((off_t)highid + 2) * sizeof(struct dqblk)))
 		truncate(quota_qfname(qf),
 		    (((off_t)highid + 2) * sizeof(struct dqblk)));
 	return (0);


More information about the svn-src-projects mailing list