1: /* 2: * Copyright (c) 1982, 1986 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)quota.h 7.1.1 (2.11BSD) 1996/1/23 7: */ 8: 9: /* 10: * MELBOURNE DISC QUOTAS 11: * 12: * Various junk to do with various quotas (etc) imposed upon 13: * the average user (big brother finally hits UNIX). 14: * 15: * The following structure exists in core for each logged on user. 16: * It contains global junk relevant to that user's quotas. 17: * 18: * The u_quota field of each user struct contains a pointer to 19: * the quota struct relevant to the current process, this is changed 20: * by 'setuid' sys call, &/or by the Q_SETUID quota() call. 21: */ 22: struct quota { 23: struct quota *q_forw, *q_back; /* hash chain, MUST be first */ 24: short q_cnt; /* ref count (# processes) */ 25: uid_t q_uid; /* real uid of owner */ 26: int q_flags; /* struct management flags */ 27: #define Q_LOCK 0x01 /* quota struct locked (for disc i/o) */ 28: #define Q_WANT 0x02 /* issue a wakeup when lock goes off */ 29: #define Q_NEW 0x04 /* new quota - no proc1 msg sent yet */ 30: #define Q_NDQ 0x08 /* account has NO disc quota */ 31: struct quota *q_freef, **q_freeb; 32: struct dquot *q_dq[NMOUNT]; /* disc quotas for mounted filesys's */ 33: }; 34: 35: #define NOQUOTA ((struct quota *) 0) 36: 37: #if defined(KERNEL) && defined(QUOTA) && !defined(SUPERVISOR) 38: struct quota *quota, *quotaNQUOTA; 39: int nquota; 40: struct quota *getquota(), *qfind(); 41: #endif 42: 43: /* 44: * The following structure defines the format of the disc quota file 45: * (as it appears on disc) - the file is an array of these structures 46: * indexed by user number. The setquota sys call establishes the inode 47: * for each quota file (a pointer is retained in the mount structure). 48: * 49: * The following constants define the number of warnings given a user 50: * before the soft limits are treated as hard limits (usually resulting 51: * in an allocation failure). The warnings are normally manipulated 52: * each time a user logs in through the Q_DOWARN quota call. If 53: * the user logs in and is under the soft limit the warning count 54: * is reset to MAX_*_WARN, otherwise a message is printed and the 55: * warning count is decremented. This makes MAX_*_WARN equivalent to 56: * the number of logins before soft limits are treated as hard limits. 57: */ 58: #define MAX_IQ_WARN 3 59: #define MAX_DQ_WARN 3 60: 61: struct dqblk { 62: u_long dqb_bhardlimit; /* absolute limit on disc blks alloc */ 63: u_long dqb_bsoftlimit; /* preferred limit on disc blks */ 64: u_long dqb_curblocks; /* current block count */ 65: u_short dqb_ihardlimit; /* maximum # allocated inodes + 1 */ 66: u_short dqb_isoftlimit; /* preferred inode limit */ 67: u_short dqb_curinodes; /* current # allocated inodes */ 68: u_char dqb_bwarn; /* # warnings left about excessive disc use */ 69: u_char dqb_iwarn; /* # warnings left about excessive inodes */ 70: }; 71: 72: /* 73: * The following structure records disc usage for a user on a filesystem. 74: * There is one allocated for each quota that exists on any filesystem 75: * for the current user. A cache is kept of other recently used entries. 76: */ 77: struct dquot { 78: struct dquot *dq_forw, *dq_back;/* MUST be first entry */ 79: union { 80: struct quota *Dq_own; /* the quota that points to this */ 81: struct { /* free list */ 82: struct dquot *Dq_freef, **Dq_freeb; 83: } dq_f; 84: } dq_u; 85: short dq_flags; 86: #define DQ_LOCK 0x01 /* this quota locked (no MODS) */ 87: #define DQ_WANT 0x02 /* wakeup on unlock */ 88: #define DQ_MOD 0x04 /* this quota modified since read */ 89: #define DQ_FAKE 0x08 /* no limits here, just usage */ 90: #define DQ_BLKS 0x10 /* has been warned about blk limit */ 91: #define DQ_INODS 0x20 /* has been warned about inode limit */ 92: short dq_cnt; /* count of active references */ 93: uid_t dq_uid; /* user this applies to */ 94: dev_t dq_dev; /* filesystem this relates to */ 95: struct dqblk dq_dqb; /* actual usage & quotas */ 96: }; 97: 98: #define dq_own dq_u.Dq_own 99: #define dq_freef dq_u.dq_f.Dq_freef 100: #define dq_freeb dq_u.dq_f.Dq_freeb 101: #define dq_bhardlimit dq_dqb.dqb_bhardlimit 102: #define dq_bsoftlimit dq_dqb.dqb_bsoftlimit 103: #define dq_curblocks dq_dqb.dqb_curblocks 104: #define dq_ihardlimit dq_dqb.dqb_ihardlimit 105: #define dq_isoftlimit dq_dqb.dqb_isoftlimit 106: #define dq_curinodes dq_dqb.dqb_curinodes 107: #define dq_bwarn dq_dqb.dqb_bwarn 108: #define dq_iwarn dq_dqb.dqb_iwarn 109: 110: #define NODQUOT ((struct dquot *) 0) 111: #define LOSTDQUOT ((struct dquot *) 1) 112: 113: #if defined(KERNEL) && defined(QUOTA) && !defined(SUPERVISOR) 114: struct dquot *dquot, *dquotNDQUOT; 115: int ndquot; 116: struct dquot *discquota(), *inoquota(), *dqalloc(), *dqp(); 117: #endif 118: 119: #define QUOTAFILENAME "quotas" 120: #define QUOTAGROUP "operator" 121: 122: /* 123: * Definitions for the 'quota' system call. 124: */ 125: #define Q_SETDLIM 1 /* set disc limits & usage */ 126: #define Q_GETDLIM 2 /* get disc limits & usage */ 127: #define Q_SETDUSE 3 /* set disc usage only */ 128: #define Q_SYNC 4 /* update disc copy of quota usages */ 129: #define Q_SETUID 16 /* change proc to use quotas for uid */ 130: #define Q_SETWARN 25 /* alter inode/block warning counts */ 131: #define Q_DOWARN 26 /* warn user about excessive space/inodes */ 132: 133: /* 134: * Used in Q_SETDUSE. 135: */ 136: struct dqusage { 137: u_short du_curinodes; 138: u_long du_curblocks; 139: }; 140: 141: /* 142: * Used in Q_SETWARN. 143: */ 144: struct dqwarn { 145: u_char dw_bwarn; 146: u_char dw_iwarn; 147: }; 148: 149: #if defined(KERNEL) && defined(QUOTA) && !defined(SUPERVISOR) 150: #include "../machine/seg.h" 151: 152: struct qhash { 153: struct qhash *qh_forw; 154: struct qhash *qh_back; 155: }; 156: 157: struct dqhead { 158: struct dqhead *dqh_forw; 159: struct dqhead *dqh_back; 160: }; 161: 162: #define QUOTAMAP() mapseg5(quotreg, quotdesc) 163: #define QUOTAUNMAP() normalseg5() 164: 165: memaddr quotreg; 166: u_short quotdesc; 167: struct dquot **ix_dquot; 168: 169: #define NQHASH 16 /* small power of 2 */ 170: #define NDQHASH 37 /* 4.3bsd used 51 which isn't even prime */ 171: #define NQUOTA 40 172: #define NDQUOT 150 173: #endif