1
2
3
4
5
6
7#ifndef _LINUX_QUOTAOPS_
8#define _LINUX_QUOTAOPS_
9
10#include <linux/fs.h>
11
12static inline struct quota_info *sb_dqopt(struct super_block *sb)
13{
14 return &sb->s_dquot;
15}
16
17#if defined(CONFIG_QUOTA)
18
19
20
21
22void sync_quota_sb(struct super_block *sb, int type);
23static inline void writeout_quota_sb(struct super_block *sb, int type)
24{
25 if (sb->s_qcop->quota_sync)
26 sb->s_qcop->quota_sync(sb, type);
27}
28
29int dquot_initialize(struct inode *inode, int type);
30int dquot_drop(struct inode *inode);
31struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
32void dqput(struct dquot *dquot);
33int dquot_scan_active(struct super_block *sb,
34 int (*fn)(struct dquot *dquot, unsigned long priv),
35 unsigned long priv);
36struct dquot *dquot_alloc(struct super_block *sb, int type);
37void dquot_destroy(struct dquot *dquot);
38
39int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
40int dquot_alloc_inode(const struct inode *inode, qsize_t number);
41
42int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc);
43int dquot_claim_space(struct inode *inode, qsize_t number);
44void dquot_release_reserved_space(struct inode *inode, qsize_t number);
45qsize_t dquot_get_reserved_space(struct inode *inode);
46
47int dquot_free_space(struct inode *inode, qsize_t number);
48int dquot_free_inode(const struct inode *inode, qsize_t number);
49
50int dquot_transfer(struct inode *inode, struct iattr *iattr);
51int dquot_commit(struct dquot *dquot);
52int dquot_acquire(struct dquot *dquot);
53int dquot_release(struct dquot *dquot);
54int dquot_commit_info(struct super_block *sb, int type);
55int dquot_mark_dquot_dirty(struct dquot *dquot);
56
57int vfs_quota_on(struct super_block *sb, int type, int format_id,
58 char *path, int remount);
59int vfs_quota_enable(struct inode *inode, int type, int format_id,
60 unsigned int flags);
61int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
62 struct path *path);
63int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
64 int format_id, int type);
65int vfs_quota_off(struct super_block *sb, int type, int remount);
66int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
67int vfs_quota_sync(struct super_block *sb, int type);
68int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
69int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
70int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
71int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
72
73void vfs_dq_drop(struct inode *inode);
74int vfs_dq_transfer(struct inode *inode, struct iattr *iattr);
75int vfs_dq_quota_on_remount(struct super_block *sb);
76
77static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
78{
79 return sb_dqopt(sb)->info + type;
80}
81
82
83
84
85
86static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
87{
88 return sb_dqopt(sb)->flags &
89 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
90}
91
92static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
93{
94 return sb_dqopt(sb)->flags &
95 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
96}
97
98static inline int sb_has_quota_suspended(struct super_block *sb, int type)
99{
100 return sb_dqopt(sb)->flags &
101 dquot_state_flag(DQUOT_SUSPENDED, type);
102}
103
104static inline int sb_any_quota_suspended(struct super_block *sb)
105{
106 return sb_has_quota_suspended(sb, USRQUOTA) ||
107 sb_has_quota_suspended(sb, GRPQUOTA);
108}
109
110
111static inline int sb_has_quota_loaded(struct super_block *sb, int type)
112{
113
114 return sb_has_quota_usage_enabled(sb, type);
115}
116
117static inline int sb_any_quota_loaded(struct super_block *sb)
118{
119 return sb_has_quota_loaded(sb, USRQUOTA) ||
120 sb_has_quota_loaded(sb, GRPQUOTA);
121}
122
123static inline int sb_has_quota_active(struct super_block *sb, int type)
124{
125 return sb_has_quota_loaded(sb, type) &&
126 !sb_has_quota_suspended(sb, type);
127}
128
129static inline int sb_any_quota_active(struct super_block *sb)
130{
131 return sb_has_quota_active(sb, USRQUOTA) ||
132 sb_has_quota_active(sb, GRPQUOTA);
133}
134
135
136
137
138extern const struct dquot_operations dquot_operations;
139extern const struct quotactl_ops vfs_quotactl_ops;
140
141#define sb_dquot_ops (&dquot_operations)
142#define sb_quotactl_ops (&vfs_quotactl_ops)
143
144
145
146static inline void vfs_dq_init(struct inode *inode)
147{
148 BUG_ON(!inode->i_sb);
149 if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode))
150 inode->i_sb->dq_op->initialize(inode, -1);
151}
152
153
154
155static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
156{
157 if (sb_any_quota_active(inode->i_sb)) {
158
159 if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA)
160 return 1;
161 }
162 else
163 inode_add_bytes(inode, nr);
164 return 0;
165}
166
167static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
168{
169 int ret;
170 if (!(ret = vfs_dq_prealloc_space_nodirty(inode, nr)))
171 mark_inode_dirty(inode);
172 return ret;
173}
174
175static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
176{
177 if (sb_any_quota_active(inode->i_sb)) {
178
179 if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA)
180 return 1;
181 }
182 else
183 inode_add_bytes(inode, nr);
184 return 0;
185}
186
187static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
188{
189 int ret;
190 if (!(ret = vfs_dq_alloc_space_nodirty(inode, nr)))
191 mark_inode_dirty(inode);
192 return ret;
193}
194
195static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
196{
197 if (sb_any_quota_active(inode->i_sb)) {
198
199 if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA)
200 return 1;
201 }
202 return 0;
203}
204
205static inline int vfs_dq_alloc_inode(struct inode *inode)
206{
207 if (sb_any_quota_active(inode->i_sb)) {
208 vfs_dq_init(inode);
209 if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA)
210 return 1;
211 }
212 return 0;
213}
214
215
216
217
218static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
219{
220 if (sb_any_quota_active(inode->i_sb)) {
221 if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA)
222 return 1;
223 } else
224 inode_add_bytes(inode, nr);
225
226 mark_inode_dirty(inode);
227 return 0;
228}
229
230
231
232
233static inline
234void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
235{
236 if (sb_any_quota_active(inode->i_sb))
237 inode->i_sb->dq_op->release_rsv(inode, nr);
238}
239
240static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
241{
242 if (sb_any_quota_active(inode->i_sb))
243 inode->i_sb->dq_op->free_space(inode, nr);
244 else
245 inode_sub_bytes(inode, nr);
246}
247
248static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
249{
250 vfs_dq_free_space_nodirty(inode, nr);
251 mark_inode_dirty(inode);
252}
253
254static inline void vfs_dq_free_inode(struct inode *inode)
255{
256 if (sb_any_quota_active(inode->i_sb))
257 inode->i_sb->dq_op->free_inode(inode, 1);
258}
259
260
261static inline int vfs_dq_off(struct super_block *sb, int remount)
262{
263 int ret = -ENOSYS;
264
265 if (sb->s_qcop && sb->s_qcop->quota_off)
266 ret = sb->s_qcop->quota_off(sb, -1, remount);
267 return ret;
268}
269
270#else
271
272static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
273{
274 return 0;
275}
276
277static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
278{
279 return 0;
280}
281
282static inline int sb_has_quota_suspended(struct super_block *sb, int type)
283{
284 return 0;
285}
286
287static inline int sb_any_quota_suspended(struct super_block *sb)
288{
289 return 0;
290}
291
292
293static inline int sb_has_quota_loaded(struct super_block *sb, int type)
294{
295 return 0;
296}
297
298static inline int sb_any_quota_loaded(struct super_block *sb)
299{
300 return 0;
301}
302
303static inline int sb_has_quota_active(struct super_block *sb, int type)
304{
305 return 0;
306}
307
308static inline int sb_any_quota_active(struct super_block *sb)
309{
310 return 0;
311}
312
313
314
315
316#define sb_dquot_ops (NULL)
317#define sb_quotactl_ops (NULL)
318
319static inline void vfs_dq_init(struct inode *inode)
320{
321}
322
323static inline void vfs_dq_drop(struct inode *inode)
324{
325}
326
327static inline int vfs_dq_alloc_inode(struct inode *inode)
328{
329 return 0;
330}
331
332static inline void vfs_dq_free_inode(struct inode *inode)
333{
334}
335
336static inline void sync_quota_sb(struct super_block *sb, int type)
337{
338}
339
340static inline void writeout_quota_sb(struct super_block *sb, int type)
341{
342}
343
344static inline int vfs_dq_off(struct super_block *sb, int remount)
345{
346 return 0;
347}
348
349static inline int vfs_dq_quota_on_remount(struct super_block *sb)
350{
351 return 0;
352}
353
354static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr)
355{
356 return 0;
357}
358
359static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
360{
361 inode_add_bytes(inode, nr);
362 return 0;
363}
364
365static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
366{
367 vfs_dq_prealloc_space_nodirty(inode, nr);
368 mark_inode_dirty(inode);
369 return 0;
370}
371
372static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
373{
374 inode_add_bytes(inode, nr);
375 return 0;
376}
377
378static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
379{
380 vfs_dq_alloc_space_nodirty(inode, nr);
381 mark_inode_dirty(inode);
382 return 0;
383}
384
385static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
386{
387 return 0;
388}
389
390static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
391{
392 return vfs_dq_alloc_space(inode, nr);
393}
394
395static inline
396int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
397{
398 return 0;
399}
400
401static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
402{
403 inode_sub_bytes(inode, nr);
404}
405
406static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
407{
408 vfs_dq_free_space_nodirty(inode, nr);
409 mark_inode_dirty(inode);
410}
411
412#endif
413
414static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
415{
416 return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits);
417}
418
419static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr)
420{
421 return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits);
422}
423
424static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr)
425{
426 return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits);
427}
428
429static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr)
430{
431 return vfs_dq_alloc_space(inode, nr << inode->i_blkbits);
432}
433
434static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr)
435{
436 return vfs_dq_reserve_space(inode, nr << inode->i_blkbits);
437}
438
439static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr)
440{
441 return vfs_dq_claim_space(inode, nr << inode->i_blkbits);
442}
443
444static inline
445void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr)
446{
447 vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits);
448}
449
450static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr)
451{
452 vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits);
453}
454
455static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr)
456{
457 vfs_dq_free_space(inode, nr << inode->i_blkbits);
458}
459
460#endif
461