1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 * 17 * @(#)quota.h 7.3 (Berkeley) 06/27/88 18 */ 19 20 /* 21 * MELBOURNE DISC QUOTAS 22 * 23 * Various junk to do with various quotas (etc) imposed upon 24 * the average user (big brother finally hits UNIX). 25 * 26 * The following structure exists in core for each logged on user. 27 * It contains global junk relevant to that user's quotas. 28 * 29 * The u_quota field of each user struct contains a pointer to 30 * the quota struct relevant to the current process, this is changed 31 * by 'setuid' sys call, &/or by the Q_SETUID quota() call. 32 */ 33 struct quota { 34 struct quota *q_forw, *q_back; /* hash chain, MUST be first */ 35 short q_cnt; /* ref count (# processes) */ 36 uid_t q_uid; /* real uid of owner */ 37 int q_flags; /* struct management flags */ 38 #define Q_LOCK 0x01 /* quota struct locked (for disc i/o) */ 39 #define Q_WANT 0x02 /* issue a wakeup when lock goes off */ 40 #define Q_NEW 0x04 /* new quota - no proc1 msg sent yet */ 41 #define Q_NDQ 0x08 /* account has NO disc quota */ 42 struct quota *q_freef, **q_freeb; 43 struct dquot *q_dq[NMOUNT]; /* disc quotas for mounted filesys's */ 44 }; 45 46 #define NOQUOTA ((struct quota *) 0) 47 48 #if defined(KERNEL) && defined(QUOTA) 49 struct quota *quota, *quotaNQUOTA; 50 int nquota; 51 struct quota *getquota(), *qfind(); 52 #endif 53 54 /* 55 * The following structure defines the format of the disc quota file 56 * (as it appears on disc) - the file is an array of these structures 57 * indexed by user number. The setquota sys call establishes the inode 58 * for each quota file (a pointer is retained in the mount structure). 59 * 60 * The following constants define the number of warnings given a user 61 * before the soft limits are treated as hard limits (usually resulting 62 * in an allocation failure). The warnings are normally manipulated 63 * each time a user logs in through the Q_DOWARN quota call. If 64 * the user logs in and is under the soft limit the warning count 65 * is reset to MAX_*_WARN, otherwise a message is printed and the 66 * warning count is decremented. This makes MAX_*_WARN equivalent to 67 * the number of logins before soft limits are treated as hard limits. 68 */ 69 #define MAX_IQ_WARN 3 70 #define MAX_DQ_WARN 3 71 72 struct dqblk { 73 u_long dqb_bhardlimit; /* absolute limit on disc blks alloc */ 74 u_long dqb_bsoftlimit; /* preferred limit on disc blks */ 75 u_long dqb_curblocks; /* current block count */ 76 u_short dqb_ihardlimit; /* maximum # allocated inodes + 1 */ 77 u_short dqb_isoftlimit; /* preferred inode limit */ 78 u_short dqb_curinodes; /* current # allocated inodes */ 79 u_char dqb_bwarn; /* # warnings left about excessive disc use */ 80 u_char dqb_iwarn; /* # warnings left about excessive inodes */ 81 }; 82 83 /* 84 * The following structure records disc usage for a user on a filesystem. 85 * There is one allocated for each quota that exists on any filesystem 86 * for the current user. A cache is kept of other recently used entries. 87 */ 88 struct dquot { 89 struct dquot *dq_forw, *dq_back;/* MUST be first entry */ 90 union { 91 struct quota *Dq_own; /* the quota that points to this */ 92 struct { /* free list */ 93 struct dquot *Dq_freef, **Dq_freeb; 94 } dq_f; 95 } dq_u; 96 short dq_flags; 97 #define DQ_LOCK 0x01 /* this quota locked (no MODS) */ 98 #define DQ_WANT 0x02 /* wakeup on unlock */ 99 #define DQ_MOD 0x04 /* this quota modified since read */ 100 #define DQ_FAKE 0x08 /* no limits here, just usage */ 101 #define DQ_BLKS 0x10 /* has been warned about blk limit */ 102 #define DQ_INODS 0x20 /* has been warned about inode limit */ 103 short dq_cnt; /* count of active references */ 104 uid_t dq_uid; /* user this applies to */ 105 dev_t dq_dev; /* filesystem this relates to */ 106 struct dqblk dq_dqb; /* actual usage & quotas */ 107 }; 108 109 #define dq_own dq_u.Dq_own 110 #define dq_freef dq_u.dq_f.Dq_freef 111 #define dq_freeb dq_u.dq_f.Dq_freeb 112 #define dq_bhardlimit dq_dqb.dqb_bhardlimit 113 #define dq_bsoftlimit dq_dqb.dqb_bsoftlimit 114 #define dq_curblocks dq_dqb.dqb_curblocks 115 #define dq_ihardlimit dq_dqb.dqb_ihardlimit 116 #define dq_isoftlimit dq_dqb.dqb_isoftlimit 117 #define dq_curinodes dq_dqb.dqb_curinodes 118 #define dq_bwarn dq_dqb.dqb_bwarn 119 #define dq_iwarn dq_dqb.dqb_iwarn 120 121 #define NODQUOT ((struct dquot *) 0) 122 #define LOSTDQUOT ((struct dquot *) 1) 123 124 #if defined(KERNEL) && defined(QUOTA) 125 struct dquot *dquot, *dquotNDQUOT; 126 int ndquot; 127 struct dquot *discquota(), *inoquota(), *dqalloc(), *dqp(); 128 #endif 129 130 /* 131 * Definitions for the 'quota' system call. 132 */ 133 #define Q_SETDLIM 1 /* set disc limits & usage */ 134 #define Q_GETDLIM 2 /* get disc limits & usage */ 135 #define Q_SETDUSE 3 /* set disc usage only */ 136 #define Q_SYNC 4 /* update disc copy of quota usages */ 137 #define Q_SETUID 16 /* change proc to use quotas for uid */ 138 #define Q_SETWARN 25 /* alter inode/block warning counts */ 139 #define Q_DOWARN 26 /* warn user about excessive space/inodes */ 140 141 /* 142 * Used in Q_SETDUSE. 143 */ 144 struct dqusage { 145 u_short du_curinodes; 146 u_long du_curblocks; 147 }; 148 149 /* 150 * Used in Q_SETWARN. 151 */ 152 struct dqwarn { 153 u_char dw_bwarn; 154 u_char dw_iwarn; 155 }; 156