Sun Jan 29 07:09:53 2012 UTC ()
Add QUOTACTL_CURSORSKIPIDTYPE, QUOTACTL_CURSORATEND, QUOTACTL_CURSORREWIND.

This change requires a kernel version bump.


(dholland)
diff -r1.28 -r1.29 src/sys/kern/vfs_quotactl.c
diff -r1.25 -r1.26 src/sys/sys/quotactl.h
diff -r1.97 -r1.98 src/sys/ufs/ufs/ufs_quota.c
diff -r1.19 -r1.20 src/sys/ufs/ufs/ufs_quota.h
diff -r1.25 -r1.26 src/sys/ufs/ufs/ufs_quota2.c

cvs diff -r1.28 -r1.29 src/sys/kern/vfs_quotactl.c (expand / switch to context diff)
--- src/sys/kern/vfs_quotactl.c 2012/01/29 07:08:58 1.28
+++ src/sys/kern/vfs_quotactl.c 2012/01/29 07:09:52 1.29
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_quotactl.c,v 1.28 2012/01/29 07:08:58 dholland Exp $	*/
+/*	$NetBSD: vfs_quotactl.c,v 1.29 2012/01/29 07:09:52 dholland Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993, 1994
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.28 2012/01/29 07:08:58 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.29 2012/01/29 07:09:52 dholland Exp $");
 
 #include <sys/malloc.h> /* XXX: temporary */
 #include <sys/mount.h>
@@ -560,14 +560,14 @@
 	lastid = 0; /* value not actually referenced */
 
 	while (1) {
-		args.qc_type = QCT_GETALL;
-		args.u.getall.qc_cursor = &cursor;
-		args.u.getall.qc_keys = keys;
-		args.u.getall.qc_vals = vals;
-		args.u.getall.qc_maxnum = loopmax;
-		args.u.getall.qc_ret = &loopnum;
+		args.qc_type = QCT_CURSORGET;
+		args.u.cursorget.qc_cursor = &cursor;
+		args.u.cursorget.qc_keys = keys;
+		args.u.cursorget.qc_vals = vals;
+		args.u.cursorget.qc_maxnum = loopmax;
+		args.u.cursorget.qc_ret = &loopnum;
 
-		error = VFS_QUOTACTL(mp, QUOTACTL_GETALL, &args);
+		error = VFS_QUOTACTL(mp, QUOTACTL_CURSORGET, &args);
 		if (error) {
 			goto err;
 		}

cvs diff -r1.25 -r1.26 src/sys/sys/quotactl.h (expand / switch to context diff)
--- src/sys/sys/quotactl.h 2012/01/29 07:08:58 1.25
+++ src/sys/sys/quotactl.h 2012/01/29 07:09:52 1.26
@@ -1,4 +1,4 @@
-/*	$NetBSD: quotactl.h,v 1.25 2012/01/29 07:08:58 dholland Exp $	*/
+/*	$NetBSD: quotactl.h,v 1.26 2012/01/29 07:09:52 dholland Exp $	*/
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -57,10 +57,13 @@
 #define QUOTACTL_QUOTAOFF	2
 #define QUOTACTL_GET		3
 #define QUOTACTL_PUT		4
-#define QUOTACTL_GETALL		5
+#define QUOTACTL_CURSORGET	5
 #define QUOTACTL_DELETE		6
 #define QUOTACTL_CURSOROPEN	7
 #define QUOTACTL_CURSORCLOSE	8
+#define QUOTACTL_CURSORSKIPIDTYPE 9
+#define QUOTACTL_CURSORATEND	10
+#define QUOTACTL_CURSORREWIND	11
 
 /* Argument encoding. */
 enum vfs_quotactl_argtypes {
@@ -71,7 +74,10 @@
 	QCT_DELETE,	/* delete */
 	QCT_CURSOROPEN,	/* open cursor */
 	QCT_CURSORCLOSE,/* close cursor */
-	QCT_GETALL,	/* get all */
+	QCT_CURSORGET,	/* get from cursor */
+	QCT_CURSORSKIPIDTYPE, /* iteration hint */
+	QCT_CURSORATEND,/* test cursor */
+	QCT_CURSORREWIND,/* reset cursor */
 };
 struct vfs_quotactl_args {
 	enum vfs_quotactl_argtypes qc_type;
@@ -103,11 +109,22 @@
 		} cursorclose;
 		struct {
 			struct quotakcursor *qc_cursor;
+			unsigned qc_idtype;
+		} cursorskipidtype;
+		struct {
+			struct quotakcursor *qc_cursor;
 			struct quotakey *qc_keys;
 			struct quotaval *qc_vals;
 			unsigned qc_maxnum;
 			unsigned *qc_ret;
-		} getall;
+		} cursorget;
+		struct {
+			struct quotakcursor *qc_cursor;
+			int *qc_ret; /* really boolean */
+		} cursoratend;
+		struct {
+			struct quotakcursor *qc_cursor;
+		} cursorrewind;
 	} u;
 };
 

cvs diff -r1.97 -r1.98 src/sys/ufs/ufs/ufs_quota.c (expand / switch to context diff)
--- src/sys/ufs/ufs/ufs_quota.c 2012/01/29 07:08:58 1.97
+++ src/sys/ufs/ufs/ufs_quota.c 2012/01/29 07:09:52 1.98
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota.c,v 1.97 2012/01/29 07:08:58 dholland Exp $	*/
+/*	$NetBSD: ufs_quota.c,v 1.98 2012/01/29 07:09:52 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.97 2012/01/29 07:08:58 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.98 2012/01/29 07:09:52 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -77,7 +77,7 @@
     struct vfs_quotactl_args *args);
 static int quota_handle_cmd_put(struct mount *, struct lwp *,
     struct vfs_quotactl_args *args);
-static int quota_handle_cmd_getall(struct mount *, struct lwp *,
+static int quota_handle_cmd_cursorget(struct mount *, struct lwp *,
     struct vfs_quotactl_args *args);
 static int quota_handle_cmd_delete(struct mount *, struct lwp *,
     struct vfs_quotactl_args *args);
@@ -89,6 +89,12 @@
     struct vfs_quotactl_args *args);
 static int quota_handle_cmd_cursorclose(struct mount *, struct lwp *,
     struct vfs_quotactl_args *args);
+static int quota_handle_cmd_cursorskipidtype(struct mount *, struct lwp *,
+    struct vfs_quotactl_args *args);
+static int quota_handle_cmd_cursoratend(struct mount *, struct lwp *,
+    struct vfs_quotactl_args *args);
+static int quota_handle_cmd_cursorrewind(struct mount *, struct lwp *,
+    struct vfs_quotactl_args *args);
 
 /*
  * Initialize the quota fields of an inode.
@@ -179,8 +185,8 @@
 	    case QUOTACTL_PUT:
 		error = quota_handle_cmd_put(mp, l, args);
 		break;
-	    case QUOTACTL_GETALL:
-		error = quota_handle_cmd_getall(mp, l, args);
+	    case QUOTACTL_CURSORGET:
+		error = quota_handle_cmd_cursorget(mp, l, args);
 		break;
 	    case QUOTACTL_DELETE:
 		error = quota_handle_cmd_delete(mp, l, args);
@@ -191,6 +197,15 @@
 	    case QUOTACTL_CURSORCLOSE:
 		error = quota_handle_cmd_cursorclose(mp, l, args);
 		break;
+	    case QUOTACTL_CURSORSKIPIDTYPE:
+		error = quota_handle_cmd_cursorskipidtype(mp, l, args);
+		break;
+	    case QUOTACTL_CURSORATEND:
+		error = quota_handle_cmd_cursoratend(mp, l, args);
+		break;
+	    case QUOTACTL_CURSORREWIND:
+		error = quota_handle_cmd_cursorrewind(mp, l, args);
+		break;
 	    default:
 		panic("Invalid quotactl operation %d\n", op);
 	}
@@ -365,7 +380,7 @@
 }
 
 static int 
-quota_handle_cmd_getall(struct mount *mp, struct lwp *l, 
+quota_handle_cmd_cursorget(struct mount *mp, struct lwp *l, 
     struct vfs_quotactl_args *args)
 {
 	struct ufsmount *ump = VFSTOUFS(mp);
@@ -376,12 +391,12 @@
 	unsigned *ret;
 	int error;
 
-	KASSERT(args->qc_type == QCT_GETALL);
-	cursor = args->u.getall.qc_cursor;
-	keys = args->u.getall.qc_keys;
-	vals = args->u.getall.qc_vals;
-	maxnum = args->u.getall.qc_maxnum;
-	ret = args->u.getall.qc_ret;
+	KASSERT(args->qc_type == QCT_CURSORGET);
+	cursor = args->u.cursorget.qc_cursor;
+	keys = args->u.cursorget.qc_keys;
+	vals = args->u.cursorget.qc_vals;
+	maxnum = args->u.cursorget.qc_maxnum;
+	ret = args->u.cursorget.qc_ret;
 
 	if ((ump->um_flags & UFS_QUOTA2) == 0)
 		return EOPNOTSUPP;
@@ -393,11 +408,11 @@
 		
 #ifdef QUOTA2
 	if (ump->um_flags & UFS_QUOTA2) {
-		error = quota2_handle_cmd_getall(ump, cursor,
-						 keys, vals, maxnum, ret);
+		error = quota2_handle_cmd_cursorget(ump, cursor, keys, vals,
+						    maxnum, ret);
 	} else
 #endif
-		panic("quota_handle_cmd_getall: no support ?");
+		panic("quota_handle_cmd_cursorget: no support ?");
 
 	return error;
 }
@@ -447,6 +462,73 @@
 #ifdef QUOTA2
 	if (ump->um_flags & UFS_QUOTA2) {
 		error = quota2_handle_cmd_cursorclose(ump, cursor);
+	} else
+#endif
+		error = EOPNOTSUPP;
+
+	return error;
+}
+
+static int 
+quota_handle_cmd_cursorskipidtype(struct mount *mp, struct lwp *l, 
+    struct vfs_quotactl_args *args)
+{
+	struct ufsmount *ump = VFSTOUFS(mp);
+	struct quotakcursor *cursor;
+	int idtype;
+	int error;
+
+	KASSERT(args->qc_type == QCT_CURSORSKIPIDTYPE);
+	cursor = args->u.cursorskipidtype.qc_cursor;
+	idtype = args->u.cursorskipidtype.qc_idtype;
+
+#ifdef QUOTA2
+	if (ump->um_flags & UFS_QUOTA2) {
+		error = quota2_handle_cmd_cursorskipidtype(ump, cursor, idtype);
+	} else
+#endif
+		error = EOPNOTSUPP;
+
+	return error;
+}
+
+static int 
+quota_handle_cmd_cursoratend(struct mount *mp, struct lwp *l, 
+    struct vfs_quotactl_args *args)
+{
+	struct ufsmount *ump = VFSTOUFS(mp);
+	struct quotakcursor *cursor;
+	int *ret;
+	int error;
+
+	KASSERT(args->qc_type == QCT_CURSORATEND);
+	cursor = args->u.cursoratend.qc_cursor;
+	ret = args->u.cursoratend.qc_ret;
+
+#ifdef QUOTA2
+	if (ump->um_flags & UFS_QUOTA2) {
+		error = quota2_handle_cmd_cursoratend(ump, cursor, ret);
+	} else
+#endif
+		error = EOPNOTSUPP;
+
+	return error;
+}
+
+static int 
+quota_handle_cmd_cursorrewind(struct mount *mp, struct lwp *l, 
+    struct vfs_quotactl_args *args)
+{
+	struct ufsmount *ump = VFSTOUFS(mp);
+	struct quotakcursor *cursor;
+	int error;
+
+	KASSERT(args->qc_type == QCT_CURSORREWIND);
+	cursor = args->u.cursorrewind.qc_cursor;
+
+#ifdef QUOTA2
+	if (ump->um_flags & UFS_QUOTA2) {
+		error = quota2_handle_cmd_cursorrewind(ump, cursor);
 	} else
 #endif
 		error = EOPNOTSUPP;

cvs diff -r1.19 -r1.20 src/sys/ufs/ufs/ufs_quota.h (expand / switch to context diff)
--- src/sys/ufs/ufs/ufs_quota.h 2012/01/29 07:08:58 1.19
+++ src/sys/ufs/ufs/ufs_quota.h 2012/01/29 07:09:52 1.20
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_quota.h,v 1.19 2012/01/29 07:08:58 dholland Exp $	*/
+/*	$NetBSD: ufs_quota.h,v 1.20 2012/01/29 07:09:52 dholland Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1990, 1993, 1995
@@ -131,10 +131,15 @@
 int quota2_handle_cmd_put(struct ufsmount *, const struct quotakey *,
     const struct quotaval *);
 int quota2_handle_cmd_delete(struct ufsmount *, const struct quotakey *);
-int quota2_handle_cmd_getall(struct ufsmount *, struct quotakcursor *,
+int quota2_handle_cmd_cursorget(struct ufsmount *, struct quotakcursor *,
     struct quotakey *, struct quotaval *, unsigned, unsigned *);
 int quota2_handle_cmd_cursoropen(struct ufsmount *, struct quotakcursor *);
 int quota2_handle_cmd_cursorclose(struct ufsmount *, struct quotakcursor *);
+int quota2_handle_cmd_cursorskipidtype(struct ufsmount *, struct quotakcursor *,
+    int);
+int quota2_handle_cmd_cursoratend(struct ufsmount *, struct quotakcursor *,
+    int *);
+int quota2_handle_cmd_cursorrewind(struct ufsmount *, struct quotakcursor *);
 int q2sync(struct mount *);
 int dq2get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *);
 int dq2sync(struct vnode *, struct dquot *);

cvs diff -r1.25 -r1.26 src/sys/ufs/ufs/ufs_quota2.c (expand / switch to context diff)
--- src/sys/ufs/ufs/ufs_quota2.c 2012/01/29 07:08:58 1.25
+++ src/sys/ufs/ufs/ufs_quota2.c 2012/01/29 07:09:52 1.26
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_quota2.c,v 1.25 2012/01/29 07:08:58 dholland Exp $ */
+/* $NetBSD: ufs_quota2.c,v 1.26 2012/01/29 07:09:52 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.25 2012/01/29 07:08:58 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.26 2012/01/29 07:09:52 dholland Exp $");
 
 #include <sys/buf.h>
 #include <sys/param.h>
@@ -1050,7 +1050,7 @@
 }
 
 int
-quota2_handle_cmd_getall(struct ufsmount *ump, struct quotakcursor *qkc,
+quota2_handle_cmd_cursorget(struct ufsmount *ump, struct quotakcursor *qkc,
     struct quotakey *keys, struct quotaval *vals, unsigned maxreturn,
     unsigned *ret)
 {
@@ -1275,6 +1275,74 @@
 	}
 
 	/* nothing to do */
+
+	return 0;
+}
+
+int
+quota2_handle_cmd_cursorskipidtype(struct ufsmount *ump,
+    struct quotakcursor *qkc, int idtype)
+{
+	struct ufsq2_cursor *cursor;
+	int error;
+
+	cursor = Q2CURSOR(qkc);
+	error = q2cursor_check(cursor);
+	if (error) {
+		return error;
+	}
+
+	switch (idtype) {
+	    case QUOTA_IDTYPE_USER:
+		cursor->q2c_users_done = 1;
+		break;
+	    case QUOTA_IDTYPE_GROUP:
+		cursor->q2c_groups_done = 1;
+		break;
+	    default:
+		return EINVAL;
+	}
+
+	return 0;
+}
+
+int
+quota2_handle_cmd_cursoratend(struct ufsmount *ump, struct quotakcursor *qkc,
+    int *ret)
+{
+	struct ufsq2_cursor *cursor;
+	int error;
+
+	cursor = Q2CURSOR(qkc);
+	error = q2cursor_check(cursor);
+	if (error) {
+		return error;
+	}
+
+	*ret = (cursor->q2c_users_done && cursor->q2c_groups_done);
+	return 0;
+}
+
+int
+quota2_handle_cmd_cursorrewind(struct ufsmount *ump, struct quotakcursor *qkc)
+{
+	struct ufsq2_cursor *cursor;
+	int error;
+
+	cursor = Q2CURSOR(qkc);
+	error = q2cursor_check(cursor);
+	if (error) {
+		return error;
+	}
+
+	cursor->q2c_hashsize = 0;
+
+	cursor->q2c_users_done = 0;
+	cursor->q2c_groups_done = 0;
+	cursor->q2c_defaults_done = 0;
+	cursor->q2c_hashpos = 0;
+	cursor->q2c_uidpos = 0;
+	cursor->q2c_blocks_done = 0;
 
 	return 0;
 }