xen: p2m: correctly initialize partial p2m leaf
[pandora-kernel.git] / include / linux / quotaops.h
1 /*
2  * Definitions for diskquota-operations. When diskquota is configured these
3  * macros expand to the right source-code.
4  *
5  * Author:  Marco van Wieringen <mvw@planets.elm.net>
6  */
7 #ifndef _LINUX_QUOTAOPS_
8 #define _LINUX_QUOTAOPS_
9
10 #include <linux/fs.h>
11
12 #define DQUOT_SPACE_WARN        0x1
13 #define DQUOT_SPACE_RESERVE     0x2
14 #define DQUOT_SPACE_NOFAIL      0x4
15
16 static inline struct quota_info *sb_dqopt(struct super_block *sb)
17 {
18         return &sb->s_dquot;
19 }
20
21 /* i_mutex must being held */
22 static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
23 {
24         return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) ||
25                 (ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) ||
26                 (ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid);
27 }
28
29 #if defined(CONFIG_QUOTA)
30
31 #define quota_error(sb, fmt, args...) \
32         __quota_error((sb), __func__, fmt , ## args)
33
34 extern __attribute__((format (printf, 3, 4)))
35 void __quota_error(struct super_block *sb, const char *func,
36                    const char *fmt, ...);
37
38 /*
39  * declaration of quota_function calls in kernel.
40  */
41 void inode_add_rsv_space(struct inode *inode, qsize_t number);
42 void inode_claim_rsv_space(struct inode *inode, qsize_t number);
43 void inode_sub_rsv_space(struct inode *inode, qsize_t number);
44
45 void dquot_initialize(struct inode *inode);
46 void dquot_drop(struct inode *inode);
47 struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
48 void dqput(struct dquot *dquot);
49 int dquot_scan_active(struct super_block *sb,
50                       int (*fn)(struct dquot *dquot, unsigned long priv),
51                       unsigned long priv);
52 struct dquot *dquot_alloc(struct super_block *sb, int type);
53 void dquot_destroy(struct dquot *dquot);
54
55 int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
56 void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
57
58 int dquot_alloc_inode(const struct inode *inode);
59
60 int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
61 void dquot_free_inode(const struct inode *inode);
62
63 int dquot_disable(struct super_block *sb, int type, unsigned int flags);
64 /* Suspend quotas on remount RO */
65 static inline int dquot_suspend(struct super_block *sb, int type)
66 {
67         return dquot_disable(sb, type, DQUOT_SUSPENDED);
68 }
69 int dquot_resume(struct super_block *sb, int type);
70
71 int dquot_commit(struct dquot *dquot);
72 int dquot_acquire(struct dquot *dquot);
73 int dquot_release(struct dquot *dquot);
74 int dquot_commit_info(struct super_block *sb, int type);
75 int dquot_mark_dquot_dirty(struct dquot *dquot);
76
77 int dquot_file_open(struct inode *inode, struct file *file);
78
79 int dquot_quota_on(struct super_block *sb, int type, int format_id,
80         char *path);
81 int dquot_enable(struct inode *inode, int type, int format_id,
82         unsigned int flags);
83 int dquot_quota_on_path(struct super_block *sb, int type, int format_id,
84         struct path *path);
85 int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
86         int format_id, int type);
87 int dquot_quota_off(struct super_block *sb, int type);
88 int dquot_quota_sync(struct super_block *sb, int type, int wait);
89 int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
90 int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
91 int dquot_get_dqblk(struct super_block *sb, int type, qid_t id,
92                 struct fs_disk_quota *di);
93 int dquot_set_dqblk(struct super_block *sb, int type, qid_t id,
94                 struct fs_disk_quota *di);
95
96 int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
97 int dquot_transfer(struct inode *inode, struct iattr *iattr);
98
99 static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
100 {
101         return sb_dqopt(sb)->info + type;
102 }
103
104 /*
105  * Functions for checking status of quota
106  */
107
108 static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
109 {
110         return sb_dqopt(sb)->flags &
111                                 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
112 }
113
114 static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
115 {
116         return sb_dqopt(sb)->flags &
117                                 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
118 }
119
120 static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
121 {
122         return sb_dqopt(sb)->flags &
123                                 dquot_state_flag(DQUOT_SUSPENDED, type);
124 }
125
126 static inline unsigned sb_any_quota_suspended(struct super_block *sb)
127 {
128         unsigned type, tmsk = 0;
129         for (type = 0; type < MAXQUOTAS; type++)
130                 tmsk |= sb_has_quota_suspended(sb, type) << type;
131         return tmsk;
132 }
133
134 /* Does kernel know about any quota information for given sb + type? */
135 static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
136 {
137         /* Currently if anything is on, then quota usage is on as well */
138         return sb_has_quota_usage_enabled(sb, type);
139 }
140
141 static inline unsigned sb_any_quota_loaded(struct super_block *sb)
142 {
143         unsigned type, tmsk = 0;
144         for (type = 0; type < MAXQUOTAS; type++)
145                 tmsk |= sb_has_quota_loaded(sb, type) << type;
146         return  tmsk;
147 }
148
149 static inline bool sb_has_quota_active(struct super_block *sb, int type)
150 {
151         return sb_has_quota_loaded(sb, type) &&
152                !sb_has_quota_suspended(sb, type);
153 }
154
155 /*
156  * Operations supported for diskquotas.
157  */
158 extern const struct dquot_operations dquot_operations;
159 extern const struct quotactl_ops dquot_quotactl_ops;
160
161 #else
162
163 static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
164 {
165         return 0;
166 }
167
168 static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
169 {
170         return 0;
171 }
172
173 static inline int sb_has_quota_suspended(struct super_block *sb, int type)
174 {
175         return 0;
176 }
177
178 static inline int sb_any_quota_suspended(struct super_block *sb)
179 {
180         return 0;
181 }
182
183 /* Does kernel know about any quota information for given sb + type? */
184 static inline int sb_has_quota_loaded(struct super_block *sb, int type)
185 {
186         return 0;
187 }
188
189 static inline int sb_any_quota_loaded(struct super_block *sb)
190 {
191         return 0;
192 }
193
194 static inline int sb_has_quota_active(struct super_block *sb, int type)
195 {
196         return 0;
197 }
198
199 static inline void dquot_initialize(struct inode *inode)
200 {
201 }
202
203 static inline void dquot_drop(struct inode *inode)
204 {
205 }
206
207 static inline int dquot_alloc_inode(const struct inode *inode)
208 {
209         return 0;
210 }
211
212 static inline void dquot_free_inode(const struct inode *inode)
213 {
214 }
215
216 static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
217 {
218         return 0;
219 }
220
221 static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
222                 int flags)
223 {
224         if (!(flags & DQUOT_SPACE_RESERVE))
225                 inode_add_bytes(inode, number);
226         return 0;
227 }
228
229 static inline void __dquot_free_space(struct inode *inode, qsize_t number,
230                 int flags)
231 {
232         if (!(flags & DQUOT_SPACE_RESERVE))
233                 inode_sub_bytes(inode, number);
234 }
235
236 static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
237 {
238         inode_add_bytes(inode, number);
239         return 0;
240 }
241
242 static inline int dquot_disable(struct super_block *sb, int type,
243                 unsigned int flags)
244 {
245         return 0;
246 }
247
248 static inline int dquot_suspend(struct super_block *sb, int type)
249 {
250         return 0;
251 }
252
253 static inline int dquot_resume(struct super_block *sb, int type)
254 {
255         return 0;
256 }
257
258 #define dquot_file_open         generic_file_open
259
260 #endif /* CONFIG_QUOTA */
261
262 static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
263 {
264         return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
265 }
266
267 static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
268 {
269         __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
270         mark_inode_dirty_sync(inode);
271 }
272
273 static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
274 {
275         int ret;
276
277         ret = dquot_alloc_space_nodirty(inode, nr);
278         if (!ret) {
279                 /*
280                  * Mark inode fully dirty. Since we are allocating blocks, inode
281                  * would become fully dirty soon anyway and it reportedly
282                  * reduces inode_lock contention.
283                  */
284                 mark_inode_dirty(inode);
285         }
286         return ret;
287 }
288
289 static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
290 {
291         return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
292 }
293
294 static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
295 {
296         dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
297 }
298
299 static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
300 {
301         return dquot_alloc_space(inode, nr << inode->i_blkbits);
302 }
303
304 static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
305 {
306         return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
307 }
308
309 static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
310 {
311         int ret;
312
313         ret = dquot_prealloc_block_nodirty(inode, nr);
314         if (!ret)
315                 mark_inode_dirty_sync(inode);
316         return ret;
317 }
318
319 static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
320 {
321         return __dquot_alloc_space(inode, nr << inode->i_blkbits,
322                                 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
323 }
324
325 static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
326 {
327         int ret;
328
329         ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
330         if (!ret)
331                 mark_inode_dirty_sync(inode);
332         return ret;
333 }
334
335 static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
336 {
337         __dquot_free_space(inode, nr, 0);
338 }
339
340 static inline void dquot_free_space(struct inode *inode, qsize_t nr)
341 {
342         dquot_free_space_nodirty(inode, nr);
343         mark_inode_dirty_sync(inode);
344 }
345
346 static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
347 {
348         dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
349 }
350
351 static inline void dquot_free_block(struct inode *inode, qsize_t nr)
352 {
353         dquot_free_space(inode, nr << inode->i_blkbits);
354 }
355
356 static inline void dquot_release_reservation_block(struct inode *inode,
357                 qsize_t nr)
358 {
359         __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
360 }
361
362 #endif /* _LINUX_QUOTAOPS_ */