Module Name:    src
Committed By:   martin
Date:           Wed Apr 27 16:55:18 UTC 2022

Modified Files:
        src/lib/libquota [netbsd-8]: quota_oldfiles.c
        src/sys/ufs/ufs [netbsd-8]: ufs_quota1.c
        src/usr.sbin/quotaon [netbsd-8]: quotaon.c

Log Message:
Pull up following revision(s) (requested by hannken in ticket #1739):

        usr.sbin/quotaon/quotaon.c: revision 1.31
        lib/libquota/quota_oldfiles.c: revision 1.10
        sys/ufs/ufs/ufs_quota1.c: revision 1.25

Fix default quota file names, both user and group quota used the
same default name "QUOTAFILENAME, names[USRQUOTA])" resulting in
diagnostic assertion and possibly corrupted quota data.

Keep flag "UFS_QUOTA" set until the last quota is closed.
Prevents a live lock when dqrele() finds a struct with "dq_cnt == 1"
and flag "DQ_MOD" and cannot sync as flag UFS_QUOTA is unset.

As the quota type comes from the kernel and is only valid when
quota is on get the type before quota_off and after quota_on.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.9.26.1 src/lib/libquota/quota_oldfiles.c
cvs rdiff -u -r1.22.10.1 -r1.22.10.2 src/sys/ufs/ufs/ufs_quota1.c
cvs rdiff -u -r1.30 -r1.30.24.1 src/usr.sbin/quotaon/quotaon.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libquota/quota_oldfiles.c
diff -u src/lib/libquota/quota_oldfiles.c:1.9 src/lib/libquota/quota_oldfiles.c:1.9.26.1
--- src/lib/libquota/quota_oldfiles.c:1.9	Fri Feb 24 18:00:09 2012
+++ src/lib/libquota/quota_oldfiles.c	Wed Apr 27 16:55:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: quota_oldfiles.c,v 1.9 2012/02/24 18:00:09 njoly Exp $	*/
+/*	$NetBSD: quota_oldfiles.c,v 1.9.26.1 2022/04/27 16:55:18 martin Exp $	*/
 
 /*
  * Copyright (c) 1980, 1990, 1993
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: quota_oldfiles.c,v 1.9 2012/02/24 18:00:09 njoly Exp $");
+__RCSID("$NetBSD: quota_oldfiles.c,v 1.9.26.1 2022/04/27 16:55:18 martin Exp $");
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -255,7 +255,7 @@ __quota_oldfiles_defquotafile(struct quo
 
 	(void)snprintf(buf, maxlen, "%s/%s.%s",
 		       qh->qh_mountpoint,
-		       QUOTAFILENAME, names[USRQUOTA]);
+		       QUOTAFILENAME, names[idtype]);
 }
 
 const char *

Index: src/sys/ufs/ufs/ufs_quota1.c
diff -u src/sys/ufs/ufs/ufs_quota1.c:1.22.10.1 src/sys/ufs/ufs/ufs_quota1.c:1.22.10.2
--- src/sys/ufs/ufs/ufs_quota1.c:1.22.10.1	Fri Jan  1 13:19:57 2021
+++ src/sys/ufs/ufs/ufs_quota1.c	Wed Apr 27 16:55:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota1.c,v 1.22.10.1 2021/01/01 13:19:57 martin Exp $	*/
+/*	$NetBSD: ufs_quota1.c,v 1.22.10.2 2022/04/27 16:55:18 martin Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993, 1995
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.22.10.1 2021/01/01 13:19:57 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.22.10.2 2022/04/27 16:55:18 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -435,7 +435,6 @@ quota1_handle_cmd_quotaoff(struct lwp *l
 		return (0);
 	}
 	ump->umq1_qflags[type] |= QTF_CLOSING;
-	ump->um_flags &= ~UFS_QUOTA;
 	mutex_exit(&dqlock);
 	/*
 	 * Search vnodes associated with this mount point,
@@ -472,6 +471,8 @@ quota1_handle_cmd_quotaoff(struct lwp *l
 		if (ump->um_quotas[i] != NULLVP)
 			break;
 	ump->umq1_qflags[type] &= ~QTF_CLOSING;
+	if (i == MAXQUOTAS)
+		ump->um_flags &= ~UFS_QUOTA;
 	cv_broadcast(&dqcv);
 	mutex_exit(&dqlock);
 	kauth_cred_free(cred);

Index: src/usr.sbin/quotaon/quotaon.c
diff -u src/usr.sbin/quotaon/quotaon.c:1.30 src/usr.sbin/quotaon/quotaon.c:1.30.24.1
--- src/usr.sbin/quotaon/quotaon.c:1.30	Sat Apr  7 05:07:33 2012
+++ src/usr.sbin/quotaon/quotaon.c	Wed Apr 27 16:55:18 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: quotaon.c,v 1.30 2012/04/07 05:07:33 christos Exp $	*/
+/*	$NetBSD: quotaon.c,v 1.30.24.1 2022/04/27 16:55:18 martin Exp $	*/
 
 /*
  * Copyright (c) 1980, 1990, 1993
@@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)quotaon.c	8.1 (Berkeley) 6/6/93";
 #else
-__RCSID("$NetBSD: quotaon.c,v 1.30 2012/04/07 05:07:33 christos Exp $");
+__RCSID("$NetBSD: quotaon.c,v 1.30.24.1 2022/04/27 16:55:18 martin Exp $");
 #endif
 #endif /* not lint */
 
@@ -217,12 +217,14 @@ quotaonoff(struct fstab *fs, struct quot
     int warn_on_enxio, const char *fsspec)
 {
 	const char *mode = (offmode == 1) ? "off" : "on";
+	const char *type;
 
 	if (strcmp(fs->fs_file, "/") && readonly(fs, fsspec)) {
 		return 1;
 	}
 
 	if (offmode) {
+		type = quota_idtype_getname(qh, idtype);
 		if (quota_quotaoff(qh, idtype)) {
 			if (warn_on_enxio || errno != ENXIO) {
 				warn("quota%s for %s", mode, fs->fs_file);
@@ -236,11 +238,12 @@ quotaonoff(struct fstab *fs, struct quot
 			}
 			return 1;
 		}
+		type = quota_idtype_getname(qh, idtype);
 	}
 
 	if (vflag) {
 		printf("%s: %s quotas turned %s\n",
-		    fs->fs_file, quota_idtype_getname(qh, idtype), mode);
+		    fs->fs_file, type, mode);
 	}
 	return 0;
 }

Reply via email to