blob: e6fa7acce2900a5bd6862a4bf9703a87cd30a0bd [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
Christoph Hellwig871a2932010-03-03 09:05:07 -050026void dquot_initialize(struct inode *inode);
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
Christoph Hellwig907f4552010-03-03 09:05:06 -050051int dquot_file_open(struct inode *inode, struct file *file);
52
Jan Karab85f4b82008-07-25 01:46:50 -070053int vfs_quota_on(struct super_block *sb, int type, int format_id,
54 char *path, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020055int vfs_quota_enable(struct inode *inode, int type, int format_id,
56 unsigned int flags);
Al Viro77e69da2008-08-01 04:29:18 -040057int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
58 struct path *path);
Jan Karab85f4b82008-07-25 01:46:50 -070059int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
60 int format_id, int type);
61int vfs_quota_off(struct super_block *sb, int type, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020062int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
Christoph Hellwig5fb324a2010-02-16 03:44:52 -050063int vfs_quota_sync(struct super_block *sb, int type, int wait);
Jan Karab85f4b82008-07-25 01:46:50 -070064int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
65int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
66int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
67int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
68
Christoph Hellwigb43fa822010-03-03 09:05:03 -050069int dquot_transfer(struct inode *inode, struct iattr *iattr);
Jan Karab85f4b82008-07-25 01:46:50 -070070int vfs_dq_quota_on_remount(struct super_block *sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
Jan Kara03b06342008-07-25 01:46:52 -070072static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
73{
74 return sb_dqopt(sb)->info + type;
75}
Jan Kara74abb982008-07-25 01:46:51 -070076
77/*
78 * Functions for checking status of quota
79 */
80
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030081static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070082{
Jan Karaf55abc02008-08-20 17:50:32 +020083 return sb_dqopt(sb)->flags &
84 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070085}
Jan Kara74abb982008-07-25 01:46:51 -070086
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030087static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070088{
Jan Karaf55abc02008-08-20 17:50:32 +020089 return sb_dqopt(sb)->flags &
90 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070091}
Jan Kara74abb982008-07-25 01:46:51 -070092
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030093static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070094{
Jan Karaf55abc02008-08-20 17:50:32 +020095 return sb_dqopt(sb)->flags &
96 dquot_state_flag(DQUOT_SUSPENDED, type);
Jan Kara03b06342008-07-25 01:46:52 -070097}
Jan Kara74abb982008-07-25 01:46:51 -070098
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030099static inline unsigned sb_any_quota_suspended(struct super_block *sb)
Jan Kara03b06342008-07-25 01:46:52 -0700100{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300101 unsigned type, tmsk = 0;
102 for (type = 0; type < MAXQUOTAS; type++)
103 tmsk |= sb_has_quota_suspended(sb, type) << type;
104 return tmsk;
Jan Kara03b06342008-07-25 01:46:52 -0700105}
Jan Kara74abb982008-07-25 01:46:51 -0700106
Jan Karaf55abc02008-08-20 17:50:32 +0200107/* Does kernel know about any quota information for given sb + type? */
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300108static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200109{
110 /* Currently if anything is on, then quota usage is on as well */
111 return sb_has_quota_usage_enabled(sb, type);
112}
113
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300114static inline unsigned sb_any_quota_loaded(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200115{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300116 unsigned type, tmsk = 0;
117 for (type = 0; type < MAXQUOTAS; type++)
118 tmsk |= sb_has_quota_loaded(sb, type) << type;
119 return tmsk;
Jan Karaf55abc02008-08-20 17:50:32 +0200120}
121
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300122static inline bool sb_has_quota_active(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200123{
124 return sb_has_quota_loaded(sb, type) &&
125 !sb_has_quota_suspended(sb, type);
126}
127
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300128static inline unsigned sb_any_quota_active(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200129{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300130 return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
Jan Karaf55abc02008-08-20 17:50:32 +0200131}
132
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133/*
134 * Operations supported for diskquotas.
135 */
Alexey Dobriyan61e225d2009-09-21 17:01:08 -0700136extern const struct dquot_operations dquot_operations;
Alexey Dobriyan0d54b212009-09-21 17:01:09 -0700137extern const struct quotactl_ops vfs_quotactl_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138
139#define sb_dquot_ops (&dquot_operations)
140#define sb_quotactl_ops (&vfs_quotactl_ops)
141
Christoph Hellwig850b2012009-04-27 16:43:54 +0200142/* Cannot be called inside a transaction */
Jan Karab85f4b82008-07-25 01:46:50 -0700143static inline int vfs_dq_off(struct super_block *sb, int remount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144{
145 int ret = -ENOSYS;
146
Jan Kara0ff5af82008-04-28 02:14:33 -0700147 if (sb->s_qcop && sb->s_qcop->quota_off)
148 ret = sb->s_qcop->quota_off(sb, -1, remount);
149 return ret;
150}
151
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152#else
153
Jan Karaf55abc02008-08-20 17:50:32 +0200154static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700155{
156 return 0;
157}
158
Jan Karaf55abc02008-08-20 17:50:32 +0200159static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700160{
161 return 0;
162}
163
164static inline int sb_has_quota_suspended(struct super_block *sb, int type)
165{
166 return 0;
167}
168
169static inline int sb_any_quota_suspended(struct super_block *sb)
170{
171 return 0;
172}
Jan Kara74abb982008-07-25 01:46:51 -0700173
Jan Karaf55abc02008-08-20 17:50:32 +0200174/* Does kernel know about any quota information for given sb + type? */
175static inline int sb_has_quota_loaded(struct super_block *sb, int type)
176{
177 return 0;
178}
179
180static inline int sb_any_quota_loaded(struct super_block *sb)
181{
182 return 0;
183}
184
185static inline int sb_has_quota_active(struct super_block *sb, int type)
186{
187 return 0;
188}
189
190static inline int sb_any_quota_active(struct super_block *sb)
191{
192 return 0;
193}
194
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195/*
196 * NO-OP when quota not configured.
197 */
198#define sb_dquot_ops (NULL)
199#define sb_quotactl_ops (NULL)
Andrew Morton50f8c372008-04-28 02:14:35 -0700200
Christoph Hellwig871a2932010-03-03 09:05:07 -0500201static inline void dquot_initialize(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700202{
203}
204
Christoph Hellwig9f754752010-03-03 09:05:05 -0500205static inline void dquot_drop(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700206{
207}
208
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500209static inline int dquot_alloc_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700210{
211 return 0;
212}
213
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500214static inline void dquot_free_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700215{
216}
217
Jan Karab85f4b82008-07-25 01:46:50 -0700218static inline int vfs_dq_off(struct super_block *sb, int remount)
Andrew Morton50f8c372008-04-28 02:14:35 -0700219{
220 return 0;
221}
222
Jan Karab85f4b82008-07-25 01:46:50 -0700223static inline int vfs_dq_quota_on_remount(struct super_block *sb)
Andrew Morton50f8c372008-04-28 02:14:35 -0700224{
225 return 0;
226}
227
Christoph Hellwigb43fa822010-03-03 09:05:03 -0500228static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
Andrew Morton50f8c372008-04-28 02:14:35 -0700229{
230 return 0;
231}
232
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500233static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
234 int warn, int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500236 if (!reserve)
237 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238 return 0;
239}
240
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500241static inline void __dquot_free_space(struct inode *inode, qsize_t number,
242 int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500244 if (!reserve)
245 inode_sub_bytes(inode, number);
246}
247
248static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
249{
250 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 return 0;
252}
253
Christoph Hellwig871a2932010-03-03 09:05:07 -0500254#define dquot_file_open generic_file_open
255
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256#endif /* CONFIG_QUOTA */
257
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500258static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700259{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500260 return __dquot_alloc_space(inode, nr, 1, 0);
Jan Kara03f6e922008-04-28 02:14:32 -0700261}
262
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500263static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700264{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500265 int ret;
266
267 ret = dquot_alloc_space_nodirty(inode, nr);
268 if (!ret)
269 mark_inode_dirty(inode);
270 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700271}
272
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500273static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700274{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500275 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700276}
277
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500278static inline int dquot_alloc_block(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(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_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
Mingming Caof18df222009-01-13 16:43:09 +0100284{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500285 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
Mingming Caof18df222009-01-13 16:43:09 +0100286}
287
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500288static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100289{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500290 int ret;
291
292 ret = dquot_prealloc_block_nodirty(inode, nr);
293 if (!ret)
294 mark_inode_dirty(inode);
295 return ret;
Mingming Cao740d9dc2009-01-13 16:43:14 +0100296}
297
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500298static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100299{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500300 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100301}
302
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500303static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700304{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500305 int ret;
306
307 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
308 if (!ret)
309 mark_inode_dirty(inode);
310 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700311}
312
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500313static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700314{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500315 __dquot_free_space(inode, nr, 0);
316}
317
318static inline void dquot_free_space(struct inode *inode, qsize_t nr)
319{
320 dquot_free_space_nodirty(inode, nr);
321 mark_inode_dirty(inode);
322}
323
324static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
325{
326 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
327}
328
329static inline void dquot_free_block(struct inode *inode, qsize_t nr)
330{
331 dquot_free_space(inode, nr << inode->i_blkbits);
332}
333
334static inline void dquot_release_reservation_block(struct inode *inode,
335 qsize_t nr)
336{
337 __dquot_free_space(inode, nr << inode->i_blkbits, 1);
Jan Kara03f6e922008-04-28 02:14:32 -0700338}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340#endif /* _LINUX_QUOTAOPS_ */