.. | .. |
---|
27 | 27 | XFS_QLOWSP_MAX |
---|
28 | 28 | }; |
---|
29 | 29 | |
---|
| 30 | +struct xfs_dquot_res { |
---|
| 31 | + /* Total resources allocated and reserved. */ |
---|
| 32 | + xfs_qcnt_t reserved; |
---|
| 33 | + |
---|
| 34 | + /* Total resources allocated. */ |
---|
| 35 | + xfs_qcnt_t count; |
---|
| 36 | + |
---|
| 37 | + /* Absolute and preferred limits. */ |
---|
| 38 | + xfs_qcnt_t hardlimit; |
---|
| 39 | + xfs_qcnt_t softlimit; |
---|
| 40 | + |
---|
| 41 | + /* |
---|
| 42 | + * For root dquots, this is the default grace period, in seconds. |
---|
| 43 | + * Otherwise, this is when the quota grace period expires, |
---|
| 44 | + * in seconds since the Unix epoch. |
---|
| 45 | + */ |
---|
| 46 | + time64_t timer; |
---|
| 47 | + |
---|
| 48 | + /* |
---|
| 49 | + * For root dquots, this is the maximum number of warnings that will |
---|
| 50 | + * be issued for this quota type. Otherwise, this is the number of |
---|
| 51 | + * warnings issued against this quota. Note that none of this is |
---|
| 52 | + * implemented. |
---|
| 53 | + */ |
---|
| 54 | + xfs_qwarncnt_t warnings; |
---|
| 55 | +}; |
---|
| 56 | + |
---|
30 | 57 | /* |
---|
31 | 58 | * The incore dquot structure |
---|
32 | 59 | */ |
---|
33 | | -typedef struct xfs_dquot { |
---|
34 | | - uint dq_flags; /* various flags (XFS_DQ_*) */ |
---|
35 | | - struct list_head q_lru; /* global free list of dquots */ |
---|
36 | | - struct xfs_mount*q_mount; /* filesystem this relates to */ |
---|
37 | | - struct xfs_trans*q_transp; /* trans this belongs to currently */ |
---|
38 | | - uint q_nrefs; /* # active refs from inodes */ |
---|
39 | | - xfs_daddr_t q_blkno; /* blkno of dquot buffer */ |
---|
40 | | - int q_bufoffset; /* off of dq in buffer (# dquots) */ |
---|
41 | | - xfs_fileoff_t q_fileoffset; /* offset in quotas file */ |
---|
| 60 | +struct xfs_dquot { |
---|
| 61 | + struct list_head q_lru; |
---|
| 62 | + struct xfs_mount *q_mount; |
---|
| 63 | + xfs_dqtype_t q_type; |
---|
| 64 | + uint16_t q_flags; |
---|
| 65 | + xfs_dqid_t q_id; |
---|
| 66 | + uint q_nrefs; |
---|
| 67 | + int q_bufoffset; |
---|
| 68 | + xfs_daddr_t q_blkno; |
---|
| 69 | + xfs_fileoff_t q_fileoffset; |
---|
42 | 70 | |
---|
43 | | - xfs_disk_dquot_t q_core; /* actual usage & quotas */ |
---|
44 | | - xfs_dq_logitem_t q_logitem; /* dquot log item */ |
---|
45 | | - xfs_qcnt_t q_res_bcount; /* total regular nblks used+reserved */ |
---|
46 | | - xfs_qcnt_t q_res_icount; /* total inos allocd+reserved */ |
---|
47 | | - xfs_qcnt_t q_res_rtbcount;/* total realtime blks used+reserved */ |
---|
48 | | - xfs_qcnt_t q_prealloc_lo_wmark;/* prealloc throttle wmark */ |
---|
49 | | - xfs_qcnt_t q_prealloc_hi_wmark;/* prealloc disabled wmark */ |
---|
50 | | - int64_t q_low_space[XFS_QLOWSP_MAX]; |
---|
51 | | - struct mutex q_qlock; /* quota lock */ |
---|
52 | | - struct completion q_flush; /* flush completion queue */ |
---|
53 | | - atomic_t q_pincount; /* dquot pin count */ |
---|
54 | | - wait_queue_head_t q_pinwait; /* dquot pinning wait queue */ |
---|
55 | | -} xfs_dquot_t; |
---|
| 71 | + struct xfs_dquot_res q_blk; /* regular blocks */ |
---|
| 72 | + struct xfs_dquot_res q_ino; /* inodes */ |
---|
| 73 | + struct xfs_dquot_res q_rtb; /* realtime blocks */ |
---|
| 74 | + |
---|
| 75 | + struct xfs_dq_logitem q_logitem; |
---|
| 76 | + |
---|
| 77 | + xfs_qcnt_t q_prealloc_lo_wmark; |
---|
| 78 | + xfs_qcnt_t q_prealloc_hi_wmark; |
---|
| 79 | + int64_t q_low_space[XFS_QLOWSP_MAX]; |
---|
| 80 | + struct mutex q_qlock; |
---|
| 81 | + struct completion q_flush; |
---|
| 82 | + atomic_t q_pincount; |
---|
| 83 | + struct wait_queue_head q_pinwait; |
---|
| 84 | +}; |
---|
56 | 85 | |
---|
57 | 86 | /* |
---|
58 | 87 | * Lock hierarchy for q_qlock: |
---|
59 | 88 | * XFS_QLOCK_NORMAL is the implicit default, |
---|
60 | | - * XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2 |
---|
| 89 | + * XFS_QLOCK_NESTED is the dquot with the higher id in xfs_dqlock2 |
---|
61 | 90 | */ |
---|
62 | 91 | enum { |
---|
63 | 92 | XFS_QLOCK_NORMAL = 0, |
---|
.. | .. |
---|
65 | 94 | }; |
---|
66 | 95 | |
---|
67 | 96 | /* |
---|
68 | | - * Manage the q_flush completion queue embedded in the dquot. This completion |
---|
| 97 | + * Manage the q_flush completion queue embedded in the dquot. This completion |
---|
69 | 98 | * queue synchronizes processes attempting to flush the in-core dquot back to |
---|
70 | 99 | * disk. |
---|
71 | 100 | */ |
---|
72 | | -static inline void xfs_dqflock(xfs_dquot_t *dqp) |
---|
| 101 | +static inline void xfs_dqflock(struct xfs_dquot *dqp) |
---|
73 | 102 | { |
---|
74 | 103 | wait_for_completion(&dqp->q_flush); |
---|
75 | 104 | } |
---|
76 | 105 | |
---|
77 | | -static inline bool xfs_dqflock_nowait(xfs_dquot_t *dqp) |
---|
| 106 | +static inline bool xfs_dqflock_nowait(struct xfs_dquot *dqp) |
---|
78 | 107 | { |
---|
79 | 108 | return try_wait_for_completion(&dqp->q_flush); |
---|
80 | 109 | } |
---|
81 | 110 | |
---|
82 | | -static inline void xfs_dqfunlock(xfs_dquot_t *dqp) |
---|
| 111 | +static inline void xfs_dqfunlock(struct xfs_dquot *dqp) |
---|
83 | 112 | { |
---|
84 | 113 | complete(&dqp->q_flush); |
---|
85 | 114 | } |
---|
.. | .. |
---|
99 | 128 | mutex_unlock(&dqp->q_qlock); |
---|
100 | 129 | } |
---|
101 | 130 | |
---|
102 | | -static inline int xfs_this_quota_on(struct xfs_mount *mp, int type) |
---|
| 131 | +static inline int |
---|
| 132 | +xfs_dquot_type(const struct xfs_dquot *dqp) |
---|
103 | 133 | { |
---|
104 | | - switch (type & XFS_DQ_ALLTYPES) { |
---|
105 | | - case XFS_DQ_USER: |
---|
| 134 | + return dqp->q_type & XFS_DQTYPE_REC_MASK; |
---|
| 135 | +} |
---|
| 136 | + |
---|
| 137 | +static inline int xfs_this_quota_on(struct xfs_mount *mp, xfs_dqtype_t type) |
---|
| 138 | +{ |
---|
| 139 | + switch (type) { |
---|
| 140 | + case XFS_DQTYPE_USER: |
---|
106 | 141 | return XFS_IS_UQUOTA_ON(mp); |
---|
107 | | - case XFS_DQ_GROUP: |
---|
| 142 | + case XFS_DQTYPE_GROUP: |
---|
108 | 143 | return XFS_IS_GQUOTA_ON(mp); |
---|
109 | | - case XFS_DQ_PROJ: |
---|
| 144 | + case XFS_DQTYPE_PROJ: |
---|
110 | 145 | return XFS_IS_PQUOTA_ON(mp); |
---|
111 | 146 | default: |
---|
112 | 147 | return 0; |
---|
113 | 148 | } |
---|
114 | 149 | } |
---|
115 | 150 | |
---|
116 | | -static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) |
---|
| 151 | +static inline struct xfs_dquot *xfs_inode_dquot( |
---|
| 152 | + struct xfs_inode *ip, |
---|
| 153 | + xfs_dqtype_t type) |
---|
117 | 154 | { |
---|
118 | | - switch (type & XFS_DQ_ALLTYPES) { |
---|
119 | | - case XFS_DQ_USER: |
---|
| 155 | + switch (type) { |
---|
| 156 | + case XFS_DQTYPE_USER: |
---|
120 | 157 | return ip->i_udquot; |
---|
121 | | - case XFS_DQ_GROUP: |
---|
| 158 | + case XFS_DQTYPE_GROUP: |
---|
122 | 159 | return ip->i_gdquot; |
---|
123 | | - case XFS_DQ_PROJ: |
---|
| 160 | + case XFS_DQTYPE_PROJ: |
---|
124 | 161 | return ip->i_pdquot; |
---|
125 | 162 | default: |
---|
126 | 163 | return NULL; |
---|
127 | 164 | } |
---|
| 165 | +} |
---|
| 166 | + |
---|
| 167 | +/* Decide if the dquot's limits are actually being enforced. */ |
---|
| 168 | +static inline bool |
---|
| 169 | +xfs_dquot_is_enforced( |
---|
| 170 | + const struct xfs_dquot *dqp) |
---|
| 171 | +{ |
---|
| 172 | + switch (xfs_dquot_type(dqp)) { |
---|
| 173 | + case XFS_DQTYPE_USER: |
---|
| 174 | + return XFS_IS_UQUOTA_ENFORCED(dqp->q_mount); |
---|
| 175 | + case XFS_DQTYPE_GROUP: |
---|
| 176 | + return XFS_IS_GQUOTA_ENFORCED(dqp->q_mount); |
---|
| 177 | + case XFS_DQTYPE_PROJ: |
---|
| 178 | + return XFS_IS_PQUOTA_ENFORCED(dqp->q_mount); |
---|
| 179 | + } |
---|
| 180 | + ASSERT(0); |
---|
| 181 | + return false; |
---|
128 | 182 | } |
---|
129 | 183 | |
---|
130 | 184 | /* |
---|
.. | .. |
---|
135 | 189 | { |
---|
136 | 190 | int64_t freesp; |
---|
137 | 191 | |
---|
138 | | - freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; |
---|
| 192 | + freesp = dqp->q_blk.hardlimit - dqp->q_blk.reserved; |
---|
139 | 193 | if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) |
---|
140 | 194 | return true; |
---|
141 | 195 | |
---|
142 | 196 | return false; |
---|
143 | 197 | } |
---|
144 | 198 | |
---|
| 199 | +void xfs_dquot_to_disk(struct xfs_disk_dquot *ddqp, struct xfs_dquot *dqp); |
---|
| 200 | + |
---|
145 | 201 | #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) |
---|
146 | | -#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) |
---|
147 | | -#define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) |
---|
148 | | -#define XFS_QM_ISPDQ(dqp) ((dqp)->dq_flags & XFS_DQ_PROJ) |
---|
149 | | -#define XFS_QM_ISGDQ(dqp) ((dqp)->dq_flags & XFS_DQ_GROUP) |
---|
| 202 | +#define XFS_DQ_IS_DIRTY(dqp) ((dqp)->q_flags & XFS_DQFLAG_DIRTY) |
---|
150 | 203 | |
---|
151 | | -extern void xfs_qm_dqdestroy(xfs_dquot_t *); |
---|
152 | | -extern int xfs_qm_dqflush(struct xfs_dquot *, struct xfs_buf **); |
---|
153 | | -extern void xfs_qm_dqunpin_wait(xfs_dquot_t *); |
---|
154 | | -extern void xfs_qm_adjust_dqtimers(xfs_mount_t *, |
---|
155 | | - xfs_disk_dquot_t *); |
---|
156 | | -extern void xfs_qm_adjust_dqlimits(struct xfs_mount *, |
---|
157 | | - struct xfs_dquot *); |
---|
158 | | -extern xfs_dqid_t xfs_qm_id_for_quotatype(struct xfs_inode *ip, |
---|
159 | | - uint type); |
---|
160 | | -extern int xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id, |
---|
161 | | - uint type, bool can_alloc, |
---|
162 | | - struct xfs_dquot **dqpp); |
---|
163 | | -extern int xfs_qm_dqget_inode(struct xfs_inode *ip, uint type, |
---|
164 | | - bool can_alloc, |
---|
165 | | - struct xfs_dquot **dqpp); |
---|
166 | | -extern int xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id, |
---|
167 | | - uint type, struct xfs_dquot **dqpp); |
---|
168 | | -extern int xfs_qm_dqget_uncached(struct xfs_mount *mp, |
---|
169 | | - xfs_dqid_t id, uint type, |
---|
170 | | - struct xfs_dquot **dqpp); |
---|
171 | | -extern void xfs_qm_dqput(xfs_dquot_t *); |
---|
| 204 | +void xfs_qm_dqdestroy(struct xfs_dquot *dqp); |
---|
| 205 | +int xfs_qm_dqflush(struct xfs_dquot *dqp, struct xfs_buf **bpp); |
---|
| 206 | +void xfs_qm_dqunpin_wait(struct xfs_dquot *dqp); |
---|
| 207 | +void xfs_qm_adjust_dqtimers(struct xfs_dquot *d); |
---|
| 208 | +void xfs_qm_adjust_dqlimits(struct xfs_dquot *d); |
---|
| 209 | +xfs_dqid_t xfs_qm_id_for_quotatype(struct xfs_inode *ip, |
---|
| 210 | + xfs_dqtype_t type); |
---|
| 211 | +int xfs_qm_dqget(struct xfs_mount *mp, xfs_dqid_t id, |
---|
| 212 | + xfs_dqtype_t type, bool can_alloc, |
---|
| 213 | + struct xfs_dquot **dqpp); |
---|
| 214 | +int xfs_qm_dqget_inode(struct xfs_inode *ip, xfs_dqtype_t type, |
---|
| 215 | + bool can_alloc, struct xfs_dquot **dqpp); |
---|
| 216 | +int xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id, |
---|
| 217 | + xfs_dqtype_t type, struct xfs_dquot **dqpp); |
---|
| 218 | +int xfs_qm_dqget_uncached(struct xfs_mount *mp, |
---|
| 219 | + xfs_dqid_t id, xfs_dqtype_t type, |
---|
| 220 | + struct xfs_dquot **dqpp); |
---|
| 221 | +void xfs_qm_dqput(struct xfs_dquot *dqp); |
---|
172 | 222 | |
---|
173 | | -extern void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); |
---|
| 223 | +void xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *); |
---|
174 | 224 | |
---|
175 | | -extern void xfs_dquot_set_prealloc_limits(struct xfs_dquot *); |
---|
| 225 | +void xfs_dquot_set_prealloc_limits(struct xfs_dquot *); |
---|
176 | 226 | |
---|
177 | 227 | static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) |
---|
178 | 228 | { |
---|
.. | .. |
---|
182 | 232 | return dqp; |
---|
183 | 233 | } |
---|
184 | 234 | |
---|
185 | | -typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq, uint dqtype, |
---|
186 | | - void *priv); |
---|
187 | | -int xfs_qm_dqiterate(struct xfs_mount *mp, uint dqtype, |
---|
| 235 | +typedef int (*xfs_qm_dqiterate_fn)(struct xfs_dquot *dq, |
---|
| 236 | + xfs_dqtype_t type, void *priv); |
---|
| 237 | +int xfs_qm_dqiterate(struct xfs_mount *mp, xfs_dqtype_t type, |
---|
188 | 238 | xfs_qm_dqiterate_fn iter_fn, void *priv); |
---|
189 | 239 | |
---|
| 240 | +time64_t xfs_dquot_set_timeout(struct xfs_mount *mp, time64_t timeout); |
---|
| 241 | +time64_t xfs_dquot_set_grace_period(time64_t grace); |
---|
| 242 | + |
---|
190 | 243 | #endif /* __XFS_DQUOT_H__ */ |
---|