svn commit: r336017 - in head: include/rpcsvc lib/libutil libexec/rpc.rquotad sys/cddl/contrib/opensolaris/uts/common/fs/zfs usr.bin/quota

2018-07-05 Thread Sean Eric Fagan
Author: sef
Date: Thu Jul  5 22:56:13 2018
New Revision: 336017
URL: https://svnweb.freebsd.org/changeset/base/336017

Log:
  This exposes ZFS user and group quotas via the normal
  quatactl(2) mechanism.  (Read-only at this point, however.)
  In particular, this is to allow rpc.rquotad query quotas
  for NFS mounts, allowing users to see their quotas on the
  hosts using the datasets.
  
  The changes specifically:
  
  * Add new RPC entry points for querying quotas.
  * Changes the library routines to allow non-UFS quotas.
  * Changes rquotad to check for quotas on mounted filesystems,
  rather than being limited to entries in /etc/fstab
  * Lastly, adds a VFS entry-point for ZFS to query quotas.
  
  Note that this makes one unavoidable behavioural change: if quotas
  are enabled, then they can be queried, as opposed to the current
  method of checking for quotas being specified in fstab.  (With
  ZFS, if there are user or group quotas, they're used, always.)
  
  Reviewed by:  delphij, mav
  Approved by:  mav
  Sponsored by: iXsystems Inc
  Differential Revision:https://reviews.freebsd.org/D15886

Modified:
  head/include/rpcsvc/rquota.x
  head/lib/libutil/quotafile.c
  head/libexec/rpc.rquotad/rquotad.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  head/usr.bin/quota/quota.c

Modified: head/include/rpcsvc/rquota.x
==
--- head/include/rpcsvc/rquota.xThu Jul  5 21:38:54 2018
(r336016)
+++ head/include/rpcsvc/rquota.xThu Jul  5 22:56:13 2018
(r336017)
@@ -1,24 +1,55 @@
+/* @(#)rquota.x2.1 88/08/01 4.0 RPCSRC */
+/* @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun Micro */
+
 /*
  * Remote quota protocol
  * Requires unix authentication
  */
 
 #ifndef RPC_HDR
-%#ifndef lint
-%/*static char sccsid[] = "from: @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun 
Micro";*/
-%/*static char sccsid[] = "from: @(#)rquota.x  2.1 88/08/01 4.0 RPCSRC";*/
-%#endif /* not lint */
 %#include 
 %__FBSDID("$FreeBSD$");
 #endif
 
 const RQ_PATHLEN = 1024;
 
+struct sq_dqblk {
+   unsigned int rq_bhardlimit; /* absolute limit on disk blks alloc */
+   unsigned int rq_bsoftlimit; /* preferred limit on disk blks */
+   unsigned int rq_curblocks;  /* current block count */
+   unsigned int rq_fhardlimit; /* absolute limit on allocated files */
+   unsigned int rq_fsoftlimit; /* preferred file limit */
+   unsigned int rq_curfiles;   /* current # allocated files */
+   unsigned int rq_btimeleft;  /* time left for excessive disk use */
+   unsigned int rq_ftimeleft;  /* time left for excessive files */
+};
+
 struct getquota_args {
string gqa_pathp;   /* path to filesystem of interest */
-   int gqa_uid;/* inquire about quota for uid */
+   int gqa_uid;/* Inquire about quota for uid */
 };
 
+struct setquota_args {
+   int sqa_qcmd;
+   string sqa_pathp;   /* path to filesystem of interest */
+   int sqa_id; /* Set quota for uid */
+   sq_dqblk sqa_dqblk;
+};
+
+struct ext_getquota_args {
+   string gqa_pathp;   /* path to filesystem of interest */
+   int gqa_type;   /* Type of quota info is needed about */
+   int gqa_id; /* Inquire about quota for id */
+};
+
+struct ext_setquota_args {
+   int sqa_qcmd;
+   string sqa_pathp;   /* path to filesystem of interest */
+   int sqa_id; /* Set quota for id */
+   int sqa_type;   /* Type of quota to set */
+   sq_dqblk sqa_dqblk;
+};
+
 /*
  * remote quota structure
  */
@@ -37,7 +68,7 @@ struct rquota {
 
 enum gqr_status {
Q_OK = 1,   /* quota returned */
-   Q_NOQUOTA = 2,  /* noquota for uid */
+   Q_NOQUOTA = 2,  /* noquota for uid */
Q_EPERM = 3 /* no permission to access quota */
 };
 
@@ -50,6 +81,15 @@ case Q_EPERM:
void;
 };
 
+union setquota_rslt switch (gqr_status status) {
+case Q_OK:
+   rquota sqr_rquota;  /* valid if status == Q_OK */
+case Q_NOQUOTA:
+   void;
+case Q_EPERM:
+   void;
+};
+
 program RQUOTAPROG {
version RQUOTAVERS {
/*
@@ -63,5 +103,42 @@ program RQUOTAPROG {
 */
getquota_rslt
RQUOTAPROC_GETACTIVEQUOTA(getquota_args) = 2;
+
+   /*
+* Set all quotas
+*/
+   setquota_rslt
+   RQUOTAPROC_SETQUOTA(setquota_args) = 3;
+
+   /*
+* Get active quotas only
+*/
+   setquota_rslt
+   RQUOTAPROC_SETACTIVEQUOTA(setquota_args) = 4;
} = 1;
+   version EXT_RQUOTAVERS {
+   /*
+* Get all quotas
+*/
+   getquota_rslt
+  

Re: svn commit: r336017 - in head: include/rpcsvc lib/libutil libexec/rpc.rquotad sys/cddl/contrib/opensolaris/uts/common/fs/zfs usr.bin/quota

2018-07-06 Thread Toomas Soome via svn-src-head
Hi!

Unfortunately this patch is not quite correct regarding how you define the RPC 
interfaces.

The versioning in RPC is to specify the interface, much like versioning in 
shared library. 

If you have RPC program version 1, exposing functions get_quota() and 
get_active_quota(), and you want to expose new function, you should introduce 
new version.

The best example about this logic is in mount.x - there you can see how they 
have done 2 versions of the interface, expanding the list of exported functions.

The problem is, to create connection with server, you specify  pair, and if supported, you will get the corresponding handle. Now you 
can have situation with mixed new and old interfaces (sharing the same version 
number) but the exported functions are not the same.

rgds,
toomas

> On 6 Jul 2018, at 01:56, Sean Eric Fagan  wrote:
> 
> Author: sef
> Date: Thu Jul  5 22:56:13 2018
> New Revision: 336017
> URL: https://svnweb.freebsd.org/changeset/base/336017
> 
> Log:
>  This exposes ZFS user and group quotas via the normal
>  quatactl(2) mechanism.  (Read-only at this point, however.)
>  In particular, this is to allow rpc.rquotad query quotas
>  for NFS mounts, allowing users to see their quotas on the
>  hosts using the datasets.
> 
>  The changes specifically:
> 
>  * Add new RPC entry points for querying quotas.
>  * Changes the library routines to allow non-UFS quotas.
>  * Changes rquotad to check for quotas on mounted filesystems,
>  rather than being limited to entries in /etc/fstab
>  * Lastly, adds a VFS entry-point for ZFS to query quotas.
> 
>  Note that this makes one unavoidable behavioural change: if quotas
>  are enabled, then they can be queried, as opposed to the current
>  method of checking for quotas being specified in fstab.  (With
>  ZFS, if there are user or group quotas, they're used, always.)
> 
>  Reviewed by: delphij, mav
>  Approved by: mav
>  Sponsored by:iXsystems Inc
>  Differential Revision:   https://reviews.freebsd.org/D15886
> 
> Modified:
>  head/include/rpcsvc/rquota.x
>  head/lib/libutil/quotafile.c
>  head/libexec/rpc.rquotad/rquotad.c
>  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
>  head/usr.bin/quota/quota.c
> 
> Modified: head/include/rpcsvc/rquota.x
> ==
> --- head/include/rpcsvc/rquota.x  Thu Jul  5 21:38:54 2018
> (r336016)
> +++ head/include/rpcsvc/rquota.x  Thu Jul  5 22:56:13 2018
> (r336017)
> @@ -1,24 +1,55 @@
> +/* @(#)rquota.x  2.1 88/08/01 4.0 RPCSRC */
> +/* @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun Micro */
> +
> /*
>  * Remote quota protocol
>  * Requires unix authentication
>  */
> 
> #ifndef RPC_HDR
> -%#ifndef lint
> -%/*static char sccsid[] = "from: @(#)rquota.x 1.2 87/09/20 Copyr 1987 Sun 
> Micro";*/
> -%/*static char sccsid[] = "from: @(#)rquota.x2.1 88/08/01 4.0 
> RPCSRC";*/
> -%#endif /* not lint */
> %#include 
> %__FBSDID("$FreeBSD$");
> #endif
> 
> const RQ_PATHLEN = 1024;
> 
> +struct sq_dqblk {
> + unsigned int rq_bhardlimit; /* absolute limit on disk blks alloc */
> + unsigned int rq_bsoftlimit; /* preferred limit on disk blks */
> + unsigned int rq_curblocks;  /* current block count */
> + unsigned int rq_fhardlimit; /* absolute limit on allocated files */
> + unsigned int rq_fsoftlimit; /* preferred file limit */
> + unsigned int rq_curfiles;   /* current # allocated files */
> + unsigned int rq_btimeleft;  /* time left for excessive disk use */
> + unsigned int rq_ftimeleft;  /* time left for excessive files */
> +};
> +
> struct getquota_args {
>   string gqa_pathp;   /* path to filesystem of interest */
> - int gqa_uid;/* inquire about quota for uid */
> + int gqa_uid;/* Inquire about quota for uid */
> };
> 
> +struct setquota_args {
> + int sqa_qcmd;
> + string sqa_pathp;   /* path to filesystem of interest */
> + int sqa_id; /* Set quota for uid */
> + sq_dqblk sqa_dqblk;
> +};
> +
> +struct ext_getquota_args {
> + string gqa_pathp;   /* path to filesystem of interest */
> + int gqa_type;   /* Type of quota info is needed about */
> + int gqa_id; /* Inquire about quota for id */
> +};
> +
> +struct ext_setquota_args {
> + int sqa_qcmd;
> + string sqa_pathp;   /* path to filesystem of interest */
> + int sqa_id; /* Set quota for id */
> + int sqa_type;   /* Type of quota to set */
> + sq_dqblk sqa_dqblk;
> +};
> +
> /*
>  * remote quota structure
>  */
> @@ -37,7 +68,7 @@ struct rquota {
> 
> enum gqr_status {
>   Q_OK = 1,   /* quota returned */
> - Q_NOQUOTA = 2,  /* noquota for uid */
> + Q_NOQUOTA = 2,  /* noquota for uid */
>   Q_EPERM = 3 /* no permission to access q