Module Name:    src
Committed By:   dholland
Date:           Sun Jan 29 06:38:24 UTC 2012

Modified Files:
        src/include: quota.h
        src/sys/sys: quota.h
        src/sys/ufs/ufs: ufs_quota.c ufs_quota.h ufs_quota1.c ufs_quota2.c

Log Message:
Move second-layer proplib frobbing within ufs quota code up to the
first layer. (Step 2 of several for QUOTACTL_GET.)


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/include/quota.h
cvs rdiff -u -r1.7 -r1.8 src/sys/sys/quota.h
cvs rdiff -u -r1.74 -r1.75 src/sys/ufs/ufs/ufs_quota.c
cvs rdiff -u -r1.2 -r1.3 src/sys/ufs/ufs/ufs_quota.h
cvs rdiff -u -r1.7 -r1.8 src/sys/ufs/ufs/ufs_quota1.c
cvs rdiff -u -r1.4 -r1.5 src/sys/ufs/ufs/ufs_quota2.c

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

Modified files:

Index: src/include/quota.h
diff -u src/include/quota.h:1.1 src/include/quota.h:1.2
--- src/include/quota.h:1.1	Mon Jan  9 15:19:45 2012
+++ src/include/quota.h	Sun Jan 29 06:38:23 2012
@@ -44,9 +44,6 @@ struct quotacursor; /* Opaque. */
 #define QUOTA_OBJTYPE_BLOCKS	0
 #define QUOTA_OBJTYPE_FILES	1
 
-/* id value for "default" */
-#define QUOTA_DEFAULTID		((id_t)-1)
-
 /* limit value for "no limit" */
 #define QUOTA_NOLIMIT		((uint64_t)0xffffffffffffffffULL)
 

Index: src/sys/sys/quota.h
diff -u src/sys/sys/quota.h:1.7 src/sys/sys/quota.h:1.8
--- src/sys/sys/quota.h:1.7	Sun Jan  1 15:41:16 2012
+++ src/sys/sys/quota.h	Sun Jan 29 06:38:23 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: quota.h,v 1.7 2012/01/01 15:41:16 dholland Exp $ */
+/* $NetBSD: quota.h,v 1.8 2012/01/29 06:38:23 dholland Exp $ */
 /*-
   * Copyright (c) 2010 Manuel Bouyer
   * All rights reserved.
@@ -30,6 +30,9 @@
 
 #include <sys/types.h>
 
+/* id value for "default" */
+#define QUOTA_DEFAULTID		((id_t)-1)
+
 /*
  * Structure used to describe the value part of a quota record.
  */

Index: src/sys/ufs/ufs/ufs_quota.c
diff -u src/sys/ufs/ufs/ufs_quota.c:1.74 src/sys/ufs/ufs/ufs_quota.c:1.75
--- src/sys/ufs/ufs/ufs_quota.c:1.74	Sun Jan 29 06:37:30 2012
+++ src/sys/ufs/ufs/ufs_quota.c	Sun Jan 29 06:38:24 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota.c,v 1.74 2012/01/29 06:37:30 dholland Exp $	*/
+/*	$NetBSD: ufs_quota.c,v 1.75 2012/01/29 06:38:24 dholland Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993, 1995
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.74 2012/01/29 06:37:30 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.75 2012/01/29 06:38:24 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -226,6 +226,33 @@ quota_get_auth(struct mount *mp, struct 
 	    KAUTH_REQ_SYSTEM_FS_QUOTA_GET, mp, KAUTH_ARG(id), NULL);
 }
 
+static int
+quota_fill_cmd_get_reply(id_t id,
+			 int defaultq,
+			 const struct quotaval *blocks,
+			 const struct quotaval *files,
+			 prop_array_t replies)
+{
+	prop_dictionary_t dict;
+
+	/* XXX illegal casts */
+	uint64_t *valuesp[QUOTA_NLIMITS];
+	valuesp[QUOTA_LIMIT_BLOCK] = (void *)(intptr_t)&blocks->qv_hardlimit;
+	valuesp[QUOTA_LIMIT_FILE] =  (void *)(intptr_t)&files->qv_hardlimit;
+
+	dict = quota64toprop(id, defaultq, valuesp,
+	    ufs_quota_entry_names, UFS_QUOTA_NENTRIES,
+	    ufs_quota_limit_names, QUOTA_NLIMITS);
+	if (dict == NULL)
+		return ENOMEM;
+	if (!prop_array_add_and_rel(replies, dict)) {
+		prop_object_release(dict);
+		return ENOMEM;
+	}
+
+	return 0;
+}
+
 static int 
 quota_handle_cmd_get(struct mount *mp, struct lwp *l, 
     struct vfs_quotactl_args *args)
@@ -236,6 +263,7 @@ quota_handle_cmd_get(struct mount *mp, s
 	int q2type;
 	int defaultq;
 	prop_array_t replies;
+	struct quotaval blocks, files;
 
 	KASSERT(args->qc_type == QCT_GET);
 	id = args->u.get.qc_id;
@@ -251,21 +279,25 @@ quota_handle_cmd_get(struct mount *mp, s
 		if (error != 0) 
 			return error;
 #ifdef QUOTA
-		if (ump->um_flags & UFS_QUOTA)
+		if (ump->um_flags & UFS_QUOTA) {
 			error = quota1_handle_cmd_get(ump, q2type, id, defaultq,
-			    replies);
-		else
+			    &blocks, &files);
+		} else
 #endif
 #ifdef QUOTA2
 		if (ump->um_flags & UFS_QUOTA2) {
 			error = quota2_handle_cmd_get(ump, q2type, id, defaultq,
-			    replies);
+			    &blocks, &files);
 		} else
 #endif
 			panic("quota_handle_cmd_get: no support ?");
 		
 		if (error != 0)
 			return error;
+
+		error = quota_fill_cmd_get_reply(id, defaultq,
+						 &blocks, &files,
+						 replies);
 	}
 
 	return error;

Index: src/sys/ufs/ufs/ufs_quota.h
diff -u src/sys/ufs/ufs/ufs_quota.h:1.2 src/sys/ufs/ufs/ufs_quota.h:1.3
--- src/sys/ufs/ufs/ufs_quota.h:1.2	Sun Mar  6 17:08:39 2011
+++ src/sys/ufs/ufs/ufs_quota.h	Sun Jan 29 06:38:24 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota.h,v 1.2 2011/03/06 17:08:39 bouyer Exp $	*/
+/*	$NetBSD: ufs_quota.h,v 1.3 2012/01/29 06:38:24 dholland Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993, 1995
@@ -113,7 +113,8 @@ int chkiq1(struct inode *, int32_t, kaut
 int q1sync(struct mount *);
 int dq1get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *);
 int dq1sync(struct vnode *, struct dquot *);
-int quota1_handle_cmd_get(struct ufsmount *, int, int, int, prop_array_t);
+int quota1_handle_cmd_get(struct ufsmount *, int, int, int,
+    struct quotaval *, struct quotaval *);
 int quota1_handle_cmd_set(struct ufsmount *, int, int, int, prop_dictionary_t);
 int quota1_handle_cmd_quotaon(struct lwp *, struct ufsmount *, int,
     const char *);
@@ -121,7 +122,8 @@ int quota1_handle_cmd_quotaoff(struct lw
 
 int chkdq2(struct inode *, int64_t, kauth_cred_t, int);
 int chkiq2(struct inode *, int32_t, kauth_cred_t, int);
-int quota2_handle_cmd_get(struct ufsmount *, int, int, int, prop_array_t);
+int quota2_handle_cmd_get(struct ufsmount *, int, int, int,
+    struct quotaval *, struct quotaval *);
 int quota2_handle_cmd_set(struct ufsmount *, int, int, int, prop_dictionary_t);
 int quota2_handle_cmd_clear(struct ufsmount *, int, int, int, prop_dictionary_t);
 int quota2_handle_cmd_getall(struct ufsmount *, int, prop_array_t);

Index: src/sys/ufs/ufs/ufs_quota1.c
diff -u src/sys/ufs/ufs/ufs_quota1.c:1.7 src/sys/ufs/ufs/ufs_quota1.c:1.8
--- src/sys/ufs/ufs/ufs_quota1.c:1.7	Sun Jan 29 06:23:20 2012
+++ src/sys/ufs/ufs/ufs_quota1.c	Sun Jan 29 06:38:24 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota1.c,v 1.7 2012/01/29 06:23:20 dholland Exp $	*/
+/*	$NetBSD: ufs_quota1.c,v 1.8 2012/01/29 06:38:24 dholland 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.7 2012/01/29 06:23:20 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota1.c,v 1.8 2012/01/29 06:38:24 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -493,51 +493,39 @@ again:
 }
 
 int             
-quota1_handle_cmd_get(struct ufsmount *ump, int type, int id,
-    int defaultq, prop_array_t replies)
+quota1_handle_cmd_get(struct ufsmount *ump, int idtype, int id,
+    int defaultq, struct quotaval *blocks, struct quotaval *files)
 {
 	struct dquot *dq;
-	struct quotaval qv[QUOTA_NLIMITS];
-	prop_dictionary_t dict;
 	int error;
 	uint64_t *valuesp[QUOTA_NLIMITS];
-	valuesp[QUOTA_LIMIT_BLOCK] = &qv[QUOTA_LIMIT_BLOCK].qv_hardlimit;
-	valuesp[QUOTA_LIMIT_FILE] = &qv[QUOTA_LIMIT_FILE].qv_hardlimit;
 
+	valuesp[QUOTA_LIMIT_BLOCK] = &blocks->qv_hardlimit;
+	valuesp[QUOTA_LIMIT_FILE] = &files->qv_hardlimit;
 
-	if (ump->um_quotas[type] == NULLVP)
+	if (ump->um_quotas[idtype] == NULLVP)
 		return ENODEV;
 
 	if (defaultq) { /* we want the grace period of id 0 */
-		if ((error = dqget(NULLVP, 0, ump, type, &dq)) != 0)
+		if ((error = dqget(NULLVP, 0, ump, idtype, &dq)) != 0)
 			return error;
 
 	} else {
-		if ((error = dqget(NULLVP, id, ump, type, &dq)) != 0)
+		if ((error = dqget(NULLVP, id, ump, idtype, &dq)) != 0)
 			return error;
 	}
-	dqblk_to_quotavals(&dq->dq_un.dq1_dqb,
-			   &qv[QUOTA_LIMIT_BLOCK], &qv[QUOTA_LIMIT_FILE]);
+	dqblk_to_quotavals(&dq->dq_un.dq1_dqb, blocks, files);
 	dqrele(NULLVP, dq);
 	if (defaultq) {
-		if (qv[QUOTA_LIMIT_BLOCK].qv_expiretime > 0)
-			qv[QUOTA_LIMIT_BLOCK].qv_grace =
-			    qv[QUOTA_LIMIT_BLOCK].qv_expiretime;
+		if (blocks->qv_expiretime > 0)
+			blocks->qv_grace = blocks->qv_expiretime;
 		else
-			qv[QUOTA_LIMIT_BLOCK].qv_grace = MAX_DQ_TIME;
-		if (qv[QUOTA_LIMIT_FILE].qv_expiretime > 0)
-			qv[QUOTA_LIMIT_FILE].qv_grace =
-			    qv[QUOTA_LIMIT_FILE].qv_expiretime;
+			blocks->qv_grace = MAX_DQ_TIME;
+		if (files->qv_expiretime > 0)
+			files->qv_grace = files->qv_expiretime;
 		else
-			qv[QUOTA_LIMIT_FILE].qv_grace = MAX_DQ_TIME;
+			files->qv_grace = MAX_DQ_TIME;
 	}
-	dict = quota64toprop(id, defaultq, valuesp,
-	    ufs_quota_entry_names, UFS_QUOTA_NENTRIES,
-	    ufs_quota_limit_names, QUOTA_NLIMITS);
-	if (dict == NULL)
-		return ENOMEM;
-	if (!prop_array_add_and_rel(replies, dict))
-		return ENOMEM;
 	return 0;
 }
 

Index: src/sys/ufs/ufs/ufs_quota2.c
diff -u src/sys/ufs/ufs/ufs_quota2.c:1.4 src/sys/ufs/ufs/ufs_quota2.c:1.5
--- src/sys/ufs/ufs/ufs_quota2.c:1.4	Tue Jun  7 14:56:13 2011
+++ src/sys/ufs/ufs/ufs_quota2.c	Sun Jan 29 06:38:24 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_quota2.c,v 1.4 2011/06/07 14:56:13 bouyer Exp $ */
+/* $NetBSD: ufs_quota2.c,v 1.5 2012/01/29 06:38:24 dholland Exp $ */
 /*-
   * Copyright (c) 2010 Manuel Bouyer
   * All rights reserved.
@@ -26,7 +26,7 @@
   */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.4 2011/06/07 14:56:13 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.5 2012/01/29 06:38:24 dholland Exp $");
 
 #include <sys/buf.h>
 #include <sys/param.h>
@@ -41,6 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c
 #include <sys/fstrans.h>
 #include <sys/kauth.h>
 #include <sys/wapbl.h>
+#include <sys/quota.h>
 
 #include <ufs/ufs/quota2.h>
 #include <ufs/ufs/inode.h>
@@ -76,6 +77,8 @@ static int quota2_walk_list(struct ufsmo
 static int quota2_dict_update_q2e_limits(prop_dictionary_t,
     struct quota2_entry *);
 static prop_dictionary_t q2etoprop(struct quota2_entry *, int);
+static void q2e_to_quotavals(struct quota2_entry *, int, id_t *,
+    struct quotaval *, struct quotaval *);
 
 static const char *limnames[] = INITQLNAMES;
 
@@ -135,6 +138,41 @@ err:
 	return NULL;
 }
 
+/*
+ * Convert internal representation to FS-independent representation.
+ * (Note that while the two types are currently identical, the
+ * internal representation is an on-disk struct and the FS-independent
+ * representation is not, and they might diverge in the future.)
+ */
+static void
+q2val_to_quotaval(struct quota2_val *q2v, struct quotaval *qv)
+{
+	qv->qv_softlimit = q2v->q2v_softlimit;
+	qv->qv_hardlimit = q2v->q2v_hardlimit;
+	qv->qv_usage = q2v->q2v_cur;
+	qv->qv_expiretime = q2v->q2v_time;
+	qv->qv_grace = q2v->q2v_grace;
+}
+
+/*
+ * Convert a quota2entry and default-flag to the FS-independent
+ * representation.
+ */
+static void
+q2e_to_quotavals(struct quota2_entry *q2e, int def,
+	       id_t *id, struct quotaval *blocks, struct quotaval *files)
+{
+	if (def) {
+		*id = QUOTA_DEFAULTID;
+	} else {
+		*id = q2e->q2e_uid;
+	}
+
+	CTASSERT(N_QL == 2);
+	q2val_to_quotaval(&q2e->q2e_val[QL_BLOCK], blocks);
+	q2val_to_quotaval(&q2e->q2e_val[QL_FILE], files);
+}
+
 
 static int
 quota2_bwrite(struct mount *mp, struct buf *bp)
@@ -808,6 +846,7 @@ quota2_array_add_q2e(struct ufsmount *um
 	brelse(bp, 0);
 	mutex_exit(&dq->dq_interlock);
 	dqrele(NULLVP, dq);
+
 	dict = q2etoprop(&q2e, 0);
 	if (dict == NULL)
 		return ENOMEM;
@@ -816,16 +855,54 @@ quota2_array_add_q2e(struct ufsmount *um
 	return 0;
 }
 
+static int
+quota2_fetch_q2e(struct ufsmount *ump, int type,
+    int id, struct quotaval *blocks, struct quotaval *files)
+{
+	struct dquot *dq;
+	int error;
+	struct quota2_entry *q2ep, q2e;
+	struct buf  *bp;
+	const int needswap = UFS_MPNEEDSWAP(ump);
+	id_t id2;
+
+	error = dqget(NULLVP, id, ump, type, &dq);
+	if (error)
+		return error;
+
+	mutex_enter(&dq->dq_interlock);
+	if (dq->dq2_lblkno == 0 && dq->dq2_blkoff == 0) {
+		mutex_exit(&dq->dq_interlock);
+		dqrele(NULLVP, dq);
+		return ENOENT;
+	}
+	error = getq2e(ump, type, dq->dq2_lblkno, dq->dq2_blkoff,
+	    &bp, &q2ep, 0);
+	if (error) {
+		mutex_exit(&dq->dq_interlock);
+		dqrele(NULLVP, dq);
+		return error;
+	}
+	quota2_ufs_rwq2e(q2ep, &q2e, needswap);
+	brelse(bp, 0);
+	mutex_exit(&dq->dq_interlock);
+	dqrele(NULLVP, dq);
+
+	q2e_to_quotavals(&q2e, 0, &id2, blocks, files);
+	KASSERT(id2 == id);
+	return 0;
+}
+
 int
 quota2_handle_cmd_get(struct ufsmount *ump, int type, int id,
-    int defaultq, prop_array_t replies)
+    int defaultq, struct quotaval *blocks, struct quotaval *files)
 {
 	int error;
 	struct quota2_header *q2h;
 	struct quota2_entry q2e;
 	struct buf *bp;
-	prop_dictionary_t dict;
 	const int needswap = UFS_MPNEEDSWAP(ump);
+	id_t id2;
 
 	if (ump->um_quotas[type] == NULLVP)
 		return ENODEV;
@@ -839,13 +916,10 @@ quota2_handle_cmd_get(struct ufsmount *u
 		quota2_ufs_rwq2e(&q2h->q2h_defentry, &q2e, needswap);
 		mutex_exit(&dqlock);
 		brelse(bp, 0);
-		dict = q2etoprop(&q2e, defaultq);
-		if (dict == NULL)
-			return ENOMEM;
-		if (!prop_array_add_and_rel(replies, dict))
-			return ENOMEM;
+		q2e_to_quotavals(&q2e, defaultq, &id2, blocks, files);
+		(void)id2;
 	} else
-		error = quota2_array_add_q2e(ump, type, id, replies);
+		error = quota2_fetch_q2e(ump, type, id, blocks, files);
 	
 	return error;
 }

Reply via email to