quotaops.h 11.6 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 27
int dquot_initialize(struct inode *inode, int type);
int 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

int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
37
int dquot_alloc_inode(const struct inode *inode, qsize_t number);
38

39 40 41 42
int dquot_reserve_space(struct inode *inode, qsize_t number, int prealloc);
int dquot_claim_space(struct inode *inode, qsize_t number);
void dquot_release_reserved_space(struct inode *inode, qsize_t number);

43
int dquot_free_space(struct inode *inode, qsize_t number);
44
int dquot_free_inode(const struct inode *inode, qsize_t number);
45

46
int dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask);
47 48 49 50 51 52 53 54
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);

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 69 70 71
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);

void vfs_dq_drop(struct inode *inode);
int vfs_dq_transfer(struct inode *inode, struct iattr *iattr);
int vfs_dq_quota_on_remount(struct super_block *sb);
L
Linus Torvalds 已提交
72

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

/*
 * Functions for checking status of quota
 */

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

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

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

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

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

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

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

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

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

#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. */
145
static inline void vfs_dq_init(struct inode *inode)
L
Linus Torvalds 已提交
146 147
{
	BUG_ON(!inode->i_sb);
148
	if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode))
L
Linus Torvalds 已提交
149 150 151 152 153
		inode->i_sb->dq_op->initialize(inode, -1);
}

/* The following allocation/freeing/transfer functions *must* be called inside
 * a transaction (deadlocks possible otherwise) */
154
static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
155
{
156
	if (sb_any_quota_active(inode->i_sb)) {
L
Linus Torvalds 已提交
157 158 159 160 161 162 163 164 165
		/* Used space is updated in alloc_space() */
		if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA)
			return 1;
	}
	else
		inode_add_bytes(inode, nr);
	return 0;
}

166
static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
167 168
{
	int ret;
169
        if (!(ret =  vfs_dq_prealloc_space_nodirty(inode, nr)))
L
Linus Torvalds 已提交
170 171 172 173
		mark_inode_dirty(inode);
	return ret;
}

174
static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
175
{
176
	if (sb_any_quota_active(inode->i_sb)) {
L
Linus Torvalds 已提交
177 178 179 180 181 182 183 184 185
		/* Used space is updated in alloc_space() */
		if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA)
			return 1;
	}
	else
		inode_add_bytes(inode, nr);
	return 0;
}

186
static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
187 188
{
	int ret;
189
	if (!(ret = vfs_dq_alloc_space_nodirty(inode, nr)))
L
Linus Torvalds 已提交
190 191 192 193
		mark_inode_dirty(inode);
	return ret;
}

194 195 196 197 198 199 200
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
{
	if (sb_any_quota_active(inode->i_sb)) {
		/* Used space is updated in alloc_space() */
		if (inode->i_sb->dq_op->reserve_space(inode, nr, 0) == NO_QUOTA)
			return 1;
	}
201 202
	else
		inode_add_rsv_space(inode, nr);
203 204 205
	return 0;
}

206
static inline int vfs_dq_alloc_inode(struct inode *inode)
L
Linus Torvalds 已提交
207
{
208
	if (sb_any_quota_active(inode->i_sb)) {
209
		vfs_dq_init(inode);
L
Linus Torvalds 已提交
210 211 212 213 214 215
		if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA)
			return 1;
	}
	return 0;
}

216 217 218 219 220 221 222 223 224
/*
 * Convert in-memory reserved quotas to real consumed quotas
 */
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
{
	if (sb_any_quota_active(inode->i_sb)) {
		if (inode->i_sb->dq_op->claim_space(inode, nr) == NO_QUOTA)
			return 1;
	} else
225
		inode_claim_rsv_space(inode, nr);
226 227 228 229 230 231 232 233 234 235 236 237 238

	mark_inode_dirty(inode);
	return 0;
}

/*
 * Release reserved (in-memory) quotas
 */
static inline
void vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
{
	if (sb_any_quota_active(inode->i_sb))
		inode->i_sb->dq_op->release_rsv(inode, nr);
239 240
	else
		inode_sub_rsv_space(inode, nr);
241 242
}

243
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
244
{
245
	if (sb_any_quota_active(inode->i_sb))
L
Linus Torvalds 已提交
246 247 248 249 250
		inode->i_sb->dq_op->free_space(inode, nr);
	else
		inode_sub_bytes(inode, nr);
}

251
static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
252
{
253
	vfs_dq_free_space_nodirty(inode, nr);
L
Linus Torvalds 已提交
254 255 256
	mark_inode_dirty(inode);
}

257
static inline void vfs_dq_free_inode(struct inode *inode)
L
Linus Torvalds 已提交
258
{
259
	if (sb_any_quota_active(inode->i_sb))
L
Linus Torvalds 已提交
260 261 262
		inode->i_sb->dq_op->free_inode(inode, 1);
}

263
/* Cannot be called inside a transaction */
264
static inline int vfs_dq_off(struct super_block *sb, int remount)
L
Linus Torvalds 已提交
265 266 267
{
	int ret = -ENOSYS;

268 269 270 271 272
	if (sb->s_qcop && sb->s_qcop->quota_off)
		ret = sb->s_qcop->quota_off(sb, -1, remount);
	return ret;
}

L
Linus Torvalds 已提交
273 274
#else

275
static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
276 277 278 279
{
	return 0;
}

280
static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
281 282 283 284 285 286 287 288 289 290 291 292 293
{
	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;
}
294

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
/* 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 已提交
316 317 318 319 320
/*
 * NO-OP when quota not configured.
 */
#define sb_dquot_ops				(NULL)
#define sb_quotactl_ops				(NULL)
321

322
static inline void vfs_dq_init(struct inode *inode)
323 324 325
{
}

326
static inline void vfs_dq_drop(struct inode *inode)
327 328 329
{
}

330
static inline int vfs_dq_alloc_inode(struct inode *inode)
331 332 333 334
{
	return 0;
}

335
static inline void vfs_dq_free_inode(struct inode *inode)
336 337 338
{
}

339
static inline int vfs_dq_off(struct super_block *sb, int remount)
340 341 342 343
{
	return 0;
}

344
static inline int vfs_dq_quota_on_remount(struct super_block *sb)
345 346 347 348
{
	return 0;
}

349
static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr)
350 351 352 353
{
	return 0;
}

354
static inline int vfs_dq_prealloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
355 356 357 358 359
{
	inode_add_bytes(inode, nr);
	return 0;
}

360
static inline int vfs_dq_prealloc_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
361
{
362
	vfs_dq_prealloc_space_nodirty(inode, nr);
L
Linus Torvalds 已提交
363 364 365 366
	mark_inode_dirty(inode);
	return 0;
}

367
static inline int vfs_dq_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
368 369 370 371 372
{
	inode_add_bytes(inode, nr);
	return 0;
}

373
static inline int vfs_dq_alloc_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
374
{
375
	vfs_dq_alloc_space_nodirty(inode, nr);
L
Linus Torvalds 已提交
376 377 378 379
	mark_inode_dirty(inode);
	return 0;
}

380 381 382 383 384
static inline int vfs_dq_reserve_space(struct inode *inode, qsize_t nr)
{
	return 0;
}

385 386 387 388 389 390 391 392 393 394 395
static inline int vfs_dq_claim_space(struct inode *inode, qsize_t nr)
{
	return vfs_dq_alloc_space(inode, nr);
}

static inline
int vfs_dq_release_reservation_space(struct inode *inode, qsize_t nr)
{
	return 0;
}

396
static inline void vfs_dq_free_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
397 398 399 400
{
	inode_sub_bytes(inode, nr);
}

401
static inline void vfs_dq_free_space(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
402
{
403
	vfs_dq_free_space_nodirty(inode, nr);
L
Linus Torvalds 已提交
404 405 406 407 408
	mark_inode_dirty(inode);
}	

#endif /* CONFIG_QUOTA */

409
static inline int vfs_dq_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
410
{
411
	return vfs_dq_prealloc_space_nodirty(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
412 413
}

414
static inline int vfs_dq_prealloc_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
415
{
416
	return vfs_dq_prealloc_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
417 418
}

419
static inline int vfs_dq_alloc_block_nodirty(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
420
{
421
	return vfs_dq_alloc_space_nodirty(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
422 423
}

424
static inline int vfs_dq_alloc_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
425
{
426
	return vfs_dq_alloc_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
427 428
}

429 430
static inline int vfs_dq_reserve_block(struct inode *inode, qsize_t nr)
{
431
	return vfs_dq_reserve_space(inode, nr << inode->i_blkbits);
432 433
}

434 435
static inline int vfs_dq_claim_block(struct inode *inode, qsize_t nr)
{
436
	return vfs_dq_claim_space(inode, nr << inode->i_blkbits);
437 438 439 440 441 442 443 444
}

static inline
void vfs_dq_release_reservation_block(struct inode *inode, qsize_t nr)
{
	vfs_dq_release_reservation_space(inode, nr << inode->i_blkbits);
}

445
static inline void vfs_dq_free_block_nodirty(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
446
{
447
	vfs_dq_free_space_nodirty(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
448 449
}

450
static inline void vfs_dq_free_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
451
{
452
	vfs_dq_free_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
453
}
L
Linus Torvalds 已提交
454 455

#endif /* _LINUX_QUOTAOPS_ */