quotaops.h 8.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 * Definitions for diskquota-operations. When diskquota is configured these
 * macros expand to the right source-code.
 *
 * Author:  Marco van Wieringen <mvw@planets.elm.net>
 */
#ifndef _LINUX_QUOTAOPS_
#define _LINUX_QUOTAOPS_

#include <linux/fs.h>

12 13 14 15
static inline struct quota_info *sb_dqopt(struct super_block *sb)
{
	return &sb->s_dquot;
}
16

L
Linus Torvalds 已提交
17 18 19 20 21
#if defined(CONFIG_QUOTA)

/*
 * declaration of quota_function calls in kernel.
 */
22 23 24 25
void inode_add_rsv_space(struct inode *inode, qsize_t number);
void inode_claim_rsv_space(struct inode *inode, qsize_t number);
void inode_sub_rsv_space(struct inode *inode, qsize_t number);

26
int dquot_initialize(struct inode *inode, int type);
27
void dquot_drop(struct inode *inode);
28 29
struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
void dqput(struct dquot *dquot);
30 31 32
int dquot_scan_active(struct super_block *sb,
		      int (*fn)(struct dquot *dquot, unsigned long priv),
		      unsigned long priv);
33 34
struct dquot *dquot_alloc(struct super_block *sb, int type);
void dquot_destroy(struct dquot *dquot);
35

36 37 38
int __dquot_alloc_space(struct inode *inode, qsize_t number,
		int warn, int reserve);
void __dquot_free_space(struct inode *inode, qsize_t number, int reserve);
39

40
int dquot_alloc_inode(const struct inode *inode);
41

42
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
43
void dquot_free_inode(const struct inode *inode);
44 45 46 47 48 49 50

int dquot_commit(struct dquot *dquot);
int dquot_acquire(struct dquot *dquot);
int dquot_release(struct dquot *dquot);
int dquot_commit_info(struct super_block *sb, int type);
int dquot_mark_dquot_dirty(struct dquot *dquot);

51 52
int dquot_file_open(struct inode *inode, struct file *file);

53 54
int vfs_quota_on(struct super_block *sb, int type, int format_id,
 	char *path, int remount);
55 56
int vfs_quota_enable(struct inode *inode, int type, int format_id,
	unsigned int flags);
57 58
int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
 	struct path *path);
59 60 61
int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
 	int format_id, int type);
int vfs_quota_off(struct super_block *sb, int type, int remount);
62
int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
63
int vfs_quota_sync(struct super_block *sb, int type, int wait);
64 65 66 67 68
int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);

69
int dquot_transfer(struct inode *inode, struct iattr *iattr);
70
int vfs_dq_quota_on_remount(struct super_block *sb);
L
Linus Torvalds 已提交
71

72 73 74 75
static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
{
	return sb_dqopt(sb)->info + type;
}
76 77 78 79 80

/*
 * Functions for checking status of quota
 */

81
static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
82
{
83 84
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_USAGE_ENABLED, type);
85
}
86

87
static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
88
{
89 90
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
91
}
92

93
static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
94
{
95 96
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_SUSPENDED, type);
97
}
98

99
static inline unsigned sb_any_quota_suspended(struct super_block *sb)
100
{
101 102 103 104
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_suspended(sb, type) << type;
	return tmsk;
105
}
106

107
/* Does kernel know about any quota information for given sb + type? */
108
static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
109 110 111 112 113
{
	/* Currently if anything is on, then quota usage is on as well */
	return sb_has_quota_usage_enabled(sb, type);
}

114
static inline unsigned sb_any_quota_loaded(struct super_block *sb)
115
{
116 117 118 119
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_loaded(sb, type) << type;
	return	tmsk;
120 121
}

122
static inline bool sb_has_quota_active(struct super_block *sb, int type)
123 124 125 126 127
{
	return sb_has_quota_loaded(sb, type) &&
	       !sb_has_quota_suspended(sb, type);
}

128
static inline unsigned sb_any_quota_active(struct super_block *sb)
129
{
130
	return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
131 132
}

L
Linus Torvalds 已提交
133 134 135
/*
 * Operations supported for diskquotas.
 */
136
extern const struct dquot_operations dquot_operations;
137
extern const struct quotactl_ops vfs_quotactl_ops;
L
Linus Torvalds 已提交
138 139 140 141 142 143

#define sb_dquot_ops (&dquot_operations)
#define sb_quotactl_ops (&vfs_quotactl_ops)

/* It is better to call this function outside of any transaction as it might
 * need a lot of space in journal for dquot structure allocation. */
144
static inline void vfs_dq_init(struct inode *inode)
L
Linus Torvalds 已提交
145 146
{
	BUG_ON(!inode->i_sb);
147
	if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode))
L
Linus Torvalds 已提交
148 149 150
		inode->i_sb->dq_op->initialize(inode, -1);
}

151
/* Cannot be called inside a transaction */
152
static inline int vfs_dq_off(struct super_block *sb, int remount)
L
Linus Torvalds 已提交
153 154 155
{
	int ret = -ENOSYS;

156 157 158 159 160
	if (sb->s_qcop && sb->s_qcop->quota_off)
		ret = sb->s_qcop->quota_off(sb, -1, remount);
	return ret;
}

L
Linus Torvalds 已提交
161 162
#else

163
static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
164 165 166 167
{
	return 0;
}

168
static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
169 170 171 172 173 174 175 176 177 178 179 180 181
{
	return 0;
}

static inline int sb_has_quota_suspended(struct super_block *sb, int type)
{
	return 0;
}

static inline int sb_any_quota_suspended(struct super_block *sb)
{
	return 0;
}
182

183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
/* Does kernel know about any quota information for given sb + type? */
static inline int sb_has_quota_loaded(struct super_block *sb, int type)
{
	return 0;
}

static inline int sb_any_quota_loaded(struct super_block *sb)
{
	return 0;
}

static inline int sb_has_quota_active(struct super_block *sb, int type)
{
	return 0;
}

static inline int sb_any_quota_active(struct super_block *sb)
{
	return 0;
}

L
Linus Torvalds 已提交
204 205 206 207 208
/*
 * NO-OP when quota not configured.
 */
#define sb_dquot_ops				(NULL)
#define sb_quotactl_ops				(NULL)
209

210
static inline void vfs_dq_init(struct inode *inode)
211 212 213
{
}

214
static inline void dquot_drop(struct inode *inode)
215 216 217
{
}

218
static inline int dquot_alloc_inode(const struct inode *inode)
219 220 221 222
{
	return 0;
}

223
static inline void dquot_free_inode(const struct inode *inode)
224 225 226
{
}

227
static inline int vfs_dq_off(struct super_block *sb, int remount)
228 229 230 231
{
	return 0;
}

232
static inline int vfs_dq_quota_on_remount(struct super_block *sb)
233 234 235 236
{
	return 0;
}

237
static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
238 239 240 241
{
	return 0;
}

242 243
static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
		int warn, int reserve)
L
Linus Torvalds 已提交
244
{
245 246
	if (!reserve)
		inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
247 248 249
	return 0;
}

250 251
static inline void __dquot_free_space(struct inode *inode, qsize_t number,
		int reserve)
L
Linus Torvalds 已提交
252
{
253 254
	if (!reserve)
		inode_sub_bytes(inode, number);
L
Linus Torvalds 已提交
255 256
}

257
static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
L
Linus Torvalds 已提交
258
{
259
	inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
260 261 262
	return 0;
}

263 264 265
#endif /* CONFIG_QUOTA */

static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
266
{
267
	return __dquot_alloc_space(inode, nr, 1, 0);
L
Linus Torvalds 已提交
268 269
}

270
static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
271
{
272 273 274 275 276 277
	int ret;

	ret = dquot_alloc_space_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
278 279
}

280
static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
281
{
282
	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
283 284
}

285
static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
286
{
287
	return dquot_alloc_space(inode, nr << inode->i_blkbits);
288 289
}

290
static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
291
{
292
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
L
Linus Torvalds 已提交
293 294
}

295
static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
296
{
297
	int ret;
L
Linus Torvalds 已提交
298

299 300 301 302
	ret = dquot_prealloc_block_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
303 304
}

305
static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
306
{
307
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
J
Jan Kara 已提交
308 309
}

310
static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
311
{
312
	int ret;
J
Jan Kara 已提交
313

314 315 316 317
	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
318 319
}

320
static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
321
{
322
	__dquot_free_space(inode, nr, 0);
323 324
}

325
static inline void dquot_free_space(struct inode *inode, qsize_t nr)
326
{
327 328
	dquot_free_space_nodirty(inode, nr);
	mark_inode_dirty(inode);
329 330
}

331
static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
332
{
333
	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
334 335
}

336
static inline void dquot_free_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
337
{
338
	dquot_free_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
339 340
}

341 342
static inline void dquot_release_reservation_block(struct inode *inode,
		qsize_t nr)
J
Jan Kara 已提交
343
{
344
	__dquot_free_space(inode, nr << inode->i_blkbits, 1);
J
Jan Kara 已提交
345
}
L
Linus Torvalds 已提交
346

347 348
#define dquot_file_open		generic_file_open

L
Linus Torvalds 已提交
349
#endif /* _LINUX_QUOTAOPS_ */