[PATCH] remove quota support for SunOS4 and Solaris 2 + VxFS
Jeremy Allison
jra at samba.org
Wed Mar 16 04:32:46 UTC 2016
On Sun, Mar 13, 2016 at 08:29:06AM +0200, Uri Simchoni wrote:
> Remove support for SunOS4 and Veritas VxFS on Solaris2 from the legacy quota
> code (because it has a myriad of #ifdefs to support operating systems which
> probably are not in use today).
>
> The intent is not to change one line of code for other OS's because we have
> little testing ability, yet here and there there are users for this code.
>
> Review appreciated,
Hurrah ! Thanks for cleaning up the family room and taking
out the garbage :-).
Pushed !
> From 512859c03ca7291cc98d59a2cf93be7771262c6c Mon Sep 17 00:00:00 2001
> From: Uri Simchoni <uri at samba.org>
> Date: Sun, 13 Mar 2016 08:18:47 +0200
> Subject: [PATCH] smbd: remove quota support for some ancient OSs
>
> Remove quota support for SunOS4 and VxFS on Solaris 2
>
> Signed-off-by: Uri Simchoni <uri at samba.org>
> ---
> source3/smbd/quotas.c | 200 +-------------------------------------------------
> tests/oldquotas.c | 61 +--------------
> 2 files changed, 4 insertions(+), 257 deletions(-)
>
> diff --git a/source3/smbd/quotas.c b/source3/smbd/quotas.c
> index 8e41416..58d8460 100644
> --- a/source3/smbd/quotas.c
> +++ b/source3/smbd/quotas.c
> @@ -40,32 +40,13 @@
>
> #ifdef WITH_QUOTAS
>
> -#if defined(VXFS_QUOTA)
> -
> -/*
> - * In addition to their native filesystems, some systems have Veritas VxFS.
> - * Declare here, define at end: reduces likely "include" interaction problems.
> - * David Lee <T.D.Lee at durham.ac.uk>
> - */
> -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)
> +#if defined(SUNOS5) /* Solaris */
>
> #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.
> @@ -229,7 +210,6 @@ static bool nfs_quotas(char *nfspath, uid_t euser_id, uint64_t *bsize, uint64_t
> DEBUG(10,("nfs_quotas: End of nfs_quotas\n" ));
> return ret;
> }
> -#endif
>
> /****************************************************************************
> try to get the disk space from disk quotas (SunOS & Solaris2 version)
> @@ -242,13 +222,9 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> uid_t euser_id;
> int ret;
> struct dqblk D;
> -#if defined(SUNOS5)
> struct quotctl command;
> int file;
> struct mnttab mnt;
> -#else /* SunOS4 */
> - struct mntent *mnt;
> -#endif
> char *name = NULL;
> FILE *fd;
> SMB_STRUCT_STAT sbuf;
> @@ -264,7 +240,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> devno = sbuf.st_ex_dev ;
> DEBUG(5,("disk_quotas: looking for path \"%s\" devno=%x\n",
> path, (unsigned int)devno));
> -#if defined(SUNOS5)
> if ((fd = fopen(MNTTAB, "r")) == NULL) {
> return false;
> }
> @@ -291,28 +266,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> }
>
> fclose(fd);
> -#else /* SunOS4 */
> - if ((fd = setmntent(MOUNTED, "r")) == NULL) {
> - return false;
> - }
> -
> - while ((mnt = getmntent(fd)) != NULL) {
> - if (sys_stat(mnt->mnt_dir, &sbuf, false) == -1) {
> - continue;
> - }
> - DEBUG(5,("disk_quotas: testing \"%s\" devno=%x\n",
> - mnt->mnt_dir,
> - (unsigned int)sbuf.st_ex_dev));
> - if (sbuf.st_ex_dev == devno) {
> - found = true;
> - name = talloc_strdup(talloc_tos(),
> - mnt->mnt_fsname);
> - break;
> - }
> - }
> -
> - endmntent(fd);
> -#endif
> if (!found) {
> return false;
> }
> @@ -322,7 +275,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> }
> become_root();
>
> -#if defined(SUNOS5)
> if (strcmp(mnt.mnt_fstype, "nfs") == 0) {
> bool retval;
> DEBUG(5,("disk_quotas: looking for mountpath (NFS) \"%s\"\n",
> @@ -343,10 +295,6 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> command.addr = (caddr_t) &D;
> ret = ioctl(file, Q_QUOTACTL, &command);
> close(file);
> -#else
> - DEBUG(5,("disk_quotas: trying quotactl on device \"%s\"\n", name));
> - ret = quotactl(Q_GETQUOTA, name, euser_id, &D);
> -#endif
>
> unbecome_root();
>
> @@ -354,19 +302,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> DEBUG(5,("disk_quotas ioctl (Solaris) failed. Error = %s\n",
> strerror(errno) ));
>
> -#if defined(SUNOS5) && defined(VXFS_QUOTA)
> - /* If normal quotactl() fails, try vxfs private calls */
> - set_effective_uid(euser_id);
> - DEBUG(5,("disk_quotas: mount type \"%s\"\n", mnt.mnt_fstype));
> - if ( 0 == strcmp ( mnt.mnt_fstype, "vxfs" )) {
> - bool retval;
> - retval = disk_quotas_vxfs(name, path,
> - bsize, dfree, dsize);
> - return retval;
> - }
> -#else
> return false;
> -#endif
> }
>
> /* If softlimit is zero, set it equal to hardlimit.
> @@ -403,7 +339,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> }
>
>
> -#else
> +#else /* not Solaris */
>
> #if AIX
> /* AIX quota patch from Ole Holm Nielsen <ohnielse at fysik.dtu.dk> */
> @@ -523,137 +459,7 @@ bool disk_quotas(connection_struct *conn, const char *path, uint64_t *bsize,
> return (True);
> }
>
> -#endif
> -
> -#if defined(VXFS_QUOTA)
> -
> -/****************************************************************************
> -Try to get the disk space from Veritas disk quotas.
> - David Lee <T.D.Lee at durham.ac.uk> August 1999.
> -
> -Background assumptions:
> - Potentially under many Operating Systems. Initially Solaris 2.
> -
> - My guess is that Veritas is largely, though not entirely,
> - independent of OS. So I have separated it out.
> -
> - There may be some details. For example, OS-specific "include" files.
> -
> - It is understood that HPUX 10 somehow gets Veritas quotas without
> - any special effort; if so, this routine need not be compiled in.
> - Dirk De Wachter <Dirk.DeWachter at rug.ac.be>
> -
> -Warning:
> - It is understood that Veritas do not publicly support this ioctl interface.
> - Rather their preference would be for the user (us) to call the native
> - OS and then for the OS itself to call through to the VxFS filesystem.
> - Presumably HPUX 10, see above, does this.
> -
> -Hints for porting:
> - Add your OS to "IFLIST" below.
> - Get it to compile successfully:
> - Almost certainly "include"s require attention: see SUNOS5.
> - In the main code above, arrange for it to be called: see SUNOS5.
> - Test!
> -
> -****************************************************************************/
> -
> -/* "IFLIST"
> - * This "if" is a list of ports:
> - * if defined(OS1) || defined(OS2) || ...
> - */
> -#if defined(SUNOS5)
> -
> -#if defined(SUNOS5)
> -#include <sys/fs/vx_solaris.h>
> -#endif
> -#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)
> -{
> - uid_t user_id, euser_id;
> - int ret;
> - struct vx_dqblk D;
> - struct vx_quotctl quotabuf;
> - struct vx_genioctl genbuf;
> - char *qfname;
> - int file;
> -
> - /*
> - * "name" may or may not include a trailing "/quotas".
> - * Arranging consistency of calling here in "quotas.c" may not be easy and
> - * it might be easier to examine and adjust it here.
> - * Fortunately, VxFS seems not to mind at present.
> - */
> - qfname = talloc_strdup(talloc_tos(), name);
> - if (!qfname) {
> - return false;
> - }
> - /* pstrcat(qfname, "/quotas") ; */ /* possibly examine and adjust "name" */
> -
> - euser_id = geteuid();
> - set_effective_uid(0);
> -
> - DEBUG(5,("disk_quotas: looking for VxFS quotas file \"%s\"\n", qfname));
> - if((file=open(qfname, O_RDONLY,0))<0) {
> - set_effective_uid(euser_id);
> - return(False);
> - }
> - genbuf.ioc_cmd = VX_QUOTACTL;
> - genbuf.ioc_up = (void *) "abuf;
> -
> - quotabuf.cmd = VX_GETQUOTA;
> - quotabuf.uid = euser_id;
> - quotabuf.addr = (caddr_t) &D;
> - ret = ioctl(file, VX_ADMIN_IOCTL, &genbuf);
> - close(file);
> -
> - set_effective_uid(euser_id);
> -
> - if (ret < 0) {
> - DEBUG(5,("disk_quotas ioctl (VxFS) failed. Error = %s\n", strerror(errno) ));
> - return(False);
> - }
> -
> - /* If softlimit is zero, set it equal to hardlimit.
> - */
> -
> - if (D.dqb_bsoftlimit==0)
> - D.dqb_bsoftlimit = D.dqb_bhardlimit;
> -
> - /* Use softlimit to determine disk space. A user exceeding the quota is told
> - * that there's no space left. Writes might actually work for a bit if the
> - * hardlimit is set higher than softlimit. Effectively the disk becomes
> - * made of rubber latex and begins to expand to accommodate the user :-)
> - */
> - DEBUG(5,("disk_quotas for path \"%s\" block c/s/h %ld/%ld/%ld; file c/s/h %ld/%ld/%ld\n",
> - path, D.dqb_curblocks, D.dqb_bsoftlimit, D.dqb_bhardlimit,
> - D.dqb_curfiles, D.dqb_fsoftlimit, D.dqb_fhardlimit));
> -
> - if (D.dqb_bsoftlimit==0)
> - return(False);
> - *bsize = DEV_BSIZE;
> - *dsize = D.dqb_bsoftlimit;
> -
> - if (D.dqb_curblocks > D.dqb_bsoftlimit) {
> - *dfree = 0;
> - *dsize = D.dqb_curblocks;
> - } else
> - *dfree = D.dqb_bsoftlimit - D.dqb_curblocks;
> -
> - DEBUG(5,("disk_quotas for path \"%s\" returning bsize %.0f, dfree %.0f, dsize %.0f\n",
> - path,(double)*bsize,(double)*dfree,(double)*dsize));
> -
> - return(True);
> -}
> -
> -#endif /* SUNOS5 || ... */
> -
> -#endif /* VXFS_QUOTA */
> +#endif /* Solaris */
>
> #else /* WITH_QUOTAS */
>
> diff --git a/tests/oldquotas.c b/tests/oldquotas.c
> index 0aacf23..54dc242 100644
> --- a/tests/oldquotas.c
> +++ b/tests/oldquotas.c
> @@ -12,27 +12,13 @@
>
> #ifdef WITH_QUOTAS
>
> -#if defined(VXFS_QUOTA) /* Veritas VxFS for Solaris 2 */
> -
> -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)
> +#if defined(SUNOS5) /* Solaris */
>
> #include <fcntl.h>
> #include <sys/param.h>
> -#if defined(SUNOS5) /* Solaris */
> #include <sys/fs/ufs_quota.h>
> #include <sys/mnttab.h>
> #include <sys/mntent.h>
> -#else /* SunOS4 */
> -#include <ufs/quota.h>
> -#include <mntent.h>
> -#endif /* Solaris */
> -
> -#if defined(SUNOS5) /* Solaris */
>
> /****************************************************************************
> Allows querying of remote hosts for quotas on NFS mounted shares.
> @@ -53,7 +39,6 @@ static bool nfs_quotas(char *nfspath, uid_t euser_id, uint64_t *bsize,
> clnt = clnt_create("host", RQUOTAPROG, RQUOTAVERS, "udp");
> return true;
> }
> -#endif /* Solaris */
>
> /****************************************************************************
> try to get the disk space from disk quotas (SunOS & Solaris2 version)
> @@ -64,25 +49,14 @@ bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree,
> uint64_t *dsize)
> {
> int ret;
> -#if defined(SUNOS5) /* Solaris */
> struct quotctl command;
> -#else /* SunOS4 */
> - struct mntent *mnt;
> -#endif /* Solaris */
> -#if defined(SUNOS5) /* Solaris */
> nfs_quotas("", 0, bsize, dfree, dsize);
>
> command.op = Q_GETQUOTA;
> command.uid = 0;
> command.addr = NULL;
> ret = ioctl(1, Q_QUOTACTL, &command);
> -#else /* SunOS4 */
> - ret = quotactl(Q_GETQUOTA, "", 0, NULL);
> -#endif /* Solaris */
>
> -#if defined(SUNOS5) && defined(VXFS_QUOTA) /* Solaris 2 VxFS */
> - disk_quotas_vxfs("", path, bsize, dfree, dsize);
> -#endif /* Solaris 2 VxFS */
> return true;
> }
>
> @@ -126,39 +100,6 @@ bool disk_quotas(const char *path, uint64_t *bsize, uint64_t *dfree,
>
> #endif /* SunOS / Solaris */
>
> -#if defined(VXFS_QUOTA) /* Veritas for Solaris 2 */
> -
> -#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"
> --
> 2.5.0
>
More information about the samba-technical
mailing list