1
2
3
4
5
6
7
8#ifndef _LINUX_QUOTAOPS_
9#define _LINUX_QUOTAOPS_
10
11#include <linux/fs.h>
12
13#define DQUOT_SPACE_WARN 0x1
14#define DQUOT_SPACE_RESERVE 0x2
15#define DQUOT_SPACE_NOFAIL 0x4
16
17static inline struct quota_info *sb_dqopt(struct super_block *sb)
18{
19 return &sb->s_dquot;
20}
21
22
23static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
24{
25 return (ia->ia_valid & ATTR_SIZE) ||
26 (ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) ||
27 (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
28}
29
30#if defined(CONFIG_QUOTA)
31
32#define quota_error(sb, fmt, args...) \
33 __quota_error((sb), __func__, fmt , ## args)
34
35extern __printf(3, 4)
36void __quota_error(struct super_block *sb, const char *func,
37 const char *fmt, ...);
38
39
40
41
42int dquot_initialize(struct inode *inode);
43bool dquot_initialize_needed(struct inode *inode);
44void dquot_drop(struct inode *inode);
45struct dquot *dqget(struct super_block *sb, struct kqid qid);
46static inline struct dquot *dqgrab(struct dquot *dquot)
47{
48
49 WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
50 WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
51 atomic_inc(&dquot->dq_count);
52 return dquot;
53}
54
55static inline bool dquot_is_busy(struct dquot *dquot)
56{
57 if (test_bit(DQ_MOD_B, &dquot->dq_flags))
58 return true;
59 if (atomic_read(&dquot->dq_count) > 1)
60 return true;
61 return false;
62}
63
64void dqput(struct dquot *dquot);
65int dquot_scan_active(struct super_block *sb,
66 int (*fn)(struct dquot *dquot, unsigned long priv),
67 unsigned long priv);
68struct dquot *dquot_alloc(struct super_block *sb, int type);
69void dquot_destroy(struct dquot *dquot);
70
71int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
72void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
73
74int dquot_alloc_inode(struct inode *inode);
75
76int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
77void dquot_free_inode(struct inode *inode);
78void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
79
80int dquot_disable(struct super_block *sb, int type, unsigned int flags);
81
82static inline int dquot_suspend(struct super_block *sb, int type)
83{
84 return dquot_disable(sb, type, DQUOT_SUSPENDED);
85}
86int dquot_resume(struct super_block *sb, int type);
87
88int dquot_commit(struct dquot *dquot);
89int dquot_acquire(struct dquot *dquot);
90int dquot_release(struct dquot *dquot);
91int dquot_commit_info(struct super_block *sb, int type);
92int dquot_get_next_id(struct super_block *sb, struct kqid *qid);
93int dquot_mark_dquot_dirty(struct dquot *dquot);
94
95int dquot_file_open(struct inode *inode, struct file *file);
96
97int dquot_load_quota_sb(struct super_block *sb, int type, int format_id,
98 unsigned int flags);
99int dquot_load_quota_inode(struct inode *inode, int type, int format_id,
100 unsigned int flags);
101int dquot_quota_on(struct super_block *sb, int type, int format_id,
102 const struct path *path);
103int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
104 int format_id, int type);
105int dquot_quota_off(struct super_block *sb, int type);
106int dquot_writeback_dquots(struct super_block *sb, int type);
107int dquot_quota_sync(struct super_block *sb, int type);
108int dquot_get_state(struct super_block *sb, struct qc_state *state);
109int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii);
110int dquot_get_dqblk(struct super_block *sb, struct kqid id,
111 struct qc_dqblk *di);
112int dquot_get_next_dqblk(struct super_block *sb, struct kqid *id,
113 struct qc_dqblk *di);
114int dquot_set_dqblk(struct super_block *sb, struct kqid id,
115 struct qc_dqblk *di);
116
117int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
118int dquot_transfer(struct inode *inode, struct iattr *iattr);
119
120static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
121{
122 return sb_dqopt(sb)->info + type;
123}
124
125
126
127
128
129static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
130{
131 return sb_dqopt(sb)->flags &
132 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
133}
134
135static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
136{
137 return sb_dqopt(sb)->flags &
138 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
139}
140
141static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
142{
143 return sb_dqopt(sb)->flags &
144 dquot_state_flag(DQUOT_SUSPENDED, type);
145}
146
147static inline unsigned sb_any_quota_suspended(struct super_block *sb)
148{
149 return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
150}
151
152
153static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
154{
155
156 return sb_has_quota_usage_enabled(sb, type);
157}
158
159static inline unsigned sb_any_quota_loaded(struct super_block *sb)
160{
161 return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
162}
163
164static inline bool sb_has_quota_active(struct super_block *sb, int type)
165{
166 return sb_has_quota_loaded(sb, type) &&
167 !sb_has_quota_suspended(sb, type);
168}
169
170
171
172
173extern const struct dquot_operations dquot_operations;
174extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
175
176#else
177
178static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
179{
180 return 0;
181}
182
183static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
184{
185 return 0;
186}
187
188static inline int sb_has_quota_suspended(struct super_block *sb, int type)
189{
190 return 0;
191}
192
193static inline int sb_any_quota_suspended(struct super_block *sb)
194{
195 return 0;
196}
197
198
199static inline int sb_has_quota_loaded(struct super_block *sb, int type)
200{
201 return 0;
202}
203
204static inline int sb_any_quota_loaded(struct super_block *sb)
205{
206 return 0;
207}
208
209static inline int sb_has_quota_active(struct super_block *sb, int type)
210{
211 return 0;
212}
213
214static inline int dquot_initialize(struct inode *inode)
215{
216 return 0;
217}
218
219static inline bool dquot_initialize_needed(struct inode *inode)
220{
221 return false;
222}
223
224static inline void dquot_drop(struct inode *inode)
225{
226}
227
228static inline int dquot_alloc_inode(struct inode *inode)
229{
230 return 0;
231}
232
233static inline void dquot_free_inode(struct inode *inode)
234{
235}
236
237static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
238{
239 return 0;
240}
241
242static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
243 int flags)
244{
245 if (!(flags & DQUOT_SPACE_RESERVE))
246 inode_add_bytes(inode, number);
247 return 0;
248}
249
250static inline void __dquot_free_space(struct inode *inode, qsize_t number,
251 int flags)
252{
253 if (!(flags & DQUOT_SPACE_RESERVE))
254 inode_sub_bytes(inode, number);
255}
256
257static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
258{
259 inode_add_bytes(inode, number);
260 return 0;
261}
262
263static inline int dquot_reclaim_space_nodirty(struct inode *inode,
264 qsize_t number)
265{
266 inode_sub_bytes(inode, number);
267 return 0;
268}
269
270static inline int dquot_disable(struct super_block *sb, int type,
271 unsigned int flags)
272{
273 return 0;
274}
275
276static inline int dquot_suspend(struct super_block *sb, int type)
277{
278 return 0;
279}
280
281static inline int dquot_resume(struct super_block *sb, int type)
282{
283 return 0;
284}
285
286#define dquot_file_open generic_file_open
287
288static inline int dquot_writeback_dquots(struct super_block *sb, int type)
289{
290 return 0;
291}
292
293#endif
294
295static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
296{
297 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
298}
299
300static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
301{
302 __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
303 mark_inode_dirty_sync(inode);
304}
305
306static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
307{
308 int ret;
309
310 ret = dquot_alloc_space_nodirty(inode, nr);
311 if (!ret) {
312
313
314
315
316
317 mark_inode_dirty(inode);
318 }
319 return ret;
320}
321
322static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
323{
324 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
325}
326
327static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
328{
329 dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
330}
331
332static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
333{
334 return dquot_alloc_space(inode, nr << inode->i_blkbits);
335}
336
337static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
338{
339 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
340}
341
342static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
343{
344 int ret;
345
346 ret = dquot_prealloc_block_nodirty(inode, nr);
347 if (!ret)
348 mark_inode_dirty_sync(inode);
349 return ret;
350}
351
352static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
353{
354 return __dquot_alloc_space(inode, nr << inode->i_blkbits,
355 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
356}
357
358static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
359{
360 int ret;
361
362 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
363 if (!ret)
364 mark_inode_dirty_sync(inode);
365 return ret;
366}
367
368static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
369{
370 dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
371 mark_inode_dirty_sync(inode);
372}
373
374static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
375{
376 __dquot_free_space(inode, nr, 0);
377}
378
379static inline void dquot_free_space(struct inode *inode, qsize_t nr)
380{
381 dquot_free_space_nodirty(inode, nr);
382 mark_inode_dirty_sync(inode);
383}
384
385static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
386{
387 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
388}
389
390static inline void dquot_free_block(struct inode *inode, qsize_t nr)
391{
392 dquot_free_space(inode, nr << inode->i_blkbits);
393}
394
395static inline void dquot_release_reservation_block(struct inode *inode,
396 qsize_t nr)
397{
398 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
399}
400
401unsigned int qtype_enforce_flag(int type);
402
403#endif
404