blob: 9edd53c24984b9f378eb9adbe99f3c23663a4ffb [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
14
Jan Kara03b06342008-07-25 01:46:52 -070015static inline struct quota_info *sb_dqopt(struct super_block *sb)
16{
17 return &sb->s_dquot;
18}
Jan Kara74abb982008-07-25 01:46:51 -070019
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#if defined(CONFIG_QUOTA)
21
22/*
23 * declaration of quota_function calls in kernel.
24 */
Dmitry Monakhovc4690702010-02-09 17:53:36 +010025void inode_add_rsv_space(struct inode *inode, qsize_t number);
26void inode_claim_rsv_space(struct inode *inode, qsize_t number);
27void inode_sub_rsv_space(struct inode *inode, qsize_t number);
28
Christoph Hellwig871a2932010-03-03 09:05:07 -050029void dquot_initialize(struct inode *inode);
Christoph Hellwig9f754752010-03-03 09:05:05 -050030void dquot_drop(struct inode *inode);
Jan Kara3d9ea252008-10-10 16:12:23 +020031struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
32void dqput(struct dquot *dquot);
Jan Kara12c77522008-10-20 17:05:00 +020033int dquot_scan_active(struct super_block *sb,
34 int (*fn)(struct dquot *dquot, unsigned long priv),
35 unsigned long priv);
Jan Kara7d9056b2008-11-25 15:31:32 +010036struct dquot *dquot_alloc(struct super_block *sb, int type);
37void dquot_destroy(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Eric Sandeen56246f92010-05-16 09:00:00 -040039int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
40void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
Christoph Hellwig5dd40562010-03-03 09:05:00 -050041
Christoph Hellwig63936dd2010-03-03 09:05:01 -050042int dquot_alloc_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Christoph Hellwig5dd40562010-03-03 09:05:00 -050044int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
Christoph Hellwig63936dd2010-03-03 09:05:01 -050045void dquot_free_inode(const struct inode *inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -070046
Jan Karab85f4b82008-07-25 01:46:50 -070047int dquot_commit(struct dquot *dquot);
48int dquot_acquire(struct dquot *dquot);
49int dquot_release(struct dquot *dquot);
50int dquot_commit_info(struct super_block *sb, int type);
51int dquot_mark_dquot_dirty(struct dquot *dquot);
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Christoph Hellwig907f4552010-03-03 09:05:06 -050053int dquot_file_open(struct inode *inode, struct file *file);
54
Jan Karab85f4b82008-07-25 01:46:50 -070055int vfs_quota_on(struct super_block *sb, int type, int format_id,
56 char *path, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020057int vfs_quota_enable(struct inode *inode, int type, int format_id,
58 unsigned int flags);
Al Viro77e69da2008-08-01 04:29:18 -040059int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
60 struct path *path);
Jan Karab85f4b82008-07-25 01:46:50 -070061int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
62 int format_id, int type);
63int vfs_quota_off(struct super_block *sb, int type, int remount);
Jan Karaf55abc02008-08-20 17:50:32 +020064int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
Christoph Hellwig5fb324a2010-02-16 03:44:52 -050065int vfs_quota_sync(struct super_block *sb, int type, int wait);
Jan Karab85f4b82008-07-25 01:46:50 -070066int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
67int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
68int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
69int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
70
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,
Eric Sandeen56246f92010-05-16 09:00:00 -0400236 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237{
Eric Sandeen56246f92010-05-16 09:00:00 -0400238 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500239 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,
Eric Sandeen56246f92010-05-16 09:00:00 -0400244 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245{
Eric Sandeen56246f92010-05-16 09:00:00 -0400246 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500247 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{
Eric Sandeen56246f92010-05-16 09:00:00 -0400262 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
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{
Eric Sandeen56246f92010-05-16 09:00:00 -0400287 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 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{
Eric Sandeen56246f92010-05-16 09:00:00 -0400302 return __dquot_alloc_space(inode, nr << inode->i_blkbits,
303 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100304}
305
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500306static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700307{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500308 int ret;
309
310 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
311 if (!ret)
312 mark_inode_dirty(inode);
313 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700314}
315
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500316static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700317{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500318 __dquot_free_space(inode, nr, 0);
319}
320
321static inline void dquot_free_space(struct inode *inode, qsize_t nr)
322{
323 dquot_free_space_nodirty(inode, nr);
324 mark_inode_dirty(inode);
325}
326
327static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
328{
329 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
330}
331
332static inline void dquot_free_block(struct inode *inode, qsize_t nr)
333{
334 dquot_free_space(inode, nr << inode->i_blkbits);
335}
336
337static inline void dquot_release_reservation_block(struct inode *inode,
338 qsize_t nr)
339{
Eric Sandeen56246f92010-05-16 09:00:00 -0400340 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
Jan Kara03f6e922008-04-28 02:14:32 -0700341}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343#endif /* _LINUX_QUOTAOPS_ */