blob: 126193c1a5cef111c5602d1b455d8c4e1c7e55b5 [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
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148/*
149 * Operations supported for diskquotas.
150 */
Alexey Dobriyan61e225d2009-09-21 17:01:08 -0700151extern const struct dquot_operations dquot_operations;
Christoph Hellwig287a8092010-05-19 07:16:45 -0400152extern const struct quotactl_ops dquot_quotactl_ops;
Jan Kara0ff5af82008-04-28 02:14:33 -0700153
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
Christoph Hellwig871a2932010-03-03 09:05:07 -0500192static inline void dquot_initialize(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700193{
194}
195
Christoph Hellwig9f754752010-03-03 09:05:05 -0500196static inline void dquot_drop(struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700197{
198}
199
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500200static inline int dquot_alloc_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700201{
202 return 0;
203}
204
Christoph Hellwig63936dd2010-03-03 09:05:01 -0500205static inline void dquot_free_inode(const struct inode *inode)
Andrew Morton50f8c372008-04-28 02:14:35 -0700206{
207}
208
Christoph Hellwigb43fa822010-03-03 09:05:03 -0500209static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
Andrew Morton50f8c372008-04-28 02:14:35 -0700210{
211 return 0;
212}
213
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500214static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
Eric Sandeen56246f92010-05-16 09:00:00 -0400215 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216{
Eric Sandeen56246f92010-05-16 09:00:00 -0400217 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500218 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219 return 0;
220}
221
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500222static inline void __dquot_free_space(struct inode *inode, qsize_t number,
Eric Sandeen56246f92010-05-16 09:00:00 -0400223 int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224{
Eric Sandeen56246f92010-05-16 09:00:00 -0400225 if (!(flags & DQUOT_SPACE_RESERVE))
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500226 inode_sub_bytes(inode, number);
227}
228
229static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
230{
231 inode_add_bytes(inode, number);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 return 0;
233}
234
Christoph Hellwig0f0dd622010-05-19 07:16:41 -0400235static inline int dquot_disable(struct super_block *sb, int type,
236 unsigned int flags)
237{
238 return 0;
239}
240
241static inline int dquot_suspend(struct super_block *sb, int type)
242{
243 return 0;
244}
245
246static inline int dquot_resume(struct super_block *sb, int type)
247{
248 return 0;
249}
250
Christoph Hellwig871a2932010-03-03 09:05:07 -0500251#define dquot_file_open generic_file_open
252
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253#endif /* CONFIG_QUOTA */
254
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500255static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700256{
Eric Sandeen56246f92010-05-16 09:00:00 -0400257 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
Jan Kara03f6e922008-04-28 02:14:32 -0700258}
259
Eric Sandeen0e058422010-05-16 10:00:00 -0400260static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
261{
262 __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
263 mark_inode_dirty(inode);
Jan Kara03f6e922008-04-28 02:14:32 -0700264}
265
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500266static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700267{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500268 int ret;
269
270 ret = dquot_alloc_space_nodirty(inode, nr);
271 if (!ret)
272 mark_inode_dirty(inode);
273 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700274}
275
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500276static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700277{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500278 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700279}
280
Eric Sandeen0e058422010-05-16 10:00:00 -0400281static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
282{
283 dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
284}
285
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500286static inline int dquot_alloc_block(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(inode, nr << inode->i_blkbits);
Jan Kara03f6e922008-04-28 02:14:32 -0700289}
290
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500291static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
Mingming Caof18df222009-01-13 16:43:09 +0100292{
Eric Sandeen56246f92010-05-16 09:00:00 -0400293 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
Mingming Caof18df222009-01-13 16:43:09 +0100294}
295
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500296static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100297{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500298 int ret;
299
300 ret = dquot_prealloc_block_nodirty(inode, nr);
301 if (!ret)
302 mark_inode_dirty(inode);
303 return ret;
Mingming Cao740d9dc2009-01-13 16:43:14 +0100304}
305
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500306static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
Mingming Cao740d9dc2009-01-13 16:43:14 +0100307{
Eric Sandeen56246f92010-05-16 09:00:00 -0400308 return __dquot_alloc_space(inode, nr << inode->i_blkbits,
309 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
Mingming Cao740d9dc2009-01-13 16:43:14 +0100310}
311
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500312static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700313{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500314 int ret;
315
316 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
317 if (!ret)
318 mark_inode_dirty(inode);
319 return ret;
Jan Kara03f6e922008-04-28 02:14:32 -0700320}
321
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500322static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
Jan Kara03f6e922008-04-28 02:14:32 -0700323{
Christoph Hellwig5dd40562010-03-03 09:05:00 -0500324 __dquot_free_space(inode, nr, 0);
325}
326
327static inline void dquot_free_space(struct inode *inode, qsize_t nr)
328{
329 dquot_free_space_nodirty(inode, nr);
330 mark_inode_dirty(inode);
331}
332
333static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
334{
335 dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
336}
337
338static inline void dquot_free_block(struct inode *inode, qsize_t nr)
339{
340 dquot_free_space(inode, nr << inode->i_blkbits);
341}
342
343static inline void dquot_release_reservation_block(struct inode *inode,
344 qsize_t nr)
345{
Eric Sandeen56246f92010-05-16 09:00:00 -0400346 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
Jan Kara03f6e922008-04-28 02:14:32 -0700347}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349#endif /* _LINUX_QUOTAOPS_ */