Module Name: src
Committed By: dholland
Date: Sun Jan 29 07:12:41 UTC 2012
Modified Files:
src/sys/kern: vfs_quotactl.c
src/sys/sys: quotactl.h
src/sys/ufs/ufs: ufs_quota.c
Log Message:
Change QUOTACTL_GETVERSION to QUOTACTL_STAT. Add struct quotastat.
This change requires a kernel version bump.
To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/kern/vfs_quotactl.c
cvs rdiff -u -r1.28 -r1.29 src/sys/sys/quotactl.h
cvs rdiff -u -r1.100 -r1.101 src/sys/ufs/ufs/ufs_quota.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.32 src/sys/kern/vfs_quotactl.c:1.33
--- src/sys/kern/vfs_quotactl.c:1.32 Sun Jan 29 07:11:55 2012
+++ src/sys/kern/vfs_quotactl.c Sun Jan 29 07:12:40 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_quotactl.c,v 1.32 2012/01/29 07:11:55 dholland Exp $ */
+/* $NetBSD: vfs_quotactl.c,v 1.33 2012/01/29 07:12:40 dholland Exp $ */
/*
* Copyright (c) 1991, 1993, 1994
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.32 2012/01/29 07:11:55 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_quotactl.c,v 1.33 2012/01/29 07:12:40 dholland Exp $");
#include <sys/malloc.h> /* XXX: temporary */
#include <sys/mount.h>
@@ -95,6 +95,7 @@ vfs_quotactl_getversion(struct mount *mp
{
prop_array_t replies;
prop_dictionary_t data;
+ struct quotastat stat;
int q2version;
struct vfs_quotactl_args args;
int error;
@@ -102,13 +103,24 @@ vfs_quotactl_getversion(struct mount *mp
KASSERT(prop_object_type(cmddict) == PROP_TYPE_DICTIONARY);
KASSERT(prop_object_type(datas) == PROP_TYPE_ARRAY);
- args.qc_type = QCT_GETVERSION;
- args.u.getversion.qc_version_ret = &q2version;
- error = VFS_QUOTACTL(mp, QUOTACTL_GETVERSION, &args);
+ args.qc_type = QCT_STAT;
+ args.u.stat.qc_ret = &stat;
+ error = VFS_QUOTACTL(mp, QUOTACTL_STAT, &args);
if (error) {
return error;
}
+ /*
+ * Set q2version based on the stat results. Currently there
+ * are two valid values for q2version, 1 and 2, which we pick
+ * based on whether quotacheck is required.
+ */
+ if (stat.qs_restrictions & QUOTA_RESTRICT_NEEDSQUOTACHECK) {
+ q2version = 1;
+ } else {
+ q2version = 2;
+ }
+
data = prop_dictionary_create();
if (data == NULL) {
return ENOMEM;
Index: src/sys/sys/quotactl.h
diff -u src/sys/sys/quotactl.h:1.28 src/sys/sys/quotactl.h:1.29
--- src/sys/sys/quotactl.h:1.28 Sun Jan 29 07:11:55 2012
+++ src/sys/sys/quotactl.h Sun Jan 29 07:12:41 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: quotactl.h,v 1.28 2012/01/29 07:11:55 dholland Exp $ */
+/* $NetBSD: quotactl.h,v 1.29 2012/01/29 07:12:41 dholland Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -37,6 +37,26 @@
* use the <quota.h> API instead.
*/
+/* Size of random quota strings */
+#define QUOTA_NAMELEN 32
+
+/*
+ * Restrictions for qs_restrictions.
+ */
+#define QUOTA_RESTRICT_NEEDSQUOTACHECK 0x1 /* quotacheck(8) required */
+#define QUOTA_RESTRICT_UNIFORMGRACE 0x2 /* grace time is global */
+#define QUOTA_RESTRICT_32BIT 0x4 /* values limited to 2^32 */
+
+/*
+ * Structure for QUOTACTL_STAT.
+ */
+struct quotastat {
+ char qs_implname[QUOTA_NAMELEN];
+ unsigned qs_numidtypes;
+ unsigned qs_numobjtypes;
+ unsigned qs_restrictions;
+};
+
/*
* Semi-opaque structure for cursors. This holds the cursor state in
* userland; the size is exposed only to libquota, not to client code,
@@ -52,7 +72,7 @@ struct quotakcursor {
};
/* Command codes. */
-#define QUOTACTL_GETVERSION 0
+#define QUOTACTL_STAT 0
#define QUOTACTL_QUOTAON 1
#define QUOTACTL_QUOTAOFF 2
#define QUOTACTL_GET 3
@@ -68,7 +88,7 @@ struct quotakcursor {
/* Argument encoding. */
enum vfs_quotactl_argtypes {
QCT_PROPLIB, /* unused */
- QCT_GETVERSION, /* getversion */
+ QCT_STAT, /* stat */
QCT_GET, /* get */
QCT_PUT, /* put */
QCT_DELETE, /* delete */
@@ -90,8 +110,8 @@ struct vfs_quotactl_args {
prop_array_t qc_datas;
} proplib;
struct {
- int *qc_version_ret;
- } getversion;
+ struct quotastat *qc_ret;
+ } stat;
struct {
const struct quotakey *qc_key;
struct quotaval *qc_ret;
Index: src/sys/ufs/ufs/ufs_quota.c
diff -u src/sys/ufs/ufs/ufs_quota.c:1.100 src/sys/ufs/ufs/ufs_quota.c:1.101
--- src/sys/ufs/ufs/ufs_quota.c:1.100 Sun Jan 29 07:11:55 2012
+++ src/sys/ufs/ufs/ufs_quota.c Sun Jan 29 07:12:41 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_quota.c,v 1.100 2012/01/29 07:11:55 dholland Exp $ */
+/* $NetBSD: ufs_quota.c,v 1.101 2012/01/29 07:12:41 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.100 2012/01/29 07:11:55 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_quota.c,v 1.101 2012/01/29 07:12:41 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_quota.h"
@@ -71,7 +71,7 @@ static u_long dqhash;
static pool_cache_t dquot_cache;
-static int quota_handle_cmd_get_version(struct mount *, struct lwp *,
+static int quota_handle_cmd_stat(struct mount *, struct lwp *,
struct vfs_quotactl_args *args);
static int quota_handle_cmd_get(struct mount *, struct lwp *,
struct vfs_quotactl_args *args);
@@ -170,8 +170,8 @@ quota_handle_cmd(struct mount *mp, struc
int error = 0;
switch (op) {
- case QUOTACTL_GETVERSION:
- error = quota_handle_cmd_get_version(mp, l, args);
+ case QUOTACTL_STAT:
+ error = quota_handle_cmd_stat(mp, l, args);
break;
case QUOTACTL_QUOTAON:
error = quota_handle_cmd_quotaon(mp, l, args);
@@ -214,26 +214,36 @@ quota_handle_cmd(struct mount *mp, struc
}
static int
-quota_handle_cmd_get_version(struct mount *mp, struct lwp *l,
+quota_handle_cmd_stat(struct mount *mp, struct lwp *l,
struct vfs_quotactl_args *args)
{
struct ufsmount *ump = VFSTOUFS(mp);
- int *version_ret;
+ struct quotastat *ret;
- KASSERT(args->qc_type == QCT_GETVERSION);
- version_ret = args->u.getversion.qc_version_ret;
+ KASSERT(args->qc_type == QCT_STAT);
+ ret = args->u.stat.qc_ret;
if ((ump->um_flags & (UFS_QUOTA|UFS_QUOTA2)) == 0)
return EOPNOTSUPP;
#ifdef QUOTA
if (ump->um_flags & UFS_QUOTA) {
- *version_ret = 1;
+ strcpy(ret->qs_implname, "ufs/ffs quota v1");
+ ret->qs_numidtypes = MAXQUOTAS;
+ /* XXX no define for this */
+ ret->qs_numobjtypes = 2;
+ ret->qs_restrictions = 0;
+ ret->qs_restrictions |= QUOTA_RESTRICT_NEEDSQUOTACHECK;
+ ret->qs_restrictions |= QUOTA_RESTRICT_UNIFORMGRACE;
+ ret->qs_restrictions |= QUOTA_RESTRICT_32BIT;
} else
#endif
#ifdef QUOTA2
if (ump->um_flags & UFS_QUOTA2) {
- *version_ret = 2;
+ strcpy(ret->qs_implname, "ufs/ffs quota v2");
+ ret->qs_numidtypes = MAXQUOTAS;
+ ret->qs_numobjtypes = N_QL;
+ ret->qs_restrictions = 0;
} else
#endif
return EOPNOTSUPP;