cg_free is (u_char)
[unix-history] / usr / src / sys / ufs / ffs / quota.h
/* quota.h Melb 4.1 82/07/16 */
/*
* Various junk to do with various quotas (etc) imposed upon
* the average user (big brother finally hits unix)
*
* The following structure exists in core for each logged on user
* It contains global junk relevant to that user's quotas
*
* The u_quota field of each user struct contains a pointer to
* the quota struct relevant to the current process, this is changed
* by 'setuid' sys call, &/or by the Q_SETUID quota() call
*/
typedef long class_t;
struct quinfo {
u_short qu_shares; /* allocated shares (MUSH) */
short qu_plim; /* process limit */
long qu_syflags; /* system permission flags */
float qu_usage; /* current resource usage (MUSH) */
class_t qu_class; /* user classes (MUSH) */
};
#ifdef KERNEL
struct quota {
struct quota *q_forw; /* hash chain - MUST be first */
struct quota *q_back; /* hash chain - MUST be last */
char q_flg; /* struct management flags */
char q_lcnt; /* count of logins for user */
short q_cnt; /* ref count (# processes) */
short q_uid; /* real uid of owner */
short q_nice; /* nice added to p_cpu (MUSH) */
short q_acnt; /* count of 'at' processes (MUSH) */
union {
struct {
long Q_rate; /* recent work rate (MUSH) */
long Q_cost; /* cost in recent period (MUSH) */
} q_s1;
struct {
struct quota *Q_freef;
struct quota **Q_freeb;
} q_s2;
} q_u;
struct quinfo q_uinfo; /* user limits & usage (MUSH) */
struct dquot *q_dq[NMOUNT]; /* disc quotas for mounted filesys's */
};
#define NOQUOT ((struct quota *) 0)
#define q_rate q_u.q_s1.Q_rate
#define q_cost q_u.q_s1.Q_cost
#define q_freef q_u.q_s2.Q_freef
#define q_freeb q_u.q_s2.Q_freeb
#define q_shares q_uinfo.qu_shares
#define q_plim q_uinfo.qu_plim
#define q_syflags q_uinfo.qu_syflags
#define q_usage q_uinfo.qu_usage
#define q_class q_uinfo.qu_class
#endif
#define QF_KASYNC 0x02 /* kill async procs at logout */
#define QF_FASTTY 0x04 /* permitted to raise tty speed */
#define QF_NASYNC 0x08 /* nice async procs at logout */
#define QF_MODTTY 0x10 /* permitted to modify other tty */
#define QF_UMASK 0x20 /* not permitted to alter umask */
#ifdef KERNEL
struct quota *quota, *quotaNQUOTA;
int nquota;
struct quota *getquota(), *qfind();
#endif
/* q_flg flags */
#define Q_LOCK 0x01 /* quota struct locked (for disc i/o) */
#define Q_WANT 0x02 /* issue a wakeup when lock goes off */
#define Q_NEW 0x04 /* new quota - no proc1 msg sent yet */
#define Q_NDQ 0x08 /* account has NO disc quota */
/*
* The following structure defines the format of the disc quota file
* (as it appears on disc) - the file is an array of these structures
* indexed by user number. A sys call (setquota) establishes the
* inode for each applicable file (a pointer is retained in the mount
* structure)
*
* nb: warning fields contain the number of warnings left before
* allocation is halted completely
*/
typedef unsigned short dlim_t;
struct dqblk {
dlim_t dqb_ilim; /* max num allocated inodes + 1 */
dlim_t dqb_iq; /* preferred inode limit */
dlim_t dqb_inod; /* current num allocated inodes */
dlim_t dqb_iwarn; /* # warnings about excessive inodes */
dlim_t dqb_blim; /* abs limit on disc blks alloc */
dlim_t dqb_quot; /* preferred limit on disc blks */
dlim_t dqb_blks; /* current block count */
dlim_t dqb_dwarn; /* # warnings about excessive disc use */
};
#define MAX_IQ_WARN 3
#define MAX_DQ_WARN 3
/*
* The following structure records disc 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 other recently used entries.
*/
struct dquot {
struct dquot *dq_forw; /* MUST be first entry */
struct dquot *dq_back; /* MUST be second entry */
union {
struct quota *Dq_own; /* the quota that points to this */
struct {
struct dquot *Dq_freef; /* forward free chain ptr */
struct dquot **Dq_freeb;/* backward free chain ptr */
} dq_f;
} dq_u;
short dq_flg;
short dq_cnt; /* count of active references */
short dq_uid; /* user this applies to */
dev_t dq_dev; /* filesystem this relates to */
struct dqblk dq_dqb; /* actual usage & quotas */
};
#define dq_own dq_u.Dq_own
#define dq_freef dq_u.dq_f.Dq_freef
#define dq_freeb dq_u.dq_f.Dq_freeb
#define dq_ilim dq_dqb.dqb_ilim
#define dq_iq dq_dqb.dqb_iq
#define dq_inod dq_dqb.dqb_inod
#define dq_iwarn dq_dqb.dqb_iwarn
#define dq_blim dq_dqb.dqb_blim
#define dq_quot dq_dqb.dqb_quot
#define dq_blks dq_dqb.dqb_blks
#define dq_dwarn dq_dqb.dqb_dwarn
#define NODQUOT ((struct dquot *) 0)
#define LOSTDQUOT ((struct dquot *) 1)
#ifdef KERNEL
struct dquot *dquot, *dquotNDQUOT;
int ndquot;
struct dquot *discquota(), *inoquota(), *dqalloc();
#endif
/* dq_flg flags */
#define DQ_LOCK 0x01 /* this quota locked (no MODS) */
#define DQ_WANT 0x02 /* wakeup on unlock */
#define DQ_MOD 0x04 /* this quota modified since read */
#define DQ_FAKE 0x08 /* no limits here, just usage */
#define DQ_BLKS 0x10 /* has been warned about blk limit */
#define DQ_INODS 0x20 /* has been warned about inode limit */
/*
* Commands for the 'quota' system call
*/
#define Q_SETDLIM 1 /* set disc limits & usage */
#define Q_GETDLIM 2 /* get disc limits & usage */
#define Q_SETDUSE 3 /* set disc usage only */
#define Q_SYNC 4 /* update disc copy if quota usages */
#define Q_LOGIN 5 /* Count this as a login process */
#define Q_LCOUNT 6 /* get count of login processes */
#define Q_PCOUNT 7 /* get count of processes */
#define Q_USAGE 8 /* get current usage */
#define Q_SFLAGS 9 /* set system flags */
#define Q_SUSAGE 10 /* set usage */
#define Q_SPLIMIT 11 /* set process limit */
#define Q_ISLOGIN 12 /* is this a login process ?? */
#define Q_SCLASS 13 /* set user class */
#define Q_SCURCL 14 /* set current system classes */
#define Q_GCURCL 15 /* get current system classes */
#define Q_SETUID 16 /* change proc to use quotas for uid */
#define Q_FLOGIN 17 /* "fake" login (counts as 1, but isn't) */
#define Q_SETCOST 18 /* set system charge rates */
#define Q_GETCOST 19 /* get system charge rates */
#define Q_SSHARE 20 /* set shares */
#define Q_SUINFO 21 /* set user info */
#define Q_GUINFO 22 /* get user info */
#define Q_ATJOB 23 /* this process is an 'at' job (background) */
#define Q_ACOUNT 24 /* return count of procs descended from ATJ */
#define Q_SETWARN 25 /* alter inode/block warning counts */
#define Q_DOWARN 26 /* warn user about excessive space/inodes */
#define Q_KILL 27 /* send signal to procs attatched to quota */
#define Q_NICE 28 /* set niceness for procs attatched to quota */
/*
* current class information
*
* records sched biasing for classes that are to have priority
* enhanced or degraded
*/
#define NCLASS 8
struct qclass {
class_t class; /* classes this applies to */
long cost; /* +/- mod to cost incurred */
short maxn; /* in this class, no nice > this */
short minn; /* in this class, no nice < this */
};
#ifdef KERNEL
struct qclass curclass[NCLASS];
#endif
/*
* Flag definitions for u_qflags in user struct (u_qflags)
*/
#define QUF_LOGIN 0x0001 /* this process incremented login cnt */
#define QUF_ATJ 0x0002 /* this process descended from atrun */