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