only delete space used by inode, on inode deletion; required
[unix-history] / usr / src / sys / ufs / ffs / quota.h
index eddc74b..ce5c6b2 100644 (file)
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at Berkeley. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
+ * This code is derived from software contributed to Berkeley by
+ * Robert Elz at The University of Melbourne.
  *
  *
- *     @(#)quota.h     7.2 (Berkeley) %G%
+ * %sccs.include.redist.c%
+ *
+ *     @(#)quota.h     7.10 (Berkeley) %G%
  */
 
  */
 
+#ifndef _QUOTA_
+#define _QUOTA_
+
 /*
 /*
- * MELBOURNE DISC QUOTAS
- *
- * Various junk to do with various quotas (etc) imposed upon
- * the average user (big brother finally hits UNIX).
+ * Definitions for disk quotas imposed on 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.
+ * The following constants define the amount of time given a user before the
+ * soft limits are treated as hard limits (usually resulting in an allocation
+ * failure). The timer is started when the user crosses their soft limit, it
+ * is reset when they go below their soft limit.
  */
  */
-struct quota {
-       struct  quota *q_forw, *q_back; /* hash chain, MUST be first */
-       short   q_cnt;                  /* ref count (# processes) */
-       uid_t   q_uid;                  /* real uid of owner */
-       int     q_flags;                /* struct management 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 */
-       struct  quota *q_freef, **q_freeb;
-       struct  dquot *q_dq[NMOUNT];    /* disc quotas for mounted filesys's */
-};
+#define        MAX_IQ_TIME     (7*24*60*60)    /* 1 week */
+#define        MAX_DQ_TIME     (7*24*60*60)    /* 1 week */
 
 
-#define        NOQUOTA ((struct quota *) 0)
+/*
+ * The following constants define the usage of the quota file array in the
+ * ufsmount structure and dquot array in the inode structure.  The semantics
+ * of the elements of these arrays are defined in the routine getinoquota;
+ * the remainder of the quota code treats them generically and need not be
+ * inspected when changing the size of the array.
+ */
+#define        MAXQUOTAS       2
+#define        USRQUOTA        0       /* element used for user quotas */
+#define        GRPQUOTA        1       /* element used for group quotas */
 
 
-#if defined(KERNEL) && defined(QUOTA)
-struct quota *quota, *quotaNQUOTA;
-int    nquota;
-struct quota *getquota(), *qfind();
-#endif
+/*
+ * Definitions for the default names of the quotas files.
+ */
+#define INITQFNAMES { \
+       "user",         /* USRQUOTA */ \
+       "group",        /* GRPQUOTA */ \
+       "undefined", \
+};
+#define        QUOTAFILENAME   "quota"
+#define        QUOTAGROUP      "operator"
 
 /*
 
 /*
- * 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.  The setquota sys call establishes the inode
- * for each quota file (a pointer is retained in the mount structure).
- *
- * The following constants define the number of warnings given a user
- * before the soft limits are treated as hard limits (usually resulting
- * in an allocation failure).  The warnings are normally manipulated
- * each time a user logs in through the Q_DOWARN quota call.  If
- * the user logs in and is under the soft limit the warning count
- * is reset to MAX_*_WARN, otherwise a message is printed and the
- * warning count is decremented.  This makes MAX_*_WARN equivalent to
- * the number of logins before soft limits are treated as hard limits.
+ * Command definitions for the 'quotactl' system call.  The commands are
+ * broken into a main command defined below and a subcommand that is used
+ * to convey the type of quota that is being manipulated (see above).
  */
  */
-#define        MAX_IQ_WARN     3
-#define        MAX_DQ_WARN     3
+#define SUBCMDMASK     0x00ff
+#define SUBCMDSHIFT    8
+#define        QCMD(cmd, type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
+
+#define        Q_QUOTAON       0x0100  /* enable quotas */
+#define        Q_QUOTAOFF      0x0200  /* disable quotas */
+#define        Q_GETQUOTA      0x0300  /* get limits and usage */
+#define        Q_SETQUOTA      0x0400  /* set limits and usage */
+#define        Q_SETUSE        0x0500  /* set usage */
+#define        Q_SYNC          0x0600  /* sync disk copy of a filesystems quotas */
 
 
+/*
+ * The following 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 or group number.  The setquota system call establishes
+ * the vnode for each quota file (a pointer is retained in the ufsmount
+ * structure).
+ */
 struct dqblk {
 struct dqblk {
-       u_long  dqb_bhardlimit; /* absolute limit on disc blks alloc */
-       u_long  dqb_bsoftlimit; /* preferred limit on disc blks */
+       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_curblocks;  /* current block count */
-       u_short dqb_ihardlimit; /* maximum # allocated inodes + 1 */
-       u_short dqb_isoftlimit; /* preferred inode limit */
-       u_short dqb_curinodes;  /* current # allocated inodes */
-       u_char  dqb_bwarn;      /* # warnings left about excessive disc use */
-       u_char  dqb_iwarn;      /* # warnings left about excessive inodes */
+       u_long  dqb_ihardlimit; /* maximum # allocated inodes + 1 */
+       u_long  dqb_isoftlimit; /* preferred inode limit */
+       u_long  dqb_curinodes;  /* current # allocated inodes */
+       time_t  dqb_btime;      /* time limit for excessive disk use */
+       time_t  dqb_itime;      /* time limit for excessive files */
 };
 
 /*
 };
 
 /*
- * 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.
+ * The following structure records disk usage for a user or group on a
+ * filesystem. There is one allocated for each quota that exists on any
+ * filesystem for the current user or group. A cache is kept of recently
+ * used entries.
  */
 struct dquot {
        struct  dquot *dq_forw, *dq_back;/* MUST be first entry */
  */
 struct dquot {
        struct  dquot *dq_forw, *dq_back;/* MUST be first entry */
-       union   {
-               struct  quota *Dq_own;  /* the quota that points to this */
-               struct {                /* free list */
-                       struct  dquot *Dq_freef, **Dq_freeb;
-               } dq_f;
-       } dq_u;
-       short   dq_flags;
+       struct  dquot *dq_freef, **dq_freeb; /* free list */
+       short   dq_flags;               /* flags, see below */
+       short   dq_cnt;                 /* count of active references */
+       short   dq_spare;               /* unused spare padding */
+       short   dq_type;                /* quota type of this dquot */
+       u_long  dq_id;                  /* identifier this applies to */
+       struct  ufsmount *dq_ump;       /* filesystem that this is taken from */
+       struct  dqblk dq_dqb;           /* actual usage & quotas */
+};
+/*
+ * Flag values.
+ */
 #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 */
 #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 */
-       short   dq_cnt;                 /* count of active references */
-       uid_t   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
+/*
+ * Shorthand notation.
+ */
 #define        dq_bhardlimit   dq_dqb.dqb_bhardlimit
 #define        dq_bsoftlimit   dq_dqb.dqb_bsoftlimit
 #define        dq_curblocks    dq_dqb.dqb_curblocks
 #define        dq_ihardlimit   dq_dqb.dqb_ihardlimit
 #define        dq_isoftlimit   dq_dqb.dqb_isoftlimit
 #define        dq_curinodes    dq_dqb.dqb_curinodes
 #define        dq_bhardlimit   dq_dqb.dqb_bhardlimit
 #define        dq_bsoftlimit   dq_dqb.dqb_bsoftlimit
 #define        dq_curblocks    dq_dqb.dqb_curblocks
 #define        dq_ihardlimit   dq_dqb.dqb_ihardlimit
 #define        dq_isoftlimit   dq_dqb.dqb_isoftlimit
 #define        dq_curinodes    dq_dqb.dqb_curinodes
-#define        dq_bwarn        dq_dqb.dqb_bwarn
-#define        dq_iwarn        dq_dqb.dqb_iwarn
-
-#define        NODQUOT         ((struct dquot *) 0)
-#define        LOSTDQUOT       ((struct dquot *) 1)
-
-#if defined(KERNEL) && defined(QUOTA)
-struct dquot *dquot, *dquotNDQUOT;
-int    ndquot;
-struct dquot *discquota(), *inoquota(), *dqalloc(), *dqp();
-#endif
+#define        dq_btime        dq_dqb.dqb_btime
+#define        dq_itime        dq_dqb.dqb_itime
 
 /*
 
 /*
- * Definitions for the 'quota' system call.
+ * If the system has never checked for a quota for this file, then it is set
+ * to NODQUOT.  Once a write attempt is made the inode pointer is set to
+ * reference a dquot structure.
  */
  */
-#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 of quota usages */
-#define        Q_SETUID        16      /* change proc to use quotas for uid */
-#define        Q_SETWARN       25      /* alter inode/block warning counts */
-#define        Q_DOWARN        26      /* warn user about excessive space/inodes */
+#define        NODQUOT         ((struct dquot *) 0)
 
 /*
 
 /*
- * Used in Q_SETDUSE.
+ * Flags to chkdq() and chkiq()
  */
  */
-struct dqusage {
-       u_short du_curinodes;
-       u_long  du_curblocks;
-};
+#define        FORCE   0x01    /* force usage changes independent of limits */
+#define        CHOWN   0x02    /* (advisory) change initiated by chown */
 
 /*
 
 /*
- * Used in Q_SETWARN.
+ * Macros to avoid subroutine calls to trivial functions.
  */
  */
-struct dqwarn {
-       u_char  dw_bwarn;
-       u_char  dw_iwarn;
-};
+#ifdef DIAGNOSTIC
+#define        DQREF(dq)       dqref(dq)
+#else
+#define        DQREF(dq)       (dq)->dq_cnt++
+#endif
+
+#include <sys/cdefs.h>
+
+struct dquot;
+struct inode;
+struct mount;
+struct proc;
+struct ucred;
+struct ufsmount;
+struct vnode;
+__BEGIN_DECLS
+int    chkdq __P((struct inode *, long, struct ucred *, int));
+int    chkdqchg __P((struct inode *, long, struct ucred *, int));
+int    chkiq __P((struct inode *, long, struct ucred *, int));
+int    chkiqchg __P((struct inode *, long, struct ucred *, int));
+void   dqflush __P((struct vnode *));
+int    dqget __P((struct vnode *,
+           u_long, struct ufsmount *, int, struct dquot **));
+void   dqinit __P((void));
+void   dqref __P((struct dquot *));
+void   dqrele __P((struct vnode *, struct dquot *));
+int    dqsync __P((struct vnode *, struct dquot *));
+int    getinoquota __P((struct inode *));
+int    getquota __P((struct mount *, u_long, int, caddr_t));
+int    qsync __P((struct mount *mp));
+int    quotaoff __P((struct proc *, struct mount *, int));
+int    quotaon __P((struct proc *, struct mount *, int, caddr_t));
+int    setquota __P((struct mount *, u_long, int, caddr_t));
+int    setuse __P((struct mount *, u_long, int, caddr_t));
+int    ufs_quotactl __P((struct mount *, int, u_int, caddr_t, struct proc *));
+__END_DECLS
+
+#ifdef DIAGNOSTIC
+__BEGIN_DECLS
+void   chkdquot __P((struct inode *));
+__END_DECLS
+#endif
+
+#endif /* _QUOTA_ */