]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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> | |
1da177e4 LT |
6 | */ |
7 | #ifndef _LINUX_QUOTAOPS_ | |
8 | #define _LINUX_QUOTAOPS_ | |
9 | ||
1da177e4 LT |
10 | #include <linux/fs.h> |
11 | ||
56246f9a ES |
12 | #define DQUOT_SPACE_WARN 0x1 |
13 | #define DQUOT_SPACE_RESERVE 0x2 | |
0e05842b | 14 | #define DQUOT_SPACE_NOFAIL 0x4 |
56246f9a | 15 | |
03b06343 JK |
16 | static inline struct quota_info *sb_dqopt(struct super_block *sb) |
17 | { | |
18 | return &sb->s_dquot; | |
19 | } | |
74abb989 | 20 | |
12755627 DM |
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) || | |
8e96e3b7 EB |
25 | (ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) || |
26 | (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid)); | |
12755627 DM |
27 | } |
28 | ||
1da177e4 LT |
29 | #if defined(CONFIG_QUOTA) |
30 | ||
fb5ffb0e JZ |
31 | #define quota_error(sb, fmt, args...) \ |
32 | __quota_error((sb), __func__, fmt , ## args) | |
33 | ||
b9075fa9 | 34 | extern __printf(3, 4) |
055adcbd JP |
35 | void __quota_error(struct super_block *sb, const char *func, |
36 | const char *fmt, ...); | |
fb5ffb0e | 37 | |
1da177e4 LT |
38 | /* |
39 | * declaration of quota_function calls in kernel. | |
40 | */ | |
c469070a DM |
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); | |
1c8924eb | 44 | void inode_reclaim_rsv_space(struct inode *inode, qsize_t number); |
c469070a | 45 | |
871a2931 | 46 | void dquot_initialize(struct inode *inode); |
9f754758 | 47 | void dquot_drop(struct inode *inode); |
aca645a6 | 48 | struct dquot *dqget(struct super_block *sb, struct kqid qid); |
3d9ea253 | 49 | void dqput(struct dquot *dquot); |
12c77527 JK |
50 | int dquot_scan_active(struct super_block *sb, |
51 | int (*fn)(struct dquot *dquot, unsigned long priv), | |
52 | unsigned long priv); | |
7d9056ba JK |
53 | struct dquot *dquot_alloc(struct super_block *sb, int type); |
54 | void dquot_destroy(struct dquot *dquot); | |
b85f4b87 | 55 | |
56246f9a ES |
56 | int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); |
57 | void __dquot_free_space(struct inode *inode, qsize_t number, int flags); | |
b85f4b87 | 58 | |
63936dda | 59 | int dquot_alloc_inode(const struct inode *inode); |
740d9dcd | 60 | |
5dd4056d | 61 | int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); |
63936dda | 62 | void dquot_free_inode(const struct inode *inode); |
1c8924eb | 63 | void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number); |
b85f4b87 | 64 | |
0f0dd62f CH |
65 | int dquot_disable(struct super_block *sb, int type, unsigned int flags); |
66 | /* Suspend quotas on remount RO */ | |
67 | static inline int dquot_suspend(struct super_block *sb, int type) | |
68 | { | |
69 | return dquot_disable(sb, type, DQUOT_SUSPENDED); | |
70 | } | |
71 | int dquot_resume(struct super_block *sb, int type); | |
72 | ||
b85f4b87 JK |
73 | int dquot_commit(struct dquot *dquot); |
74 | int dquot_acquire(struct dquot *dquot); | |
75 | int dquot_release(struct dquot *dquot); | |
76 | int dquot_commit_info(struct super_block *sb, int type); | |
77 | int dquot_mark_dquot_dirty(struct dquot *dquot); | |
78 | ||
907f4554 CH |
79 | int dquot_file_open(struct inode *inode, struct file *file); |
80 | ||
287a8095 | 81 | int dquot_enable(struct inode *inode, int type, int format_id, |
f55abc0f | 82 | unsigned int flags); |
f00c9e44 | 83 | int dquot_quota_on(struct super_block *sb, int type, int format_id, |
77e69dac | 84 | struct path *path); |
287a8095 | 85 | int dquot_quota_on_mount(struct super_block *sb, char *qf_name, |
b85f4b87 | 86 | int format_id, int type); |
287a8095 | 87 | int dquot_quota_off(struct super_block *sb, int type); |
ceed1723 JK |
88 | int dquot_writeback_dquots(struct super_block *sb, int type); |
89 | int dquot_quota_sync(struct super_block *sb, int type); | |
287a8095 CH |
90 | int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); |
91 | int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); | |
74a8a103 | 92 | int dquot_get_dqblk(struct super_block *sb, struct kqid id, |
b9b2dd36 | 93 | struct fs_disk_quota *di); |
74a8a103 | 94 | int dquot_set_dqblk(struct super_block *sb, struct kqid id, |
c472b432 | 95 | struct fs_disk_quota *di); |
b85f4b87 | 96 | |
bc8e5f07 | 97 | int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); |
b43fa828 | 98 | int dquot_transfer(struct inode *inode, struct iattr *iattr); |
1da177e4 | 99 | |
03b06343 JK |
100 | static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) |
101 | { | |
102 | return sb_dqopt(sb)->info + type; | |
103 | } | |
74abb989 JK |
104 | |
105 | /* | |
106 | * Functions for checking status of quota | |
107 | */ | |
108 | ||
ad1e6e8d | 109 | static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type) |
03b06343 | 110 | { |
f55abc0f JK |
111 | return sb_dqopt(sb)->flags & |
112 | dquot_state_flag(DQUOT_USAGE_ENABLED, type); | |
03b06343 | 113 | } |
74abb989 | 114 | |
ad1e6e8d | 115 | static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type) |
03b06343 | 116 | { |
f55abc0f JK |
117 | return sb_dqopt(sb)->flags & |
118 | dquot_state_flag(DQUOT_LIMITS_ENABLED, type); | |
03b06343 | 119 | } |
74abb989 | 120 | |
ad1e6e8d | 121 | static inline bool sb_has_quota_suspended(struct super_block *sb, int type) |
03b06343 | 122 | { |
f55abc0f JK |
123 | return sb_dqopt(sb)->flags & |
124 | dquot_state_flag(DQUOT_SUSPENDED, type); | |
03b06343 | 125 | } |
74abb989 | 126 | |
ad1e6e8d | 127 | static inline unsigned sb_any_quota_suspended(struct super_block *sb) |
03b06343 | 128 | { |
ad1e6e8d DM |
129 | unsigned type, tmsk = 0; |
130 | for (type = 0; type < MAXQUOTAS; type++) | |
131 | tmsk |= sb_has_quota_suspended(sb, type) << type; | |
132 | return tmsk; | |
03b06343 | 133 | } |
74abb989 | 134 | |
f55abc0f | 135 | /* Does kernel know about any quota information for given sb + type? */ |
ad1e6e8d | 136 | static inline bool sb_has_quota_loaded(struct super_block *sb, int type) |
f55abc0f JK |
137 | { |
138 | /* Currently if anything is on, then quota usage is on as well */ | |
139 | return sb_has_quota_usage_enabled(sb, type); | |
140 | } | |
141 | ||
ad1e6e8d | 142 | static inline unsigned sb_any_quota_loaded(struct super_block *sb) |
f55abc0f | 143 | { |
ad1e6e8d DM |
144 | unsigned type, tmsk = 0; |
145 | for (type = 0; type < MAXQUOTAS; type++) | |
146 | tmsk |= sb_has_quota_loaded(sb, type) << type; | |
147 | return tmsk; | |
f55abc0f JK |
148 | } |
149 | ||
ad1e6e8d | 150 | static inline bool sb_has_quota_active(struct super_block *sb, int type) |
f55abc0f JK |
151 | { |
152 | return sb_has_quota_loaded(sb, type) && | |
153 | !sb_has_quota_suspended(sb, type); | |
154 | } | |
155 | ||
1da177e4 LT |
156 | /* |
157 | * Operations supported for diskquotas. | |
158 | */ | |
61e225dc | 159 | extern const struct dquot_operations dquot_operations; |
287a8095 | 160 | extern const struct quotactl_ops dquot_quotactl_ops; |
0ff5af83 | 161 | |
1da177e4 LT |
162 | #else |
163 | ||
f55abc0f | 164 | static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) |
03b06343 JK |
165 | { |
166 | return 0; | |
167 | } | |
168 | ||
f55abc0f | 169 | static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) |
03b06343 JK |
170 | { |
171 | return 0; | |
172 | } | |
173 | ||
174 | static inline int sb_has_quota_suspended(struct super_block *sb, int type) | |
175 | { | |
176 | return 0; | |
177 | } | |
178 | ||
179 | static inline int sb_any_quota_suspended(struct super_block *sb) | |
180 | { | |
181 | return 0; | |
182 | } | |
74abb989 | 183 | |
f55abc0f JK |
184 | /* Does kernel know about any quota information for given sb + type? */ |
185 | static inline int sb_has_quota_loaded(struct super_block *sb, int type) | |
186 | { | |
187 | return 0; | |
188 | } | |
189 | ||
190 | static inline int sb_any_quota_loaded(struct super_block *sb) | |
191 | { | |
192 | return 0; | |
193 | } | |
194 | ||
195 | static inline int sb_has_quota_active(struct super_block *sb, int type) | |
196 | { | |
197 | return 0; | |
198 | } | |
199 | ||
871a2931 | 200 | static inline void dquot_initialize(struct inode *inode) |
50f8c370 AM |
201 | { |
202 | } | |
203 | ||
9f754758 | 204 | static inline void dquot_drop(struct inode *inode) |
50f8c370 AM |
205 | { |
206 | } | |
207 | ||
63936dda | 208 | static inline int dquot_alloc_inode(const struct inode *inode) |
50f8c370 AM |
209 | { |
210 | return 0; | |
211 | } | |
212 | ||
63936dda | 213 | static inline void dquot_free_inode(const struct inode *inode) |
50f8c370 AM |
214 | { |
215 | } | |
216 | ||
b43fa828 | 217 | static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) |
50f8c370 AM |
218 | { |
219 | return 0; | |
220 | } | |
221 | ||
5dd4056d | 222 | static inline int __dquot_alloc_space(struct inode *inode, qsize_t number, |
56246f9a | 223 | int flags) |
1da177e4 | 224 | { |
56246f9a | 225 | if (!(flags & DQUOT_SPACE_RESERVE)) |
5dd4056d | 226 | inode_add_bytes(inode, number); |
1da177e4 LT |
227 | return 0; |
228 | } | |
229 | ||
5dd4056d | 230 | static inline void __dquot_free_space(struct inode *inode, qsize_t number, |
56246f9a | 231 | int flags) |
1da177e4 | 232 | { |
56246f9a | 233 | if (!(flags & DQUOT_SPACE_RESERVE)) |
5dd4056d | 234 | inode_sub_bytes(inode, number); |
1da177e4 LT |
235 | } |
236 | ||
5dd4056d | 237 | static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) |
1da177e4 | 238 | { |
5dd4056d | 239 | inode_add_bytes(inode, number); |
1da177e4 LT |
240 | return 0; |
241 | } | |
242 | ||
1c8924eb JK |
243 | static inline int dquot_reclaim_space_nodirty(struct inode *inode, |
244 | qsize_t number) | |
245 | { | |
246 | inode_sub_bytes(inode, number); | |
247 | return 0; | |
248 | } | |
249 | ||
0f0dd62f CH |
250 | static inline int dquot_disable(struct super_block *sb, int type, |
251 | unsigned int flags) | |
252 | { | |
253 | return 0; | |
254 | } | |
255 | ||
256 | static inline int dquot_suspend(struct super_block *sb, int type) | |
257 | { | |
258 | return 0; | |
259 | } | |
260 | ||
261 | static inline int dquot_resume(struct super_block *sb, int type) | |
262 | { | |
263 | return 0; | |
1da177e4 LT |
264 | } |
265 | ||
871a2931 CH |
266 | #define dquot_file_open generic_file_open |
267 | ||
ceed1723 JK |
268 | static inline int dquot_writeback_dquots(struct super_block *sb, int type) |
269 | { | |
270 | return 0; | |
271 | } | |
272 | ||
5dd4056d CH |
273 | #endif /* CONFIG_QUOTA */ |
274 | ||
275 | static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) | |
1da177e4 | 276 | { |
56246f9a | 277 | return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN); |
1da177e4 LT |
278 | } |
279 | ||
0e05842b ES |
280 | static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) |
281 | { | |
282 | __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); | |
43d2932d | 283 | mark_inode_dirty_sync(inode); |
1da177e4 LT |
284 | } |
285 | ||
5dd4056d | 286 | static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) |
f18df228 | 287 | { |
5dd4056d CH |
288 | int ret; |
289 | ||
290 | ret = dquot_alloc_space_nodirty(inode, nr); | |
d530148a SL |
291 | if (!ret) { |
292 | /* | |
293 | * Mark inode fully dirty. Since we are allocating blocks, inode | |
294 | * would become fully dirty soon anyway and it reportedly | |
250df6ed | 295 | * reduces lock contention. |
d530148a SL |
296 | */ |
297 | mark_inode_dirty(inode); | |
298 | } | |
5dd4056d | 299 | return ret; |
f18df228 MC |
300 | } |
301 | ||
5dd4056d | 302 | static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr) |
740d9dcd | 303 | { |
5dd4056d | 304 | return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits); |
740d9dcd MC |
305 | } |
306 | ||
0e05842b ES |
307 | static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr) |
308 | { | |
309 | dquot_alloc_space_nofail(inode, nr << inode->i_blkbits); | |
310 | } | |
311 | ||
5dd4056d | 312 | static inline int dquot_alloc_block(struct inode *inode, qsize_t nr) |
740d9dcd | 313 | { |
5dd4056d | 314 | return dquot_alloc_space(inode, nr << inode->i_blkbits); |
740d9dcd MC |
315 | } |
316 | ||
5dd4056d | 317 | static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr) |
1da177e4 | 318 | { |
56246f9a | 319 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0); |
1da177e4 LT |
320 | } |
321 | ||
5dd4056d | 322 | static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) |
1da177e4 | 323 | { |
5dd4056d | 324 | int ret; |
1da177e4 | 325 | |
5dd4056d CH |
326 | ret = dquot_prealloc_block_nodirty(inode, nr); |
327 | if (!ret) | |
43d2932d | 328 | mark_inode_dirty_sync(inode); |
5dd4056d | 329 | return ret; |
03f6e92b JK |
330 | } |
331 | ||
5dd4056d | 332 | static inline int dquot_reserve_block(struct inode *inode, qsize_t nr) |
03f6e92b | 333 | { |
56246f9a ES |
334 | return __dquot_alloc_space(inode, nr << inode->i_blkbits, |
335 | DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE); | |
03f6e92b JK |
336 | } |
337 | ||
5dd4056d | 338 | static inline int dquot_claim_block(struct inode *inode, qsize_t nr) |
03f6e92b | 339 | { |
5dd4056d | 340 | int ret; |
03f6e92b | 341 | |
5dd4056d CH |
342 | ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); |
343 | if (!ret) | |
43d2932d | 344 | mark_inode_dirty_sync(inode); |
5dd4056d | 345 | return ret; |
03f6e92b JK |
346 | } |
347 | ||
1c8924eb JK |
348 | static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr) |
349 | { | |
350 | dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits); | |
351 | mark_inode_dirty_sync(inode); | |
352 | } | |
353 | ||
5dd4056d | 354 | static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr) |
f18df228 | 355 | { |
5dd4056d | 356 | __dquot_free_space(inode, nr, 0); |
f18df228 MC |
357 | } |
358 | ||
5dd4056d | 359 | static inline void dquot_free_space(struct inode *inode, qsize_t nr) |
740d9dcd | 360 | { |
5dd4056d | 361 | dquot_free_space_nodirty(inode, nr); |
43d2932d | 362 | mark_inode_dirty_sync(inode); |
740d9dcd MC |
363 | } |
364 | ||
5dd4056d | 365 | static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr) |
740d9dcd | 366 | { |
5dd4056d | 367 | dquot_free_space_nodirty(inode, nr << inode->i_blkbits); |
740d9dcd MC |
368 | } |
369 | ||
5dd4056d | 370 | static inline void dquot_free_block(struct inode *inode, qsize_t nr) |
03f6e92b | 371 | { |
5dd4056d | 372 | dquot_free_space(inode, nr << inode->i_blkbits); |
03f6e92b JK |
373 | } |
374 | ||
5dd4056d CH |
375 | static inline void dquot_release_reservation_block(struct inode *inode, |
376 | qsize_t nr) | |
03f6e92b | 377 | { |
56246f9a | 378 | __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); |
03f6e92b | 379 | } |
1da177e4 LT |
380 | |
381 | #endif /* _LINUX_QUOTAOPS_ */ |