[PATCH 13/17] xfs: get rid of indirections in the quotaops implementation

Christoph Hellwig hch at infradead.org
Wed May 13 03:11:02 CDT 2009


On Mon, Jan 26, 2009 at 02:31:49AM -0500, Christoph Hellwig wrote:
> Currently we call from the nicely abstracted linux quotaops into a ugly
> multiplexer just to split the calls out at the same boundary again.
> Rewrite the quota ops handling to remove that obfucation.

What's the chance of getting a full review for this one after almost
four month?

> 
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> 
> Index: xfs/fs/xfs/linux-2.6/xfs_super.c
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c	2009-01-24 18:50:29.764553115 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_super.c	2009-01-24 18:52:52.180428678 +0100
> @@ -68,7 +68,6 @@
>  #include <linux/freezer.h>
>  #include <linux/parser.h>
>  
> -static struct quotactl_ops xfs_quotactl_operations;
>  static struct super_operations xfs_super_operations;
>  static kmem_zone_t *xfs_ioend_zone;
>  mempool_t *xfs_ioend_pool;
> @@ -1333,57 +1332,6 @@ xfs_fs_show_options(
>  	return -xfs_showargs(XFS_M(mnt->mnt_sb), m);
>  }
>  
> -STATIC int
> -xfs_fs_quotasync(
> -	struct super_block	*sb,
> -	int			type)
> -{
> -	return -XFS_QM_QUOTACTL(XFS_M(sb), Q_XQUOTASYNC, 0, NULL);
> -}
> -
> -STATIC int
> -xfs_fs_getxstate(
> -	struct super_block	*sb,
> -	struct fs_quota_stat	*fqs)
> -{
> -	return -XFS_QM_QUOTACTL(XFS_M(sb), Q_XGETQSTAT, 0, (caddr_t)fqs);
> -}
> -
> -STATIC int
> -xfs_fs_setxstate(
> -	struct super_block	*sb,
> -	unsigned int		flags,
> -	int			op)
> -{
> -	return -XFS_QM_QUOTACTL(XFS_M(sb), op, 0, (caddr_t)&flags);
> -}
> -
> -STATIC int
> -xfs_fs_getxquota(
> -	struct super_block	*sb,
> -	int			type,
> -	qid_t			id,
> -	struct fs_disk_quota	*fdq)
> -{
> -	return -XFS_QM_QUOTACTL(XFS_M(sb),
> -				 (type == USRQUOTA) ? Q_XGETQUOTA :
> -				  ((type == GRPQUOTA) ? Q_XGETGQUOTA :
> -				   Q_XGETPQUOTA), id, (caddr_t)fdq);
> -}
> -
> -STATIC int
> -xfs_fs_setxquota(
> -	struct super_block	*sb,
> -	int			type,
> -	qid_t			id,
> -	struct fs_disk_quota	*fdq)
> -{
> -	return -XFS_QM_QUOTACTL(XFS_M(sb),
> -				 (type == USRQUOTA) ? Q_XSETQLIM :
> -				  ((type == GRPQUOTA) ? Q_XSETGQLIM :
> -				   Q_XSETPQLIM), id, (caddr_t)fdq);
> -}
> -
>  /*
>   * This function fills in xfs_mount_t fields based on mount args.
>   * Note: the superblock _has_ now been read in.
> @@ -1466,7 +1414,9 @@ xfs_fs_fill_super(
>  	sb_min_blocksize(sb, BBSIZE);
>  	sb->s_xattr = xfs_xattr_handlers;
>  	sb->s_export_op = &xfs_export_operations;
> +#ifdef CONFIG_XFS_QUOTA
>  	sb->s_qcop = &xfs_quotactl_operations;
> +#endif
>  	sb->s_op = &xfs_super_operations;
>  
>  	error = xfs_dmops_get(mp);
> @@ -1609,14 +1559,6 @@ static struct super_operations xfs_super
>  	.show_options		= xfs_fs_show_options,
>  };
>  
> -static struct quotactl_ops xfs_quotactl_operations = {
> -	.quota_sync		= xfs_fs_quotasync,
> -	.get_xstate		= xfs_fs_getxstate,
> -	.set_xstate		= xfs_fs_setxstate,
> -	.get_xquota		= xfs_fs_getxquota,
> -	.set_xquota		= xfs_fs_setxquota,
> -};
> -
>  static struct file_system_type xfs_fs_type = {
>  	.owner			= THIS_MODULE,
>  	.name			= "xfs",
> Index: xfs/fs/xfs/Makefile
> ===================================================================
> --- xfs.orig/fs/xfs/Makefile	2009-01-21 21:03:27.824295159 +0100
> +++ xfs/fs/xfs/Makefile	2009-01-24 18:52:52.184428210 +0100
> @@ -33,6 +33,7 @@ xfs-$(CONFIG_XFS_QUOTA)		+= $(addprefix 
>  				   xfs_qm_syscalls.o \
>  				   xfs_qm_bhv.o \
>  				   xfs_qm.o)
> +xfs-$(CONFIG_XFS_QUOTA)		+= linux-2.6/xfs_quotaops.o
>  
>  ifeq ($(CONFIG_XFS_QUOTA),y)
>  xfs-$(CONFIG_PROC_FS)		+= quota/xfs_qm_stats.o
> Index: xfs/fs/xfs/linux-2.6/xfs_linux.h
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_linux.h	2009-01-21 21:03:27.828295110 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_linux.h	2009-01-24 18:52:52.191428473 +0100
> @@ -147,17 +147,6 @@
>  #define SYNCHRONIZE()	barrier()
>  #define __return_address __builtin_return_address(0)
>  
> -/*
> - * IRIX (BSD) quotactl makes use of separate commands for user/group,
> - * whereas on Linux the syscall encodes this information into the cmd
> - * field (see the QCMD macro in quota.h).  These macros help keep the
> - * code portable - they are not visible from the syscall interface.
> - */
> -#define Q_XSETGQLIM	XQM_CMD(8)	/* set groups disk limits */
> -#define Q_XGETGQUOTA	XQM_CMD(9)	/* get groups disk limits */
> -#define Q_XSETPQLIM	XQM_CMD(10)	/* set projects disk limits */
> -#define Q_XGETPQUOTA	XQM_CMD(11)	/* get projects disk limits */
> -
>  #define dfltprid	0
>  #define MAXPATHLEN	1024
>  
> Index: xfs/fs/xfs/linux-2.6/xfs_quotaops.c
> ===================================================================
> --- /dev/null	1970-01-01 00:00:00.000000000 +0000
> +++ xfs/fs/xfs/linux-2.6/xfs_quotaops.c	2009-01-24 18:52:52.192428740 +0100
> @@ -0,0 +1,157 @@
> +/*
> + * Copyright (c) 2008, Christoph Hellwig
> + * All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it would be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write the Free Software Foundation,
> + * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + */
> +#include "xfs.h"
> +#include "xfs_dmapi.h"
> +#include "xfs_sb.h"
> +#include "xfs_inum.h"
> +#include "xfs_ag.h"
> +#include "xfs_mount.h"
> +#include "xfs_quota.h"
> +#include "xfs_log.h"
> +#include "xfs_trans.h"
> +#include "xfs_bmap_btree.h"
> +#include "xfs_inode.h"
> +#include "quota/xfs_qm.h"
> +#include <linux/quota.h>
> +
> +
> +STATIC int
> +xfs_quota_type(int type)
> +{
> +	switch (type) {
> +	case USRQUOTA:
> +		return XFS_DQ_USER;
> +	case GRPQUOTA:
> +		return XFS_DQ_GROUP;
> +	default:
> +		return XFS_DQ_PROJ;
> +	}
> +}
> +
> +STATIC int
> +xfs_fs_quota_sync(
> +	struct super_block	*sb,
> +	int			type)
> +{
> +	struct xfs_mount	*mp = XFS_M(sb);
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return -ENOSYS;
> +	return -xfs_sync_inodes(mp, SYNC_DELWRI);
> +}
> +
> +STATIC int
> +xfs_fs_get_xstate(
> +	struct super_block	*sb,
> +	struct fs_quota_stat	*fqs)
> +{
> +	struct xfs_mount	*mp = XFS_M(sb);
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return -ENOSYS;
> +	return xfs_qm_scall_getqstat(mp, fqs);
> +}
> +
> +STATIC int
> +xfs_fs_set_xstate(
> +	struct super_block	*sb,
> +	unsigned int		uflags,
> +	int			op)
> +{
> +	struct xfs_mount	*mp = XFS_M(sb);
> +	unsigned int		flags = 0;
> +
> +	if (sb->s_flags & MS_RDONLY)
> +		return -EROFS;
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return -ENOSYS;
> +	if (!capable(CAP_SYS_ADMIN))
> +		return -EPERM;
> +
> +	if (uflags & XFS_QUOTA_UDQ_ACCT)
> +		flags |= XFS_UQUOTA_ACCT;
> +	if (uflags & XFS_QUOTA_PDQ_ACCT)
> +		flags |= XFS_PQUOTA_ACCT;
> +	if (uflags & XFS_QUOTA_GDQ_ACCT)
> +		flags |= XFS_GQUOTA_ACCT;
> +	if (uflags & XFS_QUOTA_UDQ_ENFD)
> +		flags |= XFS_UQUOTA_ENFD;
> +	if (uflags & (XFS_QUOTA_PDQ_ENFD|XFS_QUOTA_GDQ_ENFD))
> +		flags |= XFS_OQUOTA_ENFD;
> +
> +	switch (op) {
> +	case Q_XQUOTAON:
> +		return -xfs_qm_scall_quotaon(mp, flags);
> +	case Q_XQUOTAOFF:
> +		if (!XFS_IS_QUOTA_ON(mp))
> +			return -EINVAL;
> +		return -xfs_qm_scall_quotaoff(mp, flags);
> +	case Q_XQUOTARM:
> +		if (XFS_IS_QUOTA_ON(mp))
> +			return -EINVAL;
> +		return -xfs_qm_scall_trunc_qfiles(mp, flags);
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +STATIC int
> +xfs_fs_get_xquota(
> +	struct super_block	*sb,
> +	int			type,
> +	qid_t			id,
> +	struct fs_disk_quota	*fdq)
> +{
> +	struct xfs_mount	*mp = XFS_M(sb);
> +
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return -ENOSYS;
> +	if (!XFS_IS_QUOTA_ON(mp))
> +		return -ESRCH;
> +
> +	return -xfs_qm_scall_getquota(mp, id, xfs_quota_type(type), fdq);
> +}
> +
> +STATIC int
> +xfs_fs_set_xquota(
> +	struct super_block	*sb,
> +	int			type,
> +	qid_t			id,
> +	struct fs_disk_quota	*fdq)
> +{
> +	struct xfs_mount	*mp = XFS_M(sb);
> +
> +	if (sb->s_flags & MS_RDONLY)
> +		return -EROFS;
> +	if (!XFS_IS_QUOTA_RUNNING(mp))
> +		return -ENOSYS;
> +	if (!XFS_IS_QUOTA_ON(mp))
> +		return -ESRCH;
> +	if (!capable(CAP_SYS_ADMIN))
> +		return -EPERM;
> +
> +	return xfs_qm_scall_setqlim(mp, id, xfs_quota_type(type), fdq);
> +}
> +
> +struct quotactl_ops xfs_quotactl_operations = {
> +	.quota_sync		= xfs_fs_quota_sync,
> +	.get_xstate		= xfs_fs_get_xstate,
> +	.set_xstate		= xfs_fs_set_xstate,
> +	.get_xquota		= xfs_fs_get_xquota,
> +	.set_xquota		= xfs_fs_set_xquota,
> +};
> Index: xfs/fs/xfs/linux-2.6/xfs_super.h
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_super.h	2009-01-21 21:03:27.831294794 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_super.h	2009-01-24 18:52:52.192428740 +0100
> @@ -93,6 +93,7 @@ extern void xfs_blkdev_issue_flush(struc
>  
>  extern const struct export_operations xfs_export_operations;
>  extern struct xattr_handler *xfs_xattr_handlers[];
> +extern struct quotactl_ops xfs_quotactl_operations;
>  
>  #define XFS_M(sb)		((struct xfs_mount *)((sb)->s_fs_info))
>  
> Index: xfs/fs/xfs/linux-2.6/xfs_sync.h
> ===================================================================
> --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h	2009-01-24 17:58:49.029903800 +0100
> +++ xfs/fs/xfs/linux-2.6/xfs_sync.h	2009-01-24 18:52:52.203535043 +0100
> @@ -19,6 +19,7 @@
>  #define XFS_SYNC_H 1
>  
>  struct xfs_mount;
> +struct xfs_perag;
>  
>  typedef struct bhv_vfs_sync_work {
>  	struct list_head	w_list;
> Index: xfs/fs/xfs/quota/xfs_qm.h
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm.h	2009-01-21 21:03:27.835294745 +0100
> +++ xfs/fs/xfs/quota/xfs_qm.h	2009-01-24 18:52:52.206583965 +0100
> @@ -178,6 +178,16 @@ extern void		xfs_qm_dqdetach(xfs_inode_t
>  extern int		xfs_qm_dqpurge_all(xfs_mount_t *, uint);
>  extern void		xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint);
>  
> +/* quota ops */
> +extern int		xfs_qm_scall_trunc_qfiles(xfs_mount_t *, uint);
> +extern int		xfs_qm_scall_getquota(xfs_mount_t *, xfs_dqid_t, uint,
> +					fs_disk_quota_t *);
> +extern int		xfs_qm_scall_setqlim(xfs_mount_t *, xfs_dqid_t, uint,
> +					fs_disk_quota_t *);
> +extern int		xfs_qm_scall_getqstat(xfs_mount_t *, fs_quota_stat_t *);
> +extern int		xfs_qm_scall_quotaon(xfs_mount_t *, uint);
> +extern int		xfs_qm_scall_quotaoff(xfs_mount_t *, uint);
> +
>  /* vop stuff */
>  extern int		xfs_qm_vop_dqalloc(xfs_mount_t *, xfs_inode_t *,
>  					uid_t, gid_t, prid_t, uint,
> @@ -196,10 +206,6 @@ extern void		xfs_qm_freelist_append(xfs_
>  extern void		xfs_qm_freelist_unlink(xfs_dquot_t *);
>  extern int		xfs_qm_freelist_lock_nowait(xfs_qm_t *);
>  
> -/* system call interface */
> -extern int		xfs_qm_quotactl(struct xfs_mount *, int, int,
> -				xfs_caddr_t);
> -
>  #ifdef DEBUG
>  extern int		xfs_qm_internalqcheck(xfs_mount_t *);
>  #else
> Index: xfs/fs/xfs/quota/xfs_qm_bhv.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c	2009-01-21 21:03:27.836295012 +0100
> +++ xfs/fs/xfs/quota/xfs_qm_bhv.c	2009-01-24 18:52:52.206583965 +0100
> @@ -235,7 +235,6 @@ struct xfs_qmops xfs_qmcore_xfs = {
>  	.xfs_dqvopchownresv	= xfs_qm_vop_chown_reserve,
>  	.xfs_dqstatvfs		= xfs_qm_statvfs,
>  	.xfs_dqsync		= xfs_qm_sync,
> -	.xfs_quotactl		= xfs_qm_quotactl,
>  	.xfs_dqtrxops		= &xfs_trans_dquot_ops,
>  };
>  EXPORT_SYMBOL(xfs_qmcore_xfs);
> Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c
> ===================================================================
> --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c	2009-01-21 21:03:27.836295012 +0100
> +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c	2009-01-24 18:52:52.207553991 +0100
> @@ -57,135 +57,16 @@
>  # define qdprintk(s, args...)	do { } while (0)
>  #endif
>  
> -STATIC int	xfs_qm_scall_trunc_qfiles(xfs_mount_t *, uint);
> -STATIC int	xfs_qm_scall_getquota(xfs_mount_t *, xfs_dqid_t, uint,
> -					fs_disk_quota_t *);
> -STATIC int	xfs_qm_scall_getqstat(xfs_mount_t *, fs_quota_stat_t *);
> -STATIC int	xfs_qm_scall_setqlim(xfs_mount_t *, xfs_dqid_t, uint,
> -					fs_disk_quota_t *);
> -STATIC int	xfs_qm_scall_quotaon(xfs_mount_t *, uint);
> -STATIC int	xfs_qm_scall_quotaoff(xfs_mount_t *, uint, boolean_t);
>  STATIC int	xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint);
>  STATIC int	xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *,
>  					uint);
> -STATIC uint	xfs_qm_import_flags(uint);
>  STATIC uint	xfs_qm_export_flags(uint);
> -STATIC uint	xfs_qm_import_qtype_flags(uint);
>  STATIC uint	xfs_qm_export_qtype_flags(uint);
>  STATIC void	xfs_qm_export_dquot(xfs_mount_t *, xfs_disk_dquot_t *,
>  					fs_disk_quota_t *);
>  
>  
>  /*
> - * The main distribution switch of all XFS quotactl system calls.
> - */
> -int
> -xfs_qm_quotactl(
> -	xfs_mount_t	*mp,
> -	int		cmd,
> -	int		id,
> -	xfs_caddr_t	addr)
> -{
> -	int		error;
> -
> -	ASSERT(addr != NULL || cmd == Q_XQUOTASYNC);
> -
> -	/*
> -	 * The following commands are valid even when quotaoff.
> -	 */
> -	switch (cmd) {
> -	case Q_XQUOTARM:
> -		/*
> -		 * Truncate quota files. quota must be off.
> -		 */
> -		if (XFS_IS_QUOTA_ON(mp))
> -			return XFS_ERROR(EINVAL);
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		return (xfs_qm_scall_trunc_qfiles(mp,
> -			       xfs_qm_import_qtype_flags(*(uint *)addr)));
> -
> -	case Q_XGETQSTAT:
> -		/*
> -		 * Get quota status information.
> -		 */
> -		return (xfs_qm_scall_getqstat(mp, (fs_quota_stat_t *)addr));
> -
> -	case Q_XQUOTAON:
> -		/*
> -		 * QUOTAON - enabling quota enforcement.
> -		 * Quota accounting must be turned on at mount time.
> -		 */
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		return (xfs_qm_scall_quotaon(mp,
> -					  xfs_qm_import_flags(*(uint *)addr)));
> -
> -	case Q_XQUOTAOFF:
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		break;
> -
> -	case Q_XQUOTASYNC:
> -		return xfs_sync_inodes(mp, SYNC_DELWRI);
> -
> -	default:
> -		break;
> -	}
> -
> -	if (! XFS_IS_QUOTA_ON(mp))
> -		return XFS_ERROR(ESRCH);
> -
> -	switch (cmd) {
> -	case Q_XQUOTAOFF:
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		error = xfs_qm_scall_quotaoff(mp,
> -					    xfs_qm_import_flags(*(uint *)addr),
> -					    B_FALSE);
> -		break;
> -
> -	case Q_XGETQUOTA:
> -		error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_USER,
> -					(fs_disk_quota_t *)addr);
> -		break;
> -	case Q_XGETGQUOTA:
> -		error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_GROUP,
> -					(fs_disk_quota_t *)addr);
> -		break;
> -	case Q_XGETPQUOTA:
> -		error = xfs_qm_scall_getquota(mp, (xfs_dqid_t)id, XFS_DQ_PROJ,
> -					(fs_disk_quota_t *)addr);
> -		break;
> -
> -	case Q_XSETQLIM:
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_USER,
> -					     (fs_disk_quota_t *)addr);
> -		break;
> -	case Q_XSETGQLIM:
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_GROUP,
> -					     (fs_disk_quota_t *)addr);
> -		break;
> -	case Q_XSETPQLIM:
> -		if (mp->m_flags & XFS_MOUNT_RDONLY)
> -			return XFS_ERROR(EROFS);
> -		error = xfs_qm_scall_setqlim(mp, (xfs_dqid_t)id, XFS_DQ_PROJ,
> -					     (fs_disk_quota_t *)addr);
> -		break;
> -
> -	default:
> -		error = XFS_ERROR(EINVAL);
> -		break;
> -	}
> -
> -	return (error);
> -}
> -
> -/*
>   * Turn off quota accounting and/or enforcement for all udquots and/or
>   * gdquots. Called only at unmount time.
>   *
> @@ -193,11 +74,10 @@ xfs_qm_quotactl(
>   * incore, and modifies the ondisk dquot directly. Therefore, for example,
>   * it is an error to call this twice, without purging the cache.
>   */
> -STATIC int
> +int
>  xfs_qm_scall_quotaoff(
>  	xfs_mount_t		*mp,
> -	uint			flags,
> -	boolean_t		force)
> +	uint			flags)
>  {
>  	uint			dqtype;
>  	int			error;
> @@ -205,8 +85,6 @@ xfs_qm_scall_quotaoff(
>  	xfs_qoff_logitem_t	*qoffstart;
>  	int			nculprits;
>  
> -	if (!force && !capable(CAP_SYS_ADMIN))
> -		return XFS_ERROR(EPERM);
>  	/*
>  	 * No file system can have quotas enabled on disk but not in core.
>  	 * Note that quota utilities (like quotaoff) _expect_
> @@ -375,7 +253,7 @@ out_error:
>  	return (error);
>  }
>  
> -STATIC int
> +int
>  xfs_qm_scall_trunc_qfiles(
>  	xfs_mount_t	*mp,
>  	uint		flags)
> @@ -383,8 +261,6 @@ xfs_qm_scall_trunc_qfiles(
>  	int		error = 0, error2 = 0;
>  	xfs_inode_t	*qip;
>  
> -	if (!capable(CAP_SYS_ADMIN))
> -		return XFS_ERROR(EPERM);
>  	if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) {
>  		qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags);
>  		return XFS_ERROR(EINVAL);
> @@ -416,7 +292,7 @@ xfs_qm_scall_trunc_qfiles(
>   * effect immediately.
>   * (Switching on quota accounting must be done at mount time.)
>   */
> -STATIC int
> +int
>  xfs_qm_scall_quotaon(
>  	xfs_mount_t	*mp,
>  	uint		flags)
> @@ -426,9 +302,6 @@ xfs_qm_scall_quotaon(
>  	uint		accflags;
>  	__int64_t	sbflags;
>  
> -	if (!capable(CAP_SYS_ADMIN))
> -		return XFS_ERROR(EPERM);
> -
>  	flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD);
>  	/*
>  	 * Switching on quota accounting must be done at mount time.
> @@ -517,7 +390,7 @@ xfs_qm_scall_quotaon(
>  /*
>   * Return quota status information, such as uquota-off, enforcements, etc.
>   */
> -STATIC int
> +int
>  xfs_qm_scall_getqstat(
>  	xfs_mount_t	*mp,
>  	fs_quota_stat_t *out)
> @@ -582,7 +455,7 @@ xfs_qm_scall_getqstat(
>  /*
>   * Adjust quota limits, and start/stop timers accordingly.
>   */
> -STATIC int
> +int
>  xfs_qm_scall_setqlim(
>  	xfs_mount_t		*mp,
>  	xfs_dqid_t		id,
> @@ -595,9 +468,6 @@ xfs_qm_scall_setqlim(
>  	int			error;
>  	xfs_qcnt_t		hard, soft;
>  
> -	if (!capable(CAP_SYS_ADMIN))
> -		return XFS_ERROR(EPERM);
> -
>  	if ((newlim->d_fieldmask &
>  	    (FS_DQ_LIMIT_MASK|FS_DQ_TIMER_MASK|FS_DQ_WARNS_MASK)) == 0)
>  		return (0);
> @@ -742,7 +612,7 @@ xfs_qm_scall_setqlim(
>  	return error;
>  }
>  
> -STATIC int
> +int
>  xfs_qm_scall_getquota(
>  	xfs_mount_t	*mp,
>  	xfs_dqid_t	id,
> @@ -935,30 +805,6 @@ xfs_qm_export_dquot(
>  }
>  
>  STATIC uint
> -xfs_qm_import_qtype_flags(
> -	uint		uflags)
> -{
> -	uint		oflags = 0;
> -
> -	/*
> -	 * Can't be more than one, or none.
> -	 */
> -	if (((uflags & (XFS_GROUP_QUOTA | XFS_USER_QUOTA)) ==
> -			(XFS_GROUP_QUOTA | XFS_USER_QUOTA)) ||
> -	    ((uflags & (XFS_GROUP_QUOTA | XFS_PROJ_QUOTA)) ==
> -			(XFS_GROUP_QUOTA | XFS_PROJ_QUOTA)) ||
> -	    ((uflags & (XFS_USER_QUOTA | XFS_PROJ_QUOTA)) ==
> -			(XFS_USER_QUOTA | XFS_PROJ_QUOTA)) ||
> -	    ((uflags & (XFS_GROUP_QUOTA|XFS_USER_QUOTA|XFS_PROJ_QUOTA)) == 0))
> -		return (0);
> -
> -	oflags |= (uflags & XFS_USER_QUOTA) ? XFS_DQ_USER : 0;
> -	oflags |= (uflags & XFS_PROJ_QUOTA) ? XFS_DQ_PROJ : 0;
> -	oflags |= (uflags & XFS_GROUP_QUOTA) ? XFS_DQ_GROUP: 0;
> -	return oflags;
> -}
> -
> -STATIC uint
>  xfs_qm_export_qtype_flags(
>  	uint flags)
>  {
> @@ -979,26 +825,6 @@ xfs_qm_export_qtype_flags(
>  }
>  
>  STATIC uint
> -xfs_qm_import_flags(
> -	uint uflags)
> -{
> -	uint flags = 0;
> -
> -	if (uflags & XFS_QUOTA_UDQ_ACCT)
> -		flags |= XFS_UQUOTA_ACCT;
> -	if (uflags & XFS_QUOTA_PDQ_ACCT)
> -		flags |= XFS_PQUOTA_ACCT;
> -	if (uflags & XFS_QUOTA_GDQ_ACCT)
> -		flags |= XFS_GQUOTA_ACCT;
> -	if (uflags & XFS_QUOTA_UDQ_ENFD)
> -		flags |= XFS_UQUOTA_ENFD;
> -	if (uflags & (XFS_QUOTA_PDQ_ENFD|XFS_QUOTA_GDQ_ENFD))
> -		flags |= XFS_OQUOTA_ENFD;
> -	return (flags);
> -}
> -
> -
> -STATIC uint
>  xfs_qm_export_flags(
>  	uint flags)
>  {
> Index: xfs/fs/xfs/xfs_mount.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_mount.h	2009-01-24 18:32:57.980458591 +0100
> +++ xfs/fs/xfs/xfs_mount.h	2009-01-24 18:52:52.208554118 +0100
> @@ -136,7 +136,6 @@ typedef int	(*xfs_dqvopchownresv_t)(stru
>  			struct xfs_dquot *, struct xfs_dquot *, uint);
>  typedef void	(*xfs_dqstatvfs_t)(struct xfs_inode *, struct kstatfs *);
>  typedef int	(*xfs_dqsync_t)(struct xfs_mount *, int flags);
> -typedef int	(*xfs_quotactl_t)(struct xfs_mount *, int, int, xfs_caddr_t);
>  
>  typedef struct xfs_qmops {
>  	xfs_qminit_t		xfs_qminit;
> @@ -154,7 +153,6 @@ typedef struct xfs_qmops {
>  	xfs_dqvopchownresv_t	xfs_dqvopchownresv;
>  	xfs_dqstatvfs_t		xfs_dqstatvfs;
>  	xfs_dqsync_t		xfs_dqsync;
> -	xfs_quotactl_t		xfs_quotactl;
>  	struct xfs_dqtrxops	*xfs_dqtrxops;
>  } xfs_qmops_t;
>  
> @@ -188,8 +186,6 @@ typedef struct xfs_qmops {
>  	(*(ip)->i_mount->m_qm_ops->xfs_dqstatvfs)(ip, statp)
>  #define XFS_QM_DQSYNC(mp, flags) \
>  	(*(mp)->m_qm_ops->xfs_dqsync)(mp, flags)
> -#define XFS_QM_QUOTACTL(mp, cmd, id, addr) \
> -	(*(mp)->m_qm_ops->xfs_quotactl)(mp, cmd, id, addr)
>  
>  #ifdef HAVE_PERCPU_SB
>  
> Index: xfs/fs/xfs/xfs_qmops.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_qmops.c	2009-01-21 21:03:27.866294994 +0100
> +++ xfs/fs/xfs/xfs_qmops.c	2009-01-24 18:52:52.208554118 +0100
> @@ -126,7 +126,6 @@ static struct xfs_qmops xfs_qmcore_stub 
>  	.xfs_dqvopchownresv	= (xfs_dqvopchownresv_t) fs_noerr,
>  	.xfs_dqstatvfs		= (xfs_dqstatvfs_t) fs_noval,
>  	.xfs_dqsync		= (xfs_dqsync_t) fs_noerr,
> -	.xfs_quotactl		= (xfs_quotactl_t) fs_nosys,
>  };
>  
>  int
> Index: xfs/fs/xfs/xfs_quota.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_quota.h	2009-01-21 21:03:27.866294994 +0100
> +++ xfs/fs/xfs/xfs_quota.h	2009-01-24 18:52:52.211583834 +0100
> @@ -18,6 +18,8 @@
>  #ifndef __XFS_QUOTA_H__
>  #define __XFS_QUOTA_H__
>  
> +struct xfs_trans;
> +
>  /*
>   * The ondisk form of a dquot structure.
>   */
> 
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
---end quoted text---




More information about the xfs mailing list