blob: aa36793b48bd11b80b4b33765c7b7d074a899e7f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 */
7#ifndef _LINUX_QUOTAOPS_
8#define _LINUX_QUOTAOPS_
9
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include <linux/fs.h>
11
Eric Sandeen56246f92010-05-16 09:00:00 -040012#define DQUOT_SPACE_WARN 0x1
13#define DQUOT_SPACE_RESERVE 0x2
Eric Sandeen0e058422010-05-16 10:00:00 -040014#define DQUOT_SPACE_NOFAIL 0x4
Eric Sandeen56246f92010-05-16 09:00:00 -040015
Jan Kara03b06342008-07-25 01:46:52 -070016static inline struct quota_info *sb_dqopt(struct super_block *sb)
17{
18 return &sb->s_dquot;
19}
Jan Kara74abb982008-07-25 01:46:51 -070020
Dmitry Monakhov12755622010-04-08 22:04:20 +040021/* i_mutex must being held */
22static 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#if defined(CONFIG_QUOTA)
30
31/*
32 * declaration of quota_function calls in kernel.
33 */
Dmitry Monakhovc4690702010-02-09 17:53:36 +010034void inode_add_rsv_space(struct inode *inode, qsize_t number);
35void inode_claim_rsv_space(struct inode *inode, qsize_t number);
36void inode_sub_rsv_space(struct inode *inode, qsize_t number);
37
Christoph Hellwig871a2932010-03-03 09:05:07 -050038void dquot_initialize(struct inode *inode);
Christoph Hellwig9f754752010-03-03 09:05:05 -050039void dquot_drop(struct inode *inode);
Jan Kara3d9ea252008-10-10 16:12:23 +020040struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
41void dqput(struct dquot *dquot);
Jan Kara12c77522008-10-20 17:05:00 +020042int dquot_scan_active(struct super_block *sb,
43 int (*fn)(struct dquot *dquot, unsigned long priv),
44 unsigned long priv);
Jan Kara7d9056b2008-11-25 15:31:32 +010045struct dquot *dquot_alloc(struct super_block *sb, int type);
46void dquot_destroy(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Eric Sandeen56246f92010-05-16 09:00:00 -040048int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
49void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
Christoph Hellwig5dd40562010-03-03 09:05:00 -050050
Christoph Hellwig63936dd2010-03-03 09:05:01 -050051int dquot_alloc_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Christoph Hellwig5dd40562010-03-03 09:05:00 -050053int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
Christoph Hellwig63936dd2010-03-03 09:05:01 -050054void dquot_free_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055
Christoph Hellwig0f0dd622010-05-19 07:16:41 -040056int dquot_disable(struct super_block *sb, int type, unsigned int flags);
57/* Suspend quotas on remount RO */
58static inline int dquot_suspend(struct super_block *sb, int type)
59{
60 return dquot_disable(sb, type, DQUOT_SUSPENDED);
61}
62int dquot_resume(struct super_block *sb, int type);
63
Jan Karab85f4b82008-07-25 01:46:50 -070064int dquot_commit(struct dquot *dquot);
65int dquot_acquire(struct dquot *dquot);
66int dquot_release(struct dquot *dquot);
67int dquot_commit_info(struct super_block *sb, int type);
68int dquot_mark_dquot_dirty(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070069
Christoph Hellwig907f4552010-03-03 09:05:06 -050070int dquot_file_open(struct inode *inode, struct file *file);
71
Christoph Hellwig287a8092010-05-19 07:16:45 -040072int dquot_quota_on(struct super_block *sb, int type, int format_id,
Christoph Hellwig307ae182010-05-19 07:16:43 -040073 char *path);
Christoph Hellwig287a8092010-05-19 07:16:45 -040074int dquot_enable(struct inode *inode, int type, int format_id,
Jan Karaf55abc02008-08-20 17:50:32 +020075 unsigned int flags);
Christoph Hellwig287a8092010-05-19 07:16:45 -040076int dquot_quota_on_path(struct super_block *sb, int type, int format_id,
Al Viro77e69da2008-08-01 04:29:18 -040077 struct path *path);
Christoph Hellwig287a8092010-05-19 07:16:45 -040078int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
Jan Karab85f4b82008-07-25 01:46:50 -070079 int format_id, int type);
Christoph Hellwig287a8092010-05-19 07:16:45 -040080int dquot_quota_off(struct super_block *sb, int type);
81int dquot_quota_sync(struct super_block *sb, int type, int wait);
82int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
83int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
84int dquot_get_dqblk(struct super_block *sb, int type, qid_t id,
Christoph Hellwigb9b2dd32010-05-06 17:04:58 -040085 struct fs_disk_quota *di);
Christoph Hellwig287a8092010-05-19 07:16:45 -040086int dquot_set_dqblk(struct super_block *sb, int type, qid_t id,
Christoph Hellwigc472b432010-05-06 17:05:17 -040087 struct fs_disk_quota *di);
Jan Karab85f4b82008-07-25 01:46:50 -070088
Jan Karabc8e5f02010-05-13 19:58:50 +020089int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
Christoph Hellwigb43fa822010-03-03 09:05:03 -050090int dquot_transfer(struct inode *inode, struct iattr *iattr);
Linus Torvalds1da177e2005-04-16 15:20:36 -070091
Jan Kara03b06342008-07-25 01:46:52 -070092static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
93{
94 return sb_dqopt(sb)->info + type;
95}
Jan Kara74abb982008-07-25 01:46:51 -070096
97/*
98 * Functions for checking status of quota
99 */
100
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300101static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700102{
Jan Karaf55abc02008-08-20 17:50:32 +0200103 return sb_dqopt(sb)->flags &
104 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -0700105}
Jan Kara74abb982008-07-25 01:46:51 -0700106
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300107static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700108{
Jan Karaf55abc02008-08-20 17:50:32 +0200109 return sb_dqopt(sb)->flags &
110 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -0700111}
Jan Kara74abb982008-07-25 01:46:51 -0700112
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300113static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700114{
Jan Karaf55abc02008-08-20 17:50:32 +0200115 return sb_dqopt(sb)->flags &
116 dquot_state_flag(DQUOT_SUSPENDED, type);
Jan Kara03b06342008-07-25 01:46:52 -0700117}
Jan Kara74abb982008-07-25 01:46:51 -0700118
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300119static inline unsigned sb_any_quota_suspended(struct super_block *sb)
Jan Kara03b06342008-07-25 01:46:52 -0700120{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300121 unsigned type, tmsk = 0;
122 for (type = 0; type < MAXQUOTAS; type++)
123 tmsk |= sb_has_quota_suspended(sb, type) << type;
124 return tmsk;
Jan Kara03b06342008-07-25 01:46:52 -0700125}
Jan Kara74abb982008-07-25 01:46:51 -0700126
Jan Karaf55abc02008-08-20 17:50:32 +0200127/* Does kernel know about any quota information for given sb + type? */
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300128static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200129{
130 /* Currently if anything is on, then quota usage is on as well */
131 return sb_has_quota_usage_enabled(sb, type);
132}
133
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300134static inline unsigned sb_any_quota_loaded(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200135{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300136 unsigned type, tmsk = 0;
137 for (type = 0; type < MAXQUOTAS; type++)
138 tmsk |= sb_has_quota_loaded(sb, type) << type;
139 return tmsk;
Jan Karaf55abc02008-08-20 17:50:32 +0200140}
141
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300142static inline bool sb_has_quota_active(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200143{
144 return sb_has_quota_loaded(sb, type) &&
145 !sb_has_quota_suspended(sb, type);
146}
147
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300148static inline unsigned sb_any_quota_active(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200149{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300150 return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
Jan Karaf55abc02008-08-20 17:50:32 +0200151}
152
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153/*
154 * Operations supported for diskquotas.
155 */
Alexey Dobriyan61e225d2009-09-21 17:01:08 -0700156extern const struct dquot_operations dquot_operations;
Christoph Hellwig287a8092010-05-19 07:16:45 -0400157extern const struct quotactl_ops dquot_quotactl_ops;
Jan Kara0ff5af82008-04-28 02:14:33 -0700158
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159#else
160
Jan Karaf55abc02008-08-20 17:50:32 +0200161static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700162{
163 return 0;
164}
165
Jan Karaf55abc02008-08-20 17:50:32 +0200166static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700167{
168 return 0;
169}
170
171static inline int sb_has_quota_suspended(struct super_block *sb, int type)
172{
173 return 0;
174}
175
176static inline int sb_any_quota_suspended(struct super_block *sb)
177{
178 return 0;
179}
Jan Kara74abb982008-07-25 01:46:51 -0700180
Jan Karaf55abc02008-08-20 17:50:32 +0200181/* Does kernel know about any quota information for given sb + type? */
182static inline int sb_has_quota_loaded(struct super_block *sb, int type)
183{
184 return 0;
185}
186
187static inline int sb_any_quota_loaded(struct super_block *sb)
188{
189 return 0;
190}
191
192static inline int sb_has_quota_active(struct super_block *sb, int type)
193{
194 return 0;
195}
196
197static inline int sb_any_quota_active(struct super_block *sb)
198{
199 return 0;
200}
201
Christoph Hellwig871a2932010-03-03 09:05:07 -0500202static inline void dquot_initialize(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700203{
204}
205
Christoph Hellwig9f754752010-03-03 09:05:05 -0500206static inline void dquot_drop(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700207{
208}
209
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500210static inline int dquot_alloc_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700211{
212 return 0;
213}
214
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500215static inline void dquot_free_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700216{
217}
218
Christoph Hellwigb43fa822010-03-03 09:05:03 -0500219static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
Andrew Morton50f8c372008-04-28 02:14:35 -0700220{
221 return 0;
222}
223
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500224static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
Eric Sandeen56246f92010-05-16 09:00:00 -0400225 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226{
Eric Sandeen56246f92010-05-16 09:00:00 -0400227 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500228 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 return 0;
230}
231
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500232static inline void __dquot_free_space(struct inode *inode, qsize_t number,
Eric Sandeen56246f92010-05-16 09:00:00 -0400233 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234{
Eric Sandeen56246f92010-05-16 09:00:00 -0400235 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500236 inode_sub_bytes(inode, number);
237}
238
239static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
240{
241 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 return 0;
243}
244
Christoph Hellwig0f0dd622010-05-19 07:16:41 -0400245static inline int dquot_disable(struct super_block *sb, int type,
246 unsigned int flags)
247{
248 return 0;
249}
250
251static inline int dquot_suspend(struct super_block *sb, int type)
252{
253 return 0;
254}
255
256static inline int dquot_resume(struct super_block *sb, int type)
257{
258 return 0;
259}
260
Christoph Hellwig871a2932010-03-03 09:05:07 -0500261#define dquot_file_open generic_file_open
262
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263#endif /* CONFIG_QUOTA */
264
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500265static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700266{
Eric Sandeen56246f92010-05-16 09:00:00 -0400267 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
Jan Kara03f6e922008-04-28 02:14:32 -0700268}
269
Eric Sandeen0e058422010-05-16 10:00:00 -0400270static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
271{
272 __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
273 mark_inode_dirty(inode);
Jan Kara03f6e922008-04-28 02:14:32 -0700274}
275
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500276static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700277{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500278 int ret;
279
280 ret = dquot_alloc_space_nodirty(inode, nr);
281 if (!ret)
282 mark_inode_dirty(inode);
283 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700284}
285
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500286static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700287{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500288 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700289}
290
Eric Sandeen0e058422010-05-16 10:00:00 -0400291static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
292{
293 dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
294}
295
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500296static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700297{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500298 return dquot_alloc_space(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700299}
300
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500301static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
Mingming Caof18df222009-01-13 16:43:09 +0100302{
Eric Sandeen56246f92010-05-16 09:00:00 -0400303 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
Mingming Caof18df222009-01-13 16:43:09 +0100304}
305
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500306static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100307{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500308 int ret;
309
310 ret = dquot_prealloc_block_nodirty(inode, nr);
311 if (!ret)
312 mark_inode_dirty(inode);
313 return ret;
Mingming Cao740d9dc2009-01-13 16:43:14 +0100314}
315
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500316static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100317{
Eric Sandeen56246f92010-05-16 09:00:00 -0400318 return __dquot_alloc_space(inode, nr << inode->i_blkbits,
319 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100320}
321
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500322static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700323{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500324 int ret;
325
326 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
327 if (!ret)
328 mark_inode_dirty(inode);
329 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700330}
331
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500332static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700333{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500334 __dquot_free_space(inode, nr, 0);
335}
336
337static inline void dquot_free_space(struct inode *inode, qsize_t nr)
338{
339 dquot_free_space_nodirty(inode, nr);
340 mark_inode_dirty(inode);
341}
342
343static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
344{
345 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
346}
347
348static inline void dquot_free_block(struct inode *inode, qsize_t nr)
349{
350 dquot_free_space(inode, nr << inode->i_blkbits);
351}
352
353static inline void dquot_release_reservation_block(struct inode *inode,
354 qsize_t nr)
355{
Eric Sandeen56246f92010-05-16 09:00:00 -0400356 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
Jan Kara03f6e922008-04-28 02:14:32 -0700357}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359#endif /* _LINUX_QUOTAOPS_ */