/*	@(#)quota.h 1.1 86/02/03 SMI; from UCB 4.6 83/05/27	*/
/* @(#)quota.h	2.1 86/04/14 NFSSRC */

/*
 * Various junk to do with various quotas (etc) imposed upon
 * the average user (big brother finally hits UNIX).
 */

/*
 * The following constants define the default amount of time given a user
 * before the soft limits are treated as hard limits (usually resulting
 * in an allocation failure). These may be  modified by the quotactl
 * system call with the Q_SETQLIM or Q_SETQUOTA commands.
 */

#define	DQ_FTIMELIMIT	(7 * 24*60*60)		/* 1 week */
#define	DQ_BTIMELIMIT	(7 * 24*60*60)		/* 1 week */

/*
 * The dqblk structure defines the format of the disk quota file
 * (as it appears on disk) - the file is an array of these structures
 * indexed by user number.  The setquota sys call establishes the inode
 * for each quota file (a pointer is retained in the mount structure).
 */

struct	dqblk {
	u_long	dqb_bhardlimit;	/* absolute limit on disk blks alloc */
	u_long	dqb_bsoftlimit;	/* preferred limit on disk blks */
	u_long	dqb_curblocks;	/* current block count */
	u_long	dqb_fhardlimit;	/* maximum # allocated files + 1 */
	u_long	dqb_fsoftlimit;	/* preferred file limit */
	u_long	dqb_curfiles;	/* current # allocated files */
	u_long	dqb_btimelimit;	/* time limit for excessive disk use */
	u_long	dqb_ftimelimit;	/* time limit for excessive files */
};

#define dqoff(UID)	((UID) * sizeof(struct dqblk))

/* The dqargs structure is used to pass extra arguments to quotactl
   when quotas are being turned on.  A zero quota in any of the four
   limit fields can then signify a default quota stored in the mount
   structure.
*/

struct dqargs {
  char *qfname;         /* quotas filename */
  int qgroup;           /* if true, then use group quotas */
  u_long bzeroslimit;   /* Default soft block limit */
  u_long bzerohlimit;   /* Default hard block limit */
  u_long fzeroslimit;   /* Default soft file limit */
  u_long fzerohlimit;   /* Default hard file limit */
};

/*
 * The dquot structure records disk usage for a user on a filesystem.
 * There is one allocated for each quota that exists on any filesystem
 * for the current user. A cache is kept of recently used entries.
 * Active inodes have a pointer to the dquot associated with them.
 */
struct	dquot {
	struct	dquot *dq_forw, *dq_back;/* hash list, MUST be first entry */
	struct	dquot *dq_freef, *dq_freeb; /* free list */
	short	dq_flags;
#define	DQ_MOD		0x04		/* this quota modified since read */
#define	DQ_BLKS		0x10		/* has been warned about blk limit */
#define	DQ_FILES	0x20		/* has been warned about file limit */
	short	dq_cnt;			/* count of active references */
	short	dq_uid;			/* user this applies to */
	struct mount *dq_mp;		/* filesystem this relates to */
	struct dqblk dq_dqb;		/* actual usage & quotas */
};

#define	dq_bhardlimit	dq_dqb.dqb_bhardlimit
#define	dq_bsoftlimit	dq_dqb.dqb_bsoftlimit
#define	dq_curblocks	dq_dqb.dqb_curblocks
#define	dq_fhardlimit	dq_dqb.dqb_fhardlimit
#define	dq_fsoftlimit	dq_dqb.dqb_fsoftlimit
#define	dq_curfiles	dq_dqb.dqb_curfiles
#define	dq_btimelimit	dq_dqb.dqb_btimelimit
#define	dq_ftimelimit	dq_dqb.dqb_ftimelimit

/*
 * flags for m_qflags in mount struct
 */
#define Q_CLOSING	0x01		/* quotas in process of being closed */
#define Q_GROUP         0x02            /* quota by gid, not uid */

#if defined(KERNEL) && defined(QUOTA)
struct	dquot *dquot, *dquotNDQUOT;
int	ndquot;

extern void qtinit();			/* initialize quota system */
extern struct dquot *getinoquota();	/* establish quota for an inode */
extern int chkdq();			/* check disk block usage */
extern int chkiq();			/* check inode usage */
#ifndef NOINODEQUOTA
#define CHKIQ(mp,ip,uid,gid,force)\
   chkiq(mp, ip, ((mp)->m_qflags & Q_GROUP) ? (gid) : (uid), force)
#else
#define CHKIQ(mp,ip,uid,gid,force) (0)
#endif
extern void dqrele();			/* release dquot */
extern int closedq();			/* close quotas */

extern struct dquot *getdiskquota();	/* get dquot for uid on filesystem */
extern void dqupdate();			/* update dquot on disk */

#endif



/*
 * Definitions for the 'quotactl' system call.
 */
#define Q_QUOTAON	1	/* turn quotas on */
#define Q_QUOTAOFF	2	/* turn quotas off */
#define	Q_SETQUOTA	3	/* set disk limits & usage */
#define	Q_GETQUOTA	4	/* get disk limits & usage */
#define	Q_SETQLIM	5	/* set disk limits only */
#define	Q_SYNC		6	/* update disk copy of quota usages */
