[BACK]Return to xfs_quota.h CVS log [TXT][DIR] Up to [Development] / xfs-linux

File: [Development] / xfs-linux / xfs_quota.h (download)

Revision 1.18, Sun Jan 30 09:59:06 2000 UTC (17 years, 9 months ago) by kenmcd
Branch: MAIN
CVS Tags: DELETE
Changes since 1.17: +19 -1 lines

Encumbrance review done.
Add copyright and license words consistent with GPL.
Refer to http://fsg.melbourne.sgi.com/reviews/ for details.

There is a slight change in the license terms and conditions words
to go with the copyrights, so most of the files are not getting
new GPL's, just updated versions ... but there are 20-30 more files
here as well.

/*
 * Copyright (C) 1999 Silicon Graphics, Inc.  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; either version 2 of the License, or (at
 * your option) any later version.
 * 
 * This program is distributed in the hope that it will 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., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 */
#ifndef __XFS_QUOTA_H__
#define __XFS_QUOTA_H__
#ident "$Revision: 1.17 $"
/*
 * External Interface to the XFS disk quota subsystem.
 */
struct	bhv_desc;
struct  vfs;
struct  xfs_disk_dquot;
struct  xfs_dqhash;
struct  xfs_dquot;
struct  xfs_inode;
struct  xfs_mount;
struct  xfs_trans;

/* 
 * We use only 16-bit prid's in the inode, not the 64-bit version in the proc.
 * uid_t is hard-coded to 32 bits in the inode. Hence, an 'id' in a dquot is
 * 32 bits..
 */
typedef __int32_t	xfs_dqid_t;
/*
 * Eventhough users may not have quota limits occupying all 64-bits, 
 * they may need 64-bit accounting. Hence, 64-bit quota-counters,
 * and quota-limits. This is a waste in the common case, but heh ...
 */
typedef __uint64_t	xfs_qcnt_t;
typedef __uint16_t      xfs_qwarncnt_t;

/* 
 * Disk quotas status in m_qflags, and also sb_qflags. 16 bits.
 */
#define XFS_UQUOTA_ACCT	0x0001  /* user quota accounting ON */
#define XFS_UQUOTA_ENFD	0x0002  /* user quota limits enforced */
#define XFS_UQUOTA_CHKD	0x0004  /* quotacheck run on usr quotas */
#define XFS_PQUOTA_ACCT	0x0008  /* project quota accounting ON */
#define XFS_PQUOTA_ENFD	0x0010  /* proj quota limits enforced */
#define XFS_PQUOTA_CHKD	0x0020  /* quotacheck run on prj quotas */

/* 
 * Incore only flags for quotaoff - these bits get cleared when quota(s)
 * are in the process of getting turned off. These flags are in m_qflags but
 * never in sb_qflags.
 */
#define XFS_UQUOTA_ACTIVE	0x0040  /* uquotas are being turned off */
#define XFS_PQUOTA_ACTIVE	0x0080  /* pquotas are being turned off */

/*
 * Typically, we turn quotas off if we weren't explicitly asked to 
 * mount quotas. This is the mount option not to do that.
 * This option is handy in the miniroot, when trying to mount /root.
 * We can't really know what's in /etc/fstab until /root is already mounted!
 * This stops quotas getting turned off in the root filesystem everytime
 * the system boots up a miniroot.
 */
#define XFS_QUOTA_MAYBE		0x0100 /* Turn quotas on if SB has quotas on */

/*
 * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees
 * quota will be not be switched off as long as that inode lock is held.
 */
#define XFS_IS_QUOTA_ON(mp)  	((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \
						   XFS_PQUOTA_ACTIVE))
#define XFS_IS_UQUOTA_ON(mp)	((mp)->m_qflags & XFS_UQUOTA_ACTIVE)
#define XFS_IS_PQUOTA_ON(mp) 	((mp)->m_qflags & XFS_PQUOTA_ACTIVE)

/*
 * Flags to tell various functions what to do. Not all of these are meaningful
 * to a single function. None of these XFS_QMOPT_* flags are meant to have
 * persistent values (ie. their values can and will change between versions)
 */
#define XFS_QMOPT_DQLOCK	0x0000001 /* dqlock */
#define XFS_QMOPT_DQALLOC	0x0000002 /* alloc dquot ondisk if needed */
#define XFS_QMOPT_UQUOTA	0x0000004 /* user dquot requested */
#define XFS_QMOPT_PQUOTA	0x0000008 /* proj dquot requested */
#define XFS_QMOPT_FORCE_RES	0x0000010 /* ignore quota limits */
#define XFS_QMOPT_DQSUSER	0x0000020 /* don't cache super users dquot */
#define XFS_QMOPT_SBVERSION	0x0000040 /* change superblock version num */
#define XFS_QMOPT_QUOTAOFF	0x0000080 /* quotas are being turned off */
#define XFS_QMOPT_UMOUNTING	0x0000100 /* filesys is being unmounted */
#define XFS_QMOPT_DOLOG		0x0000200 /* log buf changes (in quotacheck) */
#define XFS_QMOPT_DOWARN        0x0000400 /* increase warning cnt if necessary */
#define XFS_QMOPT_ILOCKED	0x0000800 /* inode is already locked (excl) */
#define XFS_QMOPT_DQREPAIR	0x0001000 /* repair dquot, if damaged. */

/* 
 * flags to xfs_trans_mod_dquot to indicate which field needs to be
 * modified.
 */
#define XFS_QMOPT_RES_REGBLKS 	0x0010000
#define XFS_QMOPT_RES_RTBLKS	0x0020000
#define XFS_QMOPT_BCOUNT	0x0040000
#define XFS_QMOPT_ICOUNT	0x0080000
#define XFS_QMOPT_RTBCOUNT	0x0100000
#define XFS_QMOPT_DELBCOUNT	0x0200000
#define XFS_QMOPT_DELRTBCOUNT	0x0400000
#define XFS_QMOPT_RES_INOS	0x0800000

/*
 * flags for dqflush and dqflush_all.
 */
#define XFS_QMOPT_SYNC		0x1000000
#define XFS_QMOPT_ASYNC		0x2000000
#define XFS_QMOPT_DELWRI	0x4000000

/* 
 * flags to xfs_trans_mod_dquot.
 */
#define XFS_TRANS_DQ_RES_BLKS	XFS_QMOPT_RES_REGBLKS
#define XFS_TRANS_DQ_RES_RTBLKS	XFS_QMOPT_RES_RTBLKS
#define XFS_TRANS_DQ_RES_INOS	XFS_QMOPT_RES_INOS
#define XFS_TRANS_DQ_BCOUNT	XFS_QMOPT_BCOUNT
#define XFS_TRANS_DQ_DELBCOUNT	XFS_QMOPT_DELBCOUNT
#define XFS_TRANS_DQ_ICOUNT	XFS_QMOPT_ICOUNT
#define XFS_TRANS_DQ_RTBCOUNT	XFS_QMOPT_RTBCOUNT
#define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT


#define XFS_QMOPT_QUOTALL	(XFS_QMOPT_UQUOTA|XFS_QMOPT_PQUOTA)
#define XFS_QMOPT_RESBLK_MASK	(XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS)

/*
 * This check is done typically without holding the inode lock;
 * that may seem racey, but it is harmless in the context that it is used.
 * The inode cannot go inactive as long a reference is kept, and 
 * therefore if dquot(s) were attached, they'll stay consistent.
 * If, for example, the ownership of the inode changes while
 * we didnt have the inode locked, the appropriate dquot(s) will be
 * attached atomically.
 */
#define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\
				     (ip)->i_udquot == NULL) || \
				    (XFS_IS_PQUOTA_ON(mp) && \
				     (ip)->i_pdquot == NULL))

#define XFS_QM_NEED_QUOTACHECK(mp) ((XFS_IS_UQUOTA_ON(mp) && \
				     (mp->m_sb.sb_qflags & \
				      XFS_UQUOTA_CHKD) == 0) || \
				    (XFS_IS_PQUOTA_ON(mp) && \
				     (mp->m_sb.sb_qflags & \
				      XFS_PQUOTA_CHKD) == 0))

#define XFS_MOUNT_QUOTA_ALL	(XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
				 XFS_UQUOTA_CHKD|XFS_PQUOTA_ACCT|\
				 XFS_PQUOTA_ENFD|XFS_PQUOTA_CHKD)
#define XFS_MOUNT_QUOTA_MASK	(XFS_MOUNT_QUOTA_ALL | XFS_UQUOTA_ACTIVE | \
				 XFS_PQUOTA_ACTIVE)

#define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME)

/*
 * Quota Manager Interface.
 */
extern struct xfs_qm   *xfs_qm_init(void);
extern void 		xfs_qm_destroy(struct xfs_qm *xqm);
extern int		xfs_qm_dqflush_all(struct xfs_mount *, int);
extern int		xfs_qm_dqattach(struct xfs_inode *, uint);
extern int		xfs_quotactl(struct bhv_desc *, int, int, caddr_t);
extern int		xfs_qm_dqpurge_all(struct xfs_mount *, uint);
extern void		xfs_qm_mount_quotainit(struct xfs_mount *, uint);
extern void		xfs_qm_unmount_quotadestroy(struct xfs_mount *);
extern int		xfs_qm_mount_quotas(struct xfs_mount *);
extern int 		xfs_qm_unmount_quotas(struct xfs_mount *);
extern void		xfs_qm_dqdettach_inode(struct xfs_inode *ip);
extern int 		xfs_qm_sync(struct xfs_mount *mp, short flags);

/*
 * dquot interface.
 */
extern void		xfs_dqlock(struct xfs_dquot *dqp);
extern void		xfs_dqunlock(struct xfs_dquot *dqp);
extern void		xfs_dqunlock_nonotify(struct xfs_dquot *dqp);
extern void		xfs_dqlock2(struct xfs_dquot *d1,
				    struct xfs_dquot *d2);
extern void 		xfs_qm_dqput(struct xfs_dquot *dqp);
extern void 		xfs_qm_dqrele(struct xfs_dquot *dqp);
extern xfs_dqid_t	xfs_qm_dqid(struct xfs_dquot *dqp);
extern int		xfs_qm_dqget(struct xfs_mount *mp, 
				     struct xfs_inode *ip,
				      xfs_dqid_t id,
				      uint type, uint doalloc, 
				      struct xfs_dquot **O_dqpp);
extern int 		xfs_qm_dqcheck(struct xfs_disk_dquot *, 
				       xfs_dqid_t, uint, uint, char *);

/*
 * Vnodeops specific code that should actually be _in_ xfs_vnodeops.c, but
 * is here because it's nicer to keep vnodeops (therefore, XFS) lean 
 * and clean.
 */
extern struct xfs_dquot *	xfs_qm_vop_chown(struct xfs_trans *tp, 
						 struct xfs_inode *ip, 
						 struct xfs_dquot **olddq,
						 struct xfs_dquot *newdq);
extern int		xfs_qm_vop_dqalloc(struct xfs_mount	*mp,
					   struct xfs_inode	*dp,
					   uid_t	uid,
					   xfs_prid_t	prid,
					   uint		flags,
					   struct xfs_dquot	**udqpp,
					   struct xfs_dquot	**pdqpp);

extern int		xfs_qm_vop_chown_dqalloc(struct xfs_mount	*mp,
						 struct xfs_inode	*ip,
						 int			mask,
						 uid_t			uid,
						 xfs_prid_t		prid,
						 struct xfs_dquot	**udqpp,
						 struct xfs_dquot	**pdqpp);

extern int		xfs_qm_vop_chown_reserve(struct xfs_trans	*tp,
						 struct xfs_inode	*ip,
						 struct xfs_dquot	*udqp,
						 struct xfs_dquot	*pdqp,
						 uint		privileged);

extern int		xfs_qm_vop_rename_dqattach(struct xfs_inode	**i_tab);
extern void		xfs_qm_vop_dqattach_and_dqmod_newinode(
						struct xfs_trans *tp,
						struct xfs_inode *ip,
						struct xfs_dquot *udqp,	
						struct xfs_dquot *pdqp);


/*
 * Dquot Transaction interface
 */
extern void 		xfs_trans_alloc_dqinfo(struct xfs_trans *tp);
extern void 		xfs_trans_free_dqinfo(struct xfs_trans *tp);
extern void		xfs_trans_dup_dqinfo(struct xfs_trans *otp, 
					     struct xfs_trans *ntp);
extern void		xfs_trans_mod_dquot(struct xfs_trans *tp, 
					    struct xfs_dquot *dqp,
					    uint field, long delta);
extern int		xfs_trans_mod_dquot_byino(struct xfs_trans *tp, 
						  struct xfs_inode *ip,
						  uint field, long delta);
extern void		xfs_trans_apply_dquot_deltas(struct xfs_trans *tp);
extern void		xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *tp);

extern int		xfs_trans_reserve_quota_nblks(struct xfs_trans *tp,
						      struct xfs_inode *ip,
						      long nblks, long ninos,
						      uint type);


extern int		xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,
							 struct xfs_dquot *udqp,
							 struct xfs_dquot *pdqp,
							 long nblks,
							 long ninos,
							 uint flags);
extern void		xfs_trans_log_dquot(struct xfs_trans *tp, 
					    struct xfs_dquot *dqp);
extern void		xfs_trans_dqjoin(struct xfs_trans *tp, 
					 struct xfs_dquot *dqp);
extern void		xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);

/* 
 * Regular disk block quota reservations 
 */
#define 	xfs_trans_reserve_blkquota(tp, ip, nblks) \
xfs_trans_reserve_quota_nblks(tp, ip, nblks, 0, XFS_QMOPT_RES_REGBLKS)
						  
#define 	xfs_trans_unreserve_blkquota(tp, ip, nblks) \
xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), 0, XFS_QMOPT_RES_REGBLKS)

#define 	xfs_trans_reserve_quota(tp, udq, pdq, nb, ni, f) \
xfs_trans_reserve_quota_bydquots(tp, udq, pdq, nb, ni, f|XFS_QMOPT_RES_REGBLKS) 

#define 	xfs_trans_unreserve_quota(tp, ud, pd, b, i, f) \
xfs_trans_reserve_quota_bydquots(tp, ud, pd, -(b), -(i), f|XFS_QMOPT_RES_REGBLKS)

/*
 * Realtime disk block quota reservations 
 */
#define 	xfs_trans_reserve_rtblkquota(mp, tp, ip, nblks) \
xfs_trans_reserve_quota_nblks(tp, ip, nblks, 0, XFS_QMOPT_RES_RTBLKS)
						  
#define 	xfs_trans_unreserve_rtblkquota(tp, ip, nblks) \
xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), 0, XFS_QMOPT_RES_RTBLKS)

#define 	xfs_trans_reserve_rtquota(mp, tp, uq, pq, blks, f) \
xfs_trans_reserve_quota_bydquots(mp, tp, uq, pq, blks, 0, f|XFS_QMOPT_RES_RTBLKS) 

#define 	xfs_trans_unreserve_rtquota(tp, uq, pq, blks) \
xfs_trans_reserve_quota_bydquots(tp, uq, pq, -(blks), XFS_QMOPT_RES_RTBLKS)

#endif	/* !__XFS_QUOTA_H__ */