Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Oct 1998 13:08:46 +0200 (CEST)
From:      tobez@plab.ku.dk
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/8163: edquota bug with large quota sizes
Message-ID:  <199810061108.NAA20929@lion.plab.ku.dk>

next in thread | raw e-mail | index | archive | help

>Number:         8163
>Category:       bin
>Synopsis:       It is impossible to assign quotas larger than 4Gbytes using edquota
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct  6 04:10:02 PDT 1998
>Last-Modified:
>Originator:     Anton Berezin
>Organization:
The Protein Laboratory, University of Copenhagen
>Release:        FreeBSD 2.2.7-RELEASE i386
>Environment:

	"$Id: edquota.c,v 1.4.2.4 1998/03/09 13:50:51 jkh Exp $"

>Description:

	While trying to assign quota limits to a value greater than
4Gbytes (4194304 kbytes) edquota does not report any problems and
finishes successfully; however, actually assigned limits get wrapped
modulo 4Gbytes.


>How-To-Repeat:

	Try to assign, say, hard limit to 5242880, save & exit.  Run
edquota again for the same user.  The assigned quota will be 1048576.

>Fix:
	
--- edquota.c.orig	Mon Oct  5 20:08:24 1998
+++ edquota.c	Mon Oct  5 20:52:02 1998
@@ -69,6 +69,25 @@
 #include <unistd.h>
 #include "pathnames.h"
 
+/* Let's be paranoid about block size */
+#if 10 > DEV_BSHIFT
+#define kbtodb(kbytes) \
+        ((daddr_t)((unsigned long)(kbytes) << (10-DEV_BSHIFT)))
+
+#define dbtokb(db) \
+        ((off_t)(db) >> (10-DEV_BSHIFT))
+#elif 10 < DEV_BSHIFT
+#define kbtodb(kbytes) \
+        ((daddr_t)((unsigned long)(kbytes) >> (DEV_BSHIFT-10)))
+
+#define dbtokb(db) \
+        ((off_t)(db) << (DEV_BSHIFT-10))
+#else
+#define kbtodb(kbytes)	(kbytes)
+#define dbtokb(db)	(db)
+#endif
+
+
 char *qfname = QUOTAFILENAME;
 char *qfextension[] = INITQFNAMES;
 char *quotagroup = QUOTAGROUP;
@@ -416,9 +435,9 @@
 	for (qup = quplist; qup; qup = qup->next) {
 		fprintf(fd, "%s: %s %lu, limits (soft = %lu, hard = %lu)\n",
 		    qup->fsname, "blocks in use:",
-		    (unsigned long)(dbtob(qup->dqblk.dqb_curblocks) / 1024),
-		    (unsigned long)(dbtob(qup->dqblk.dqb_bsoftlimit) / 1024),
-		    (unsigned long)(dbtob(qup->dqblk.dqb_bhardlimit) / 1024));
+		    (unsigned long)(dbtokb(qup->dqblk.dqb_curblocks)),
+		    (unsigned long)(dbtokb(qup->dqblk.dqb_bsoftlimit)),
+		    (unsigned long)(dbtokb(qup->dqblk.dqb_bhardlimit)));
 		fprintf(fd, "%s %lu, limits (soft = %lu, hard = %lu)\n",
 		    "\tinodes in use:", qup->dqblk.dqb_curinodes,
 		    qup->dqblk.dqb_isoftlimit, qup->dqblk.dqb_ihardlimit);
@@ -469,9 +488,9 @@
 			warnx("%s:%s: bad format", fsp, cp);
 			return (0);
 		}
-		dqblk.dqb_curblocks = btodb(dqblk.dqb_curblocks * 1024);
-		dqblk.dqb_bsoftlimit = btodb(dqblk.dqb_bsoftlimit * 1024);
-		dqblk.dqb_bhardlimit = btodb(dqblk.dqb_bhardlimit * 1024);
+		dqblk.dqb_curblocks = kbtodb(dqblk.dqb_curblocks);
+		dqblk.dqb_bsoftlimit = kbtodb(dqblk.dqb_bsoftlimit);
+		dqblk.dqb_bhardlimit = kbtodb(dqblk.dqb_bhardlimit);
 		if ((cp = strtok(line2, "\n")) == NULL) {
 			warnx("%s: %s: bad format", fsp, line2);
 			return (0);
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810061108.NAA20929>