blob: 82c70c42d0353de628631be1236b67a429f3fb7f [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);
Christoph Hellwigb9b2dd32010-05-06 17:04:58 -040066int vfs_get_dqblk(struct super_block *sb, int type, qid_t id,
67 struct fs_disk_quota *di);
Christoph Hellwigc472b432010-05-06 17:05:17 -040068int vfs_set_dqblk(struct super_block *sb, int type, qid_t id,
69 struct fs_disk_quota *di);
Jan Karab85f4b82008-07-25 01:46:50 -070070
Christoph Hellwigb43fa822010-03-03 09:05:03 -050071int dquot_transfer(struct inode *inode, struct iattr *iattr);
Jan Karab85f4b82008-07-25 01:46:50 -070072int vfs_dq_quota_on_remount(struct super_block *sb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070073
Jan Kara03b06342008-07-25 01:46:52 -070074static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
75{
76 return sb_dqopt(sb)->info + type;
77}
Jan Kara74abb982008-07-25 01:46:51 -070078
79/*
80 * Functions for checking status of quota
81 */
82
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030083static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070084{
Jan Karaf55abc02008-08-20 17:50:32 +020085 return sb_dqopt(sb)->flags &
86 dquot_state_flag(DQUOT_USAGE_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070087}
Jan Kara74abb982008-07-25 01:46:51 -070088
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030089static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070090{
Jan Karaf55abc02008-08-20 17:50:32 +020091 return sb_dqopt(sb)->flags &
92 dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
Jan Kara03b06342008-07-25 01:46:52 -070093}
Jan Kara74abb982008-07-25 01:46:51 -070094
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +030095static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -070096{
Jan Karaf55abc02008-08-20 17:50:32 +020097 return sb_dqopt(sb)->flags &
98 dquot_state_flag(DQUOT_SUSPENDED, type);
Jan Kara03b06342008-07-25 01:46:52 -070099}
Jan Kara74abb982008-07-25 01:46:51 -0700100
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300101static inline unsigned sb_any_quota_suspended(struct super_block *sb)
Jan Kara03b06342008-07-25 01:46:52 -0700102{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300103 unsigned type, tmsk = 0;
104 for (type = 0; type < MAXQUOTAS; type++)
105 tmsk |= sb_has_quota_suspended(sb, type) << type;
106 return tmsk;
Jan Kara03b06342008-07-25 01:46:52 -0700107}
Jan Kara74abb982008-07-25 01:46:51 -0700108
Jan Karaf55abc02008-08-20 17:50:32 +0200109/* Does kernel know about any quota information for given sb + type? */
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300110static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200111{
112 /* Currently if anything is on, then quota usage is on as well */
113 return sb_has_quota_usage_enabled(sb, type);
114}
115
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300116static inline unsigned sb_any_quota_loaded(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200117{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300118 unsigned type, tmsk = 0;
119 for (type = 0; type < MAXQUOTAS; type++)
120 tmsk |= sb_has_quota_loaded(sb, type) << type;
121 return tmsk;
Jan Karaf55abc02008-08-20 17:50:32 +0200122}
123
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300124static inline bool sb_has_quota_active(struct super_block *sb, int type)
Jan Karaf55abc02008-08-20 17:50:32 +0200125{
126 return sb_has_quota_loaded(sb, type) &&
127 !sb_has_quota_suspended(sb, type);
128}
129
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300130static inline unsigned sb_any_quota_active(struct super_block *sb)
Jan Karaf55abc02008-08-20 17:50:32 +0200131{
Dmitry Monakhovad1e6e82010-02-16 08:31:49 +0300132 return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
Jan Karaf55abc02008-08-20 17:50:32 +0200133}
134
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135/*
136 * Operations supported for diskquotas.
137 */
Alexey Dobriyan61e225d2009-09-21 17:01:08 -0700138extern const struct dquot_operations dquot_operations;
Alexey Dobriyan0d54b212009-09-21 17:01:09 -0700139extern const struct quotactl_ops vfs_quotactl_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140
141#define sb_dquot_ops (&dquot_operations)
142#define sb_quotactl_ops (&vfs_quotactl_ops)
143
Christoph Hellwig850b2012009-04-27 16:43:54 +0200144/* Cannot be called inside a transaction */
Jan Karab85f4b82008-07-25 01:46:50 -0700145static inline int vfs_dq_off(struct super_block *sb, int remount)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146{
147 int ret = -ENOSYS;
148
Jan Kara0ff5af82008-04-28 02:14:33 -0700149 if (sb->s_qcop && sb->s_qcop->quota_off)
150 ret = sb->s_qcop->quota_off(sb, -1, remount);
151 return ret;
152}
153
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154#else
155
Jan Karaf55abc02008-08-20 17:50:32 +0200156static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700157{
158 return 0;
159}
160
Jan Karaf55abc02008-08-20 17:50:32 +0200161static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
Jan Kara03b06342008-07-25 01:46:52 -0700162{
163 return 0;
164}
165
166static inline int sb_has_quota_suspended(struct super_block *sb, int type)
167{
168 return 0;
169}
170
171static inline int sb_any_quota_suspended(struct super_block *sb)
172{
173 return 0;
174}
Jan Kara74abb982008-07-25 01:46:51 -0700175
Jan Karaf55abc02008-08-20 17:50:32 +0200176/* Does kernel know about any quota information for given sb + type? */
177static inline int sb_has_quota_loaded(struct super_block *sb, int type)
178{
179 return 0;
180}
181
182static inline int sb_any_quota_loaded(struct super_block *sb)
183{
184 return 0;
185}
186
187static inline int sb_has_quota_active(struct super_block *sb, int type)
188{
189 return 0;
190}
191
192static inline int sb_any_quota_active(struct super_block *sb)
193{
194 return 0;
195}
196
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197/*
198 * NO-OP when quota not configured.
199 */
200#define sb_dquot_ops (NULL)
201#define sb_quotactl_ops (NULL)
Andrew Morton50f8c372008-04-28 02:14:35 -0700202
Christoph Hellwig871a2932010-03-03 09:05:07 -0500203static inline void dquot_initialize(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700204{
205}
206
Christoph Hellwig9f754752010-03-03 09:05:05 -0500207static inline void dquot_drop(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700208{
209}
210
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500211static inline int dquot_alloc_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700212{
213 return 0;
214}
215
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500216static inline void dquot_free_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700217{
218}
219
Jan Karab85f4b82008-07-25 01:46:50 -0700220static inline int vfs_dq_off(struct super_block *sb, int remount)
Andrew Morton50f8c372008-04-28 02:14:35 -0700221{
222 return 0;
223}
224
Jan Karab85f4b82008-07-25 01:46:50 -0700225static inline int vfs_dq_quota_on_remount(struct super_block *sb)
Andrew Morton50f8c372008-04-28 02:14:35 -0700226{
227 return 0;
228}
229
Christoph Hellwigb43fa822010-03-03 09:05:03 -0500230static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
Andrew Morton50f8c372008-04-28 02:14:35 -0700231{
232 return 0;
233}
234
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500235static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
236 int warn, int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500238 if (!reserve)
239 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240 return 0;
241}
242
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500243static inline void __dquot_free_space(struct inode *inode, qsize_t number,
244 int reserve)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500246 if (!reserve)
247 inode_sub_bytes(inode, number);
248}
249
250static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
251{
252 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253 return 0;
254}
255
Christoph Hellwig871a2932010-03-03 09:05:07 -0500256#define dquot_file_open generic_file_open
257
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258#endif /* CONFIG_QUOTA */
259
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500260static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700261{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500262 return __dquot_alloc_space(inode, nr, 1, 0);
Jan Kara03f6e922008-04-28 02:14:32 -0700263}
264
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500265static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700266{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500267 int ret;
268
269 ret = dquot_alloc_space_nodirty(inode, nr);
270 if (!ret)
271 mark_inode_dirty(inode);
272 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700273}
274
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500275static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700276{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500277 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700278}
279
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500280static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700281{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500282 return dquot_alloc_space(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700283}
284
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500285static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
Mingming Caof18df222009-01-13 16:43:09 +0100286{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500287 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
Mingming Caof18df222009-01-13 16:43:09 +0100288}
289
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500290static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100291{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500292 int ret;
293
294 ret = dquot_prealloc_block_nodirty(inode, nr);
295 if (!ret)
296 mark_inode_dirty(inode);
297 return ret;
Mingming Cao740d9dc2009-01-13 16:43:14 +0100298}
299
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500300static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100301{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500302 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100303}
304
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500305static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700306{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500307 int ret;
308
309 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
310 if (!ret)
311 mark_inode_dirty(inode);
312 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700313}
314
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500315static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700316{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500317 __dquot_free_space(inode, nr, 0);
318}
319
320static inline void dquot_free_space(struct inode *inode, qsize_t nr)
321{
322 dquot_free_space_nodirty(inode, nr);
323 mark_inode_dirty(inode);
324}
325
326static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
327{
328 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
329}
330
331static inline void dquot_free_block(struct inode *inode, qsize_t nr)
332{
333 dquot_free_space(inode, nr << inode->i_blkbits);
334}
335
336static inline void dquot_release_reservation_block(struct inode *inode,
337 qsize_t nr)
338{
339 __dquot_free_space(inode, nr << inode->i_blkbits, 1);
Jan Kara03f6e922008-04-28 02:14:32 -0700340}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342#endif /* _LINUX_QUOTAOPS_ */