[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