[PATCH] support quota on Solaris 10
Jeremy Allison
jra at samba.org
Sat Mar 12 21:19:18 UTC 2016
On Sat, Mar 12, 2016 at 08:35:22PM +0200, Uri Simchoni wrote:
> Hi,
>
> A while back, Andrew Morgan <morgan at orst.edu> reported an issue with quota
> support on Solaris 10. In essence this was a degradation from the autoconf
> build, where configure test is not setting WITH_QUOTAS due to a missing
> test.
>
> Andy and I worked out a fix for this, which he now tested on a production
> system after upgrading to Samba 4.3.6 due to the latest security fixes.
>
> The autoconf build simply tried compiling disk_quotas.c. I had difficulties
> doing that with the waf build, so this patch introduces a stripped-down
> version of disk_quotas.c, tests/oldquotas.c, and configure tries to build
> it.
>
> Please review.
Nice work Uri - thanks ! Pushed.
The #ifdef's in here are an utter rats nest though :-).
Maybe a follow up patch could add comments before the
#else and #endif tags so engineers can see which #ifdef
they're referring to.
Other than that - looks great !
Jeremy.
> Uri.
> From 21a5e4df9cf5de84bdedb5f43535523b68f4e5b3 Mon Sep 17 00:00:00 2001
> From: Uri Simchoni <uri at samba.org>
> Date: Wed, 3 Feb 2016 06:41:42 +0200
> Subject: [PATCH] build: fix disk-free quota support on Solaris 10
>
> Samba has no code to support quota on Solaris 10 (and possibly other
> os's such as AIX) using the new quota interface. The new interface
> serves both disk size/free space reporting (clamping the underlying
> file system numbers with quota), and direct manipulation of the user's
> quota.
>
> However, there's legacy code that supports only disk size/free space on
> Solaris 10. In the waf build, this code is not compiled because there is
> no test for it.
>
> This patch adds a test to see whether the legacy code can be used.
>
> Issue reported and fix tested by Andrew Morgan <morgan at orst.edu>.
>
> BUG: https://bugzilla.samba.org/show_bug.cgi?id=11788
>
> Signed-off-by: Uri Simchoni <uri at samba.org>
> ---
> source3/wscript | 24 +++++++
> source3/wscript_build | 1 +
> tests/oldquotas.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 199 insertions(+)
> create mode 100644 tests/oldquotas.c
>
> diff --git a/source3/wscript b/source3/wscript
> index c6504c6..c23f621 100644
> --- a/source3/wscript
> +++ b/source3/wscript
> @@ -1455,6 +1455,30 @@ main() {
> conf.DEFINE('HAVE_SYS_QUOTAS', '1')
> conf.DEFINE('WITH_QUOTAS', '1')
>
> + #
> + # check if Legacy quota code can be brought in
> + # if standard interfaces are not supported
> + #
> + legacy_quota_libs = ''
> + if not conf.CONFIG_SET('WITH_QUOTAS'):
> + if host_os.rfind('sunos5') > -1:
> + conf.DEFINE('SUNOS5', '1')
> + legacy_quota_libs = 'nsl'
> + conf.CHECK_CODE('''
> + #define WITH_QUOTAS 1
> + #define AUTOCONF_TEST 1
> + #include "../tests/oldquotas.c"
> + ''',
> + cflags=conf.env['WERROR_CFLAGS'],
> + define='WITH_QUOTAS',
> + lib=legacy_quota_libs,
> + msg='Checking whether legacy quota code can be used',
> + execute=False,
> + addmain=False)
> + if not conf.CONFIG_SET('WITH_QUOTAS'):
> + legacy_quota_libs = ''
> + conf.env['legacy_quota_libs'] = legacy_quota_libs
> +
> #
> # cluster support (CTDB)
> #
> diff --git a/source3/wscript_build b/source3/wscript_build
> index 9dc93bf..dce0238 100755
> --- a/source3/wscript_build
> +++ b/source3/wscript_build
> @@ -634,6 +634,7 @@ bld.SAMBA3_LIBRARY('smbd_base',
> notifyd
> ''' +
> bld.env['dmapi_lib'] +
> + bld.env['legacy_quota_libs'] +
> NOTIFY_DEPS,
> private_library=True)
>
> diff --git a/tests/oldquotas.c b/tests/oldquotas.c
> new file mode 100644
> index 0000000..bdb2beb
> --- /dev/null
> +++ b/tests/oldquotas.c
> @@ -0,0 +1,174 @@
> +/* this test should find out whether legacy quota code in disk_quotas.c
> + * compiles. It is a stripped-down version of disk_quotas.c, with samba
> + * stuff removed and only system calls, header files, and constants left.
> + */
> +
> +#ifndef HAVE_SYS_QUOTAS
> +
> +/* just a quick hack because sysquotas.h is included before linux/quota.h */
> +#ifdef QUOTABLOCK_SIZE
> +#undef QUOTABLOCK_SIZE
> +#endif
> +
> +#ifdef WITH_QUOTAS
> +
> +#if defined(VXFS_QUOTA)
> +
> +bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize,
> + uint64_t *dfree, uint64_t *dsize);
> +
> +#endif /* VXFS_QUOTA */
> +
> +#if defined(SUNOS5) || defined(SUNOS4)
> +
> +#include <fcntl.h>
> +#include <sys/param.h>
> +#if defined(SUNOS5)
> +#include <sys/fs/ufs_quota.h>
> +#include <sys/mnttab.h>
> +#include <sys/mntent.h>
> +#else /* defined(SUNOS4) */
> +#include <ufs/quota.h>
> +#include <mntent.h>
> +#endif
> +
> +#if defined(SUNOS5)
> +
> +/****************************************************************************
> + Allows querying of remote hosts for quotas on NFS mounted shares.
> + Supports normal NFS and AMD mounts.
> + Alan Romeril <a.romeril at ic.ac.uk> July 2K.
> +****************************************************************************/
> +
> +#include <rpc/rpc.h>
> +#include <rpc/types.h>
> +#include <rpcsvc/rquota.h>
> +#include <rpc/nettype.h>
> +#include <rpc/xdr.h>
> +
> +static bool nfs_quotas(char *nfspath, uid_t euser_id, uint64_t *bsize,
> + uint64_t *dfree, uint64_t *dsize)
> +{
> + CLIENT *clnt;
> + clnt = clnt_create("host", RQUOTAPROG, RQUOTAVERS, "udp");
> + return true;
> +}
> +#endif
> +
> +/****************************************************************************
> +try to get the disk space from disk quotas (SunOS & Solaris2 version)
> +Quota code by Peter Urbanec (amiga at cse.unsw.edu.au).
> +****************************************************************************/
> +
> +bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree,
> + uint64_t *dsize)
> +{
> + int ret;
> +#if defined(SUNOS5)
> + struct quotctl command;
> +#else /* SunOS4 */
> + struct mntent *mnt;
> +#endif
> +#if defined(SUNOS5)
> + nfs_quotas("", 0, bsize, dfree, dsize);
> +
> + command.op = Q_GETQUOTA;
> + command.uid = 0;
> + command.addr = NULL;
> + ret = ioctl(1, Q_QUOTACTL, &command);
> +#else
> + ret = quotactl(Q_GETQUOTA, "", 0, NULL);
> +#endif
> +
> +#if defined(SUNOS5) && defined(VXFS_QUOTA)
> + disk_quotas_vxfs("", path, bsize, dfree, dsize);
> +#endif
> + return true;
> +}
> +
> +#else
> +
> +#if AIX
> +/* AIX quota patch from Ole Holm Nielsen <ohnielse at fysik.dtu.dk> */
> +#include <jfs/quota.h>
> +/* AIX 4.X: Rename members of the dqblk structure (ohnielse at fysik.dtu.dk) */
> +#define dqb_curfiles dqb_curinodes
> +#define dqb_fhardlimit dqb_ihardlimit
> +#define dqb_fsoftlimit dqb_isoftlimit
> +#ifdef _AIXVERSION_530
> +#include <sys/statfs.h>
> +#include <sys/vmount.h>
> +#endif /* AIX 5.3 */
> +#else /* !AIX */
> +#include <sys/quota.h>
> +#include <devnm.h>
> +#endif
> +
> +/****************************************************************************
> +try to get the disk space from disk quotas - default version
> +****************************************************************************/
> +
> +bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree,
> + uint64_t *dsize)
> +{
> + struct dqblk D;
> +#if defined(AIX)
> +#ifdef _AIXVERSION_530
> + quota64_t user_quota;
> + quotactl(path, QCMD(Q_J2GETQUOTA, USRQUOTA), 0, (char *)&user_quota);
> +#endif /* AIX 5.3 */
> + quotactl(path, QCMD(Q_GETQUOTA, USRQUOTA), 0, (char *)&D);
> +#else /* !AIX */
> + quotactl(Q_GETQUOTA, "", 0, &D);
> +#endif /* !AIX */
> + return (true);
> +}
> +
> +#endif
> +
> +#if defined(VXFS_QUOTA)
> +
> +#if defined(SUNOS5)
> +
> +#include <sys/fs/vx_solaris.h>
> +#include <sys/fs/vx_machdep.h>
> +#include <sys/fs/vx_layout.h>
> +#include <sys/fs/vx_quota.h>
> +#include <sys/fs/vx_aioctl.h>
> +#include <sys/fs/vx_ioctl.h>
> +
> +bool disk_quotas_vxfs(const char *name, char *path, uint64_t *bsize,
> + uint64_t *dfree, uint64_t *dsize)
> +{
> + struct vx_dqblk D;
> + struct vx_quotctl quotabuf;
> + struct vx_genioctl genbuf;
> +
> + genbuf.ioc_cmd = VX_QUOTACTL;
> + genbuf.ioc_up = (void *)"abuf;
> +
> + quotabuf.cmd = VX_GETQUOTA;
> + quotabuf.uid = 0;
> + quotabuf.addr = (caddr_t)&D;
> + ret = ioctl(1, VX_ADMIN_IOCTL, &genbuf);
> +
> + return true;
> +}
> +
> +#endif /* SUNOS5 || ... */
> +
> +#endif /* VXFS_QUOTA */
> +
> +#else /* WITH_QUOTAS */
> +
> +#error "This test should be called with WITH_QUOTAS defined"
> +
> +#endif /* WITH_QUOTAS */
> +
> +#else /* HAVE_SYS_QUOTAS */
> +
> +#error "This test should not be called for systems with new quota interface"
> +
> +#endif /* HAVE_SYS_QUOTAS */
> +
> +int main() { return disk_quotas(NULL, NULL, NULL, NULL); }
> --
> 2.5.0
>
More information about the samba-technical
mailing list