Module Name: src Committed By: dholland Date: Sun Jan 29 07:08:58 UTC 2012
Modified Files: src/sys/kern: vfs_quotactl.c src/sys/sys: quotactl.h src/sys/ufs/ufs: ufs_quota.c ufs_quota.h ufs_quota2.c Log Message: Don't pass the idtype to QUOTACTL_GETALL. Instead, iterate both users and groups. This change requires a kernel version bump. To generate a diff of this commit: cvs rdiff -u -r1.27 -r1.28 src/sys/kern/vfs_quotactl.c cvs rdiff -u -r1.24 -r1.25 src/sys/sys/quotactl.h cvs rdiff -u -r1.96 -r1.97 src/sys/ufs/ufs/ufs_quota.c cvs rdiff -u -r1.18 -r1.19 src/sys/ufs/ufs/ufs_quota.h cvs rdiff -u -r1.24 -r1.25 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/sys/kern/vfs_quotactl.c diff -u src/sys/kern/vfs_quotactl.c:1.27 src/sys/kern/vfs_quotactl.c:1.28 --- src/sys/kern/vfs_quotactl.c:1.27 Sun Jan 29 07:07:22 2012 +++ src/sys/kern/vfs_quotactl.c Sun Jan 29 07:08:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_quotactl.c,v 1.27 2012/01/29 07:07:22 dholland Exp $ */ +/* $NetBSD: vfs_quotactl.c,v 1.28 2012/01/29 07:08:58 dholland Exp $ */ /* * Copyright (c) 1991, 1993, 1994 @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.27 2012/01/29 07:07:22 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.28 2012/01/29 07:08:58 dholland Exp $"); #include <sys/malloc.h> /* XXX: temporary */ #include <sys/mount.h> @@ -566,21 +566,8 @@ vfs_quotactl_getall(struct mount *mp, args.u.getall.qc_vals = vals; args.u.getall.qc_maxnum = loopmax; args.u.getall.qc_ret = &loopnum; - args.u.getall.qc_idtype = q2type; /* XXX */ error = VFS_QUOTACTL(mp, QUOTACTL_GETALL, &args); - /* - * XXX this is bogus but up until now *all* errors - * from inside quotactl_getall were suppressed by the - * dispatching code in ufs_quota.c. Fixing that causes - * repquota to break in an undesirable way; this is a - * workaround. - */ - if (error == ENODEV || error == ENXIO) { - error = 0; - break; - } - if (error) { goto err; } @@ -594,6 +581,11 @@ vfs_quotactl_getall(struct mount *mp, key = &keys[i]; val = &vals[i]; + if (key->qk_idtype != q2type) { + /* don't want this result */ + continue; + } + if (thisreply == NULL || key->qk_id != lastid) { lastid = key->qk_id; thisreply = vfs_quotactl_getall_makereply(key); Index: src/sys/sys/quotactl.h diff -u src/sys/sys/quotactl.h:1.24 src/sys/sys/quotactl.h:1.25 --- src/sys/sys/quotactl.h:1.24 Sun Jan 29 07:07:22 2012 +++ src/sys/sys/quotactl.h Sun Jan 29 07:08:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: quotactl.h,v 1.24 2012/01/29 07:07:22 dholland Exp $ */ +/* $NetBSD: quotactl.h,v 1.25 2012/01/29 07:08:58 dholland Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -107,7 +107,6 @@ struct vfs_quotactl_args { struct quotaval *qc_vals; unsigned qc_maxnum; unsigned *qc_ret; - int qc_idtype; } getall; } u; }; Index: src/sys/ufs/ufs/ufs_quota.c diff -u src/sys/ufs/ufs/ufs_quota.c:1.96 src/sys/ufs/ufs/ufs_quota.c:1.97 --- src/sys/ufs/ufs/ufs_quota.c:1.96 Sun Jan 29 07:07:22 2012 +++ src/sys/ufs/ufs/ufs_quota.c Sun Jan 29 07:08:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota.c,v 1.96 2012/01/29 07:07:22 dholland Exp $ */ +/* $NetBSD: ufs_quota.c,v 1.97 2012/01/29 07:08:58 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.96 2012/01/29 07:07:22 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.97 2012/01/29 07:08:58 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -374,7 +374,6 @@ quota_handle_cmd_getall(struct mount *mp struct quotaval *vals; unsigned maxnum; unsigned *ret; - int idtype; int error; KASSERT(args->qc_type == QCT_GETALL); @@ -383,7 +382,6 @@ quota_handle_cmd_getall(struct mount *mp vals = args->u.getall.qc_vals; maxnum = args->u.getall.qc_maxnum; ret = args->u.getall.qc_ret; - idtype = args->u.getall.qc_idtype; if ((ump->um_flags & UFS_QUOTA2) == 0) return EOPNOTSUPP; @@ -395,7 +393,7 @@ quota_handle_cmd_getall(struct mount *mp #ifdef QUOTA2 if (ump->um_flags & UFS_QUOTA2) { - error = quota2_handle_cmd_getall(ump, cursor, idtype, + error = quota2_handle_cmd_getall(ump, cursor, keys, vals, maxnum, ret); } else #endif Index: src/sys/ufs/ufs/ufs_quota.h diff -u src/sys/ufs/ufs/ufs_quota.h:1.18 src/sys/ufs/ufs/ufs_quota.h:1.19 --- src/sys/ufs/ufs/ufs_quota.h:1.18 Sun Jan 29 07:07:22 2012 +++ src/sys/ufs/ufs/ufs_quota.h Sun Jan 29 07:08:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota.h,v 1.18 2012/01/29 07:07:22 dholland Exp $ */ +/* $NetBSD: ufs_quota.h,v 1.19 2012/01/29 07:08:58 dholland Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993, 1995 @@ -131,7 +131,7 @@ int quota2_handle_cmd_get(struct ufsmoun 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, +int quota2_handle_cmd_getall(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 *); Index: src/sys/ufs/ufs/ufs_quota2.c diff -u src/sys/ufs/ufs/ufs_quota2.c:1.24 src/sys/ufs/ufs/ufs_quota2.c:1.25 --- src/sys/ufs/ufs/ufs_quota2.c:1.24 Sun Jan 29 07:08:00 2012 +++ src/sys/ufs/ufs/ufs_quota2.c Sun Jan 29 07:08:58 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_quota2.c,v 1.24 2012/01/29 07:08:00 dholland Exp $ */ +/* $NetBSD: ufs_quota2.c,v 1.25 2012/01/29 07:08:58 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.24 2012/01/29 07:08:00 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_quota2.c,v 1.25 2012/01/29 07:08:58 dholland Exp $"); #include <sys/buf.h> #include <sys/param.h> @@ -966,6 +966,8 @@ struct ufsq2_cursor { uint32_t q2c_magic; /* magic number */ int q2c_hashsize; /* size of hash table at last go */ + int q2c_users_done; /* true if we've returned all user data */ + int q2c_groups_done; /* true if we've returned all group data */ int q2c_defaults_done; /* true if we've returned the default values */ int q2c_hashpos; /* slot to start at in hash table */ int q2c_uidpos; /* number of ids we've handled */ @@ -986,6 +988,12 @@ q2cursor_check(struct ufsq2_cursor *curs return EINVAL; } + if (cursor->q2c_users_done != 0 && cursor->q2c_users_done != 1) { + return EINVAL; + } + if (cursor->q2c_groups_done != 0 && cursor->q2c_groups_done != 1) { + return EINVAL; + } if (cursor->q2c_defaults_done != 0 && cursor->q2c_defaults_done != 1) { return EINVAL; } @@ -1043,8 +1051,8 @@ quota2_getuids_callback(struct ufsmount int quota2_handle_cmd_getall(struct ufsmount *ump, struct quotakcursor *qkc, - int idtype, struct quotakey *keys, struct quotaval *vals, - unsigned maxreturn, unsigned *ret) + struct quotakey *keys, struct quotaval *vals, unsigned maxreturn, + unsigned *ret) { int error; struct ufsq2_cursor *cursor; @@ -1052,6 +1060,8 @@ quota2_handle_cmd_getall(struct ufsmount struct quota2_entry q2e; struct buf *hbp; uint64_t offset; + int idtype; + int can_switch_idtype; int i, j; int quota2_hash_size; const int needswap = UFS_MPNEEDSWAP(ump); @@ -1069,10 +1079,34 @@ quota2_handle_cmd_getall(struct ufsmount return error; } - if (ump->um_quotas[idtype] == NULLVP) { - return ENODEV; + CTASSERT(USRQUOTA == QUOTA_IDTYPE_USER); + CTASSERT(GRPQUOTA == QUOTA_IDTYPE_GROUP); + + if (cursor->q2c_users_done == 0 && + ump->um_quotas[USRQUOTA] == NULLVP) { + cursor->q2c_users_done = 1; + } + if (cursor->q2c_groups_done == 0 && + ump->um_quotas[GRPQUOTA] == NULLVP) { + cursor->q2c_groups_done = 1; + } + +restart: + + if (cursor->q2c_users_done == 0) { + idtype = QUOTA_IDTYPE_USER; + can_switch_idtype = 1; + } else if (cursor->q2c_groups_done == 0) { + idtype = QUOTA_IDTYPE_GROUP; + can_switch_idtype = 0; + } else { + /* nothing more to do, return 0 */ + *ret = 0; + return 0; } + KASSERT(ump->um_quotas[idtype] != NULLVP); + numreturn = 0; mutex_enter(&dqlock); @@ -1160,6 +1194,16 @@ fail: if (error) return error; + if (gu.nuids == 0) { + if (idtype == QUOTA_IDTYPE_USER) + cursor->q2c_users_done = 1; + else + cursor->q2c_groups_done = 1; + if (can_switch_idtype) { + goto restart; + } + } + maxnum = gu.nuids*2; /* @@ -1209,6 +1253,8 @@ quota2_handle_cmd_cursoropen(struct ufsm cursor->q2c_magic = Q2C_MAGIC; 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;