1 /* $NetBSD: ufs_quota.h,v 1.22 2014/06/28 22:27:51 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1982, 1986, 1990, 1993, 1995 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Robert Elz at The University of Melbourne. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * @(#)ufs_quota.c 8.5 (Berkeley) 5/20/95 35 */ 36 #include <ufs/ufs/quota1.h> 37 #include <ufs/ufs/quota2.h> 38 39 struct quotakcursor; /* from <sys/quotactl.h> */ 40 41 42 /* link to this quota in the quota inode (for QUOTA2) */ 43 struct dq2_desc { 44 uint64_t dq2_lblkno; /* logical disk block holding this quota */ 45 u_int dq2_blkoff; /* offset in disk block holding this quota */ 46 }; 47 48 /* 49 * The following structure records disk usage for a user or group on a 50 * filesystem. There is one allocated for each quota that exists on any 51 * filesystem for the current user or group. A cache is kept of recently 52 * used entries. 53 * Field markings and the corresponding locks: 54 * h: dqlock 55 * d: dq_interlock 56 * 57 * Lock order is: dq_interlock -> dqlock 58 * dq_interlock -> dqvp 59 */ 60 struct dquot { 61 LIST_ENTRY(dquot) dq_hash; /* h: hash list */ 62 u_int16_t dq_flags; /* d: flags, see below */ 63 u_int16_t dq_type; /* d: quota type of this dquot */ 64 u_int32_t dq_cnt; /* h: count of active references */ 65 u_int32_t dq_id; /* d: identifier this applies to */ 66 struct ufsmount *dq_ump; /* d: filesystem this is taken from */ 67 kmutex_t dq_interlock; /* d: lock this dquot */ 68 union { 69 struct dqblk dq1_dqb; /* d: actual usage & quotas */ 70 struct dq2_desc dq2_desc; /* d: pointer to quota data */ 71 } dq_un; 72 }; 73 74 /* 75 * Flag values. 76 */ 77 #define DQ_MOD 0x04 /* this quota modified since read */ 78 #define DQ_FAKE 0x08 /* no limits here, just usage */ 79 #define DQ_WARN(ltype) (0x10 << ltype) /* has been warned about "type" limit */ 80 /* 81 * Shorthand notation. 82 */ 83 #define dq_bhardlimit dq_un.dq1_dqb.dqb_bhardlimit 84 #define dq_bsoftlimit dq_un.dq1_dqb.dqb_bsoftlimit 85 #define dq_curblocks dq_un.dq1_dqb.dqb_curblocks 86 #define dq_ihardlimit dq_un.dq1_dqb.dqb_ihardlimit 87 #define dq_isoftlimit dq_un.dq1_dqb.dqb_isoftlimit 88 #define dq_curinodes dq_un.dq1_dqb.dqb_curinodes 89 #define dq_btime dq_un.dq1_dqb.dqb_btime 90 #define dq_itime dq_un.dq1_dqb.dqb_itime 91 92 #define dq2_lblkno dq_un.dq2_desc.dq2_lblkno 93 #define dq2_blkoff dq_un.dq2_desc.dq2_blkoff 94 /* 95 * If the system has never checked for a quota for this file, then it is 96 * set to NODQUOT. Once a write attempt is made the inode pointer is set 97 * to reference a dquot structure. 98 */ 99 #define NODQUOT NULL 100 101 extern kmutex_t dqlock; 102 extern kcondvar_t dqcv; 103 /* 104 * Quota name to error message mapping. 105 */ 106 extern const char *quotatypes[MAXQUOTAS]; 107 108 int getinoquota(struct inode *); 109 int dqget(struct vnode *, u_long, struct ufsmount *, int, struct dquot **); 110 void dqref(struct dquot *); 111 void dqrele(struct vnode *, struct dquot *); 112 void dqflush(struct vnode *); 113 114 int chkdq1(struct inode *, int64_t, kauth_cred_t, int); 115 int chkiq1(struct inode *, int32_t, kauth_cred_t, int); 116 int q1sync(struct mount *); 117 int dq1get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *); 118 int dq1sync(struct vnode *, struct dquot *); 119 int quota1_handle_cmd_get(struct ufsmount *, const struct quotakey *, 120 struct quotaval *); 121 int quota1_handle_cmd_put(struct ufsmount *, const struct quotakey *, 122 const struct quotaval *); 123 int quota1_handle_cmd_quotaon(struct lwp *, struct ufsmount *, int, 124 const char *); 125 int quota1_handle_cmd_quotaoff(struct lwp *, struct ufsmount *, int); 126 127 int chkdq2(struct inode *, int64_t, kauth_cred_t, int); 128 int chkiq2(struct inode *, int32_t, kauth_cred_t, int); 129 int quota2_handle_cmd_get(struct ufsmount *, const struct quotakey *, 130 struct quotaval *); 131 int quota2_handle_cmd_put(struct ufsmount *, const struct quotakey *, 132 const struct quotaval *); 133 int quota2_handle_cmd_del(struct ufsmount *, const struct quotakey *); 134 int quota2_handle_cmd_cursorget(struct ufsmount *, struct quotakcursor *, 135 struct quotakey *, struct quotaval *, unsigned, unsigned *); 136 int quota2_handle_cmd_cursoropen(struct ufsmount *, struct quotakcursor *); 137 int quota2_handle_cmd_cursorclose(struct ufsmount *, struct quotakcursor *); 138 int quota2_handle_cmd_cursorskipidtype(struct ufsmount *, struct quotakcursor *, 139 int); 140 int quota2_handle_cmd_cursoratend(struct ufsmount *, struct quotakcursor *, 141 int *); 142 int quota2_handle_cmd_cursorrewind(struct ufsmount *, struct quotakcursor *); 143 int q2sync(struct mount *); 144 int dq2get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *); 145 int dq2sync(struct vnode *, struct dquot *); 146