blob: a5ebd1abccd8d9b068682fd25fe0419e5cf05e19 [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
Jan Kara03b06342008-07-25 01:46:52 -070012static inline struct quota_info *sb_dqopt(struct super_block *sb)
13{
14 return &sb->s_dquot;
15}
Jan Kara74abb982008-07-25 01:46:51 -070016
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#if defined(CONFIG_QUOTA)
18
19/*
20 * declaration of quota_function calls in kernel.
21 */
Dmitry Monakhovc4690702010-02-09 17:53:36 +010022void inode_add_rsv_space(struct inode *inode, qsize_t number);
23void inode_claim_rsv_space(struct inode *inode, qsize_t number);
24void inode_sub_rsv_space(struct inode *inode, qsize_t number);
25
Jan Karab85f4b82008-07-25 01:46:50 -070026int dquot_initialize(struct inode *inode, int type);
Christoph Hellwig9f754752010-03-03 09:05:05 -050027void dquot_drop(struct inode *inode);
Jan Kara3d9ea252008-10-10 16:12:23 +020028struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
29void dqput(struct dquot *dquot);
Jan Kara12c77522008-10-20 17:05:00 +020030int dquot_scan_active(struct super_block *sb,
31 int (*fn)(struct dquot *dquot, unsigned long priv),
32 unsigned long priv);
Jan Kara7d9056b2008-11-25 15:31:32 +010033struct dquot *dquot_alloc(struct super_block *sb, int type);
34void dquot_destroy(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
Christoph Hellwig5dd40562010-03-03 09:05:00 -050036int __dquot_alloc_space(struct inode *inode, qsize_t number,
37 int warn, int reserve);
38void __dquot_free_space(struct inode *inode, qsize_t number, int reserve);
39
Christoph Hellwig63936dd2010-03-03 09:05:01 -050040int dquot_alloc_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070041
Christoph Hellwig5dd40562010-03-03 09:05:00 -050042int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
Christoph Hellwig63936dd2010-03-03 09:05:01 -050043void dquot_free_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Jan Karab85f4b82008-07-25 01:46:50 -070045int dquot_commit(struct dquot *dquot);
46int dquot_acquire(struct dquot *dquot);
47int dquot_release(struct dquot *dquot);
48int dquot_commit_info(struct super_block *sb, int type);
49int dquot_mark_dquot_dirty(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070050
Jan Karab85f4b82008-07-25 01:46:50 -070051int vfs_quota_on(struct super_block *sb, int type, int format_id,
52 char *path, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020053int vfs_quota_enable(struct inode *inode, int type, int format_id,
54 unsigned int flags);
Al Viro77e69da2008-08-01 04:29:18 -040055int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
56 struct path *path);
Jan Karab85f4b82008-07-25 01:46:50 -070057int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
58 int format_id, int type);
59int vfs_quota_off(struct super_block *sb, int type, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020060int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
Christoph Hellwig5fb324a2010-02-16 03:44:52 -050061int vfs_quota_sync(struct super_block *sb, int type, int wait);
Jan Karab85f4b82008-07-25 01:46:50 -070062int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
63int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
64int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
65int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
66
Christoph Hellwigb43fa822010-03-03 09:05:03 -050067int dquot_transfer(struct inode *inode, struct iattr *iattr);
Jan Karab85f4b82008-07-25 01:46:50 -070068int vfs_dq_quota_on_remount(struct super_block *sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070069
Jan Kara03b06342008-07-25 01:46:52 -070070static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
71{
72 return sb_dqopt(sb)->info + type;
73}
Jan Kara74abb982008-07-25 01:46:51 -070074
75/*
76 * Functions for checking status of quota
77 */
78
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030079static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070080{
Jan Karaf55abc02008-08-20 17:50:32 +020081 return sb_dqopt(sb)->flags &
82 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070083}
Jan Kara74abb982008-07-25 01:46:51 -070084
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030085static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070086{
Jan Karaf55abc02008-08-20 17:50:32 +020087 return sb_dqopt(sb)->flags &
88 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070089}
Jan Kara74abb982008-07-25 01:46:51 -070090
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030091static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070092{
Jan Karaf55abc02008-08-20 17:50:32 +020093 return sb_dqopt(sb)->flags &
94 dquot_state_flag(DQUOT_SUSPENDED, type);
Jan Kara03b06342008-07-25 01:46:52 -070095}
Jan Kara74abb982008-07-25 01:46:51 -070096
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030097static inline unsigned sb_any_quota_suspended(struct super_block *sb)
Jan Kara03b06342008-07-25 01:46:52 -070098{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030099 unsigned type, tmsk = 0;
100 for (type = 0; type < MAXQUOTAS; type++)
101 tmsk |= sb_has_quota_suspended(sb, type) << type;
102 return tmsk;
Jan Kara03b06342008-07-25 01:46:52 -0700103}
Jan Kara74abb982008-07-25 01:46:51 -0700104
Jan Karaf55abc02008-08-20 17:50:32 +0200105/* Does kernel know about any quota information for given sb + type? */
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300106static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200107{
108 /* Currently if anything is on, then quota usage is on as well */
109 return sb_has_quota_usage_enabled(sb, type);
110}
111
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300112static inline unsigned sb_any_quota_loaded(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200113{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300114 unsigned type, tmsk = 0;
115 for (type = 0; type < MAXQUOTAS; type++)
116 tmsk |= sb_has_quota_loaded(sb, type) << type;
117 return tmsk;
Jan Karaf55abc02008-08-20 17:50:32 +0200118}
119
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300120static inline bool sb_has_quota_active(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200121{
122 return sb_has_quota_loaded(sb, type) &&
123 !sb_has_quota_suspended(sb, type);
124}
125
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300126static inline unsigned sb_any_quota_active(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200127{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300128 return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
Jan Karaf55abc02008-08-20 17:50:32 +0200129}
130
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131/*
132 * Operations supported for diskquotas.
133 */
Alexey Dobriyan61e225d2009-09-21 17:01:08 -0700134extern const struct dquot_operations dquot_operations;
Alexey Dobriyan0d54b212009-09-21 17:01:09 -0700135extern const struct quotactl_ops vfs_quotactl_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136
137#define sb_dquot_ops (&dquot_operations)
138#define sb_quotactl_ops (&vfs_quotactl_ops)
139
140/* It is better to call this function outside of any transaction as it might
141 * need a lot of space in journal for dquot structure allocation. */
Jan Karab85f4b82008-07-25 01:46:50 -0700142static inline void vfs_dq_init(struct inode *inode)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143{
144 BUG_ON(!inode->i_sb);
Jan Karaf55abc02008-08-20 17:50:32 +0200145 if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146 inode->i_sb->dq_op->initialize(inode, -1);
147}
148
Christoph Hellwig850b2012009-04-27 16:43:54 +0200149/* Cannot be called inside a transaction */
Jan Karab85f4b82008-07-25 01:46:50 -0700150static inline int vfs_dq_off(struct super_block *sb, int remount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151{
152 int ret = -ENOSYS;
153
Jan Kara0ff5af82008-04-28 02:14:33 -0700154 if (sb->s_qcop && sb->s_qcop->quota_off)
155 ret = sb->s_qcop->quota_off(sb, -1, remount);
156 return ret;
157}
158
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
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202/*
203 * NO-OP when quota not configured.
204 */
205#define sb_dquot_ops (NULL)
206#define sb_quotactl_ops (NULL)
Andrew Morton50f8c372008-04-28 02:14:35 -0700207
Jan Karab85f4b82008-07-25 01:46:50 -0700208static inline void vfs_dq_init(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700209{
210}
211
Christoph Hellwig9f754752010-03-03 09:05:05 -0500212static inline void dquot_drop(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700213{
214}
215
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500216static inline int dquot_alloc_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700217{
218 return 0;
219}
220
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500221static inline void dquot_free_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700222{
223}
224
Jan Karab85f4b82008-07-25 01:46:50 -0700225static inline int vfs_dq_off(struct super_block *sb, int remount)
Andrew Morton50f8c372008-04-28 02:14:35 -0700226{
227 return 0;
228}
229
Jan Karab85f4b82008-07-25 01:46:50 -0700230static inline int vfs_dq_quota_on_remount(struct super_block *sb)
Andrew Morton50f8c372008-04-28 02:14:35 -0700231{
232 return 0;
233}
234
Christoph Hellwigb43fa822010-03-03 09:05:03 -0500235static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
Andrew Morton50f8c372008-04-28 02:14:35 -0700236{
237 return 0;
238}
239
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500240static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
241 int warn, int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500243 if (!reserve)
244 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245 return 0;
246}
247
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500248static inline void __dquot_free_space(struct inode *inode, qsize_t number,
249 int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500251 if (!reserve)
252 inode_sub_bytes(inode, number);
253}
254
255static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
256{
257 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 return 0;
259}
260
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261#endif /* CONFIG_QUOTA */
262
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500263static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700264{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500265 return __dquot_alloc_space(inode, nr, 1, 0);
Jan Kara03f6e922008-04-28 02:14:32 -0700266}
267
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500268static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700269{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500270 int ret;
271
272 ret = dquot_alloc_space_nodirty(inode, nr);
273 if (!ret)
274 mark_inode_dirty(inode);
275 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700276}
277
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500278static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700279{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500280 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700281}
282
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500283static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700284{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500285 return dquot_alloc_space(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700286}
287
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500288static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
Mingming Caof18df222009-01-13 16:43:09 +0100289{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500290 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
Mingming Caof18df222009-01-13 16:43:09 +0100291}
292
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500293static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100294{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500295 int ret;
296
297 ret = dquot_prealloc_block_nodirty(inode, nr);
298 if (!ret)
299 mark_inode_dirty(inode);
300 return ret;
Mingming Cao740d9dc2009-01-13 16:43:14 +0100301}
302
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500303static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100304{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500305 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100306}
307
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500308static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700309{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500310 int ret;
311
312 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
313 if (!ret)
314 mark_inode_dirty(inode);
315 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700316}
317
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500318static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700319{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500320 __dquot_free_space(inode, nr, 0);
321}
322
323static inline void dquot_free_space(struct inode *inode, qsize_t nr)
324{
325 dquot_free_space_nodirty(inode, nr);
326 mark_inode_dirty(inode);
327}
328
329static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
330{
331 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
332}
333
334static inline void dquot_free_block(struct inode *inode, qsize_t nr)
335{
336 dquot_free_space(inode, nr << inode->i_blkbits);
337}
338
339static inline void dquot_release_reservation_block(struct inode *inode,
340 qsize_t nr)
341{
342 __dquot_free_space(inode, nr << inode->i_blkbits, 1);
Jan Kara03f6e922008-04-28 02:14:32 -0700343}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345#endif /* _LINUX_QUOTAOPS_ */