quotaops.h 9.2 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 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, qsize_t number);
41

42
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
43
int dquot_free_inode(const struct inode *inode, qsize_t number);
44

45
int dquot_transfer(struct inode *inode, qid_t *chid, unsigned long mask);
46 47 48 49 50 51 52 53
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);
54 55
int vfs_quota_enable(struct inode *inode, int type, int format_id,
	unsigned int flags);
56 57
int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
 	struct path *path);
58 59 60
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);
61
int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
62
int vfs_quota_sync(struct super_block *sb, int type, int wait);
63 64 65 66 67 68 69 70
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 已提交
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
static inline int vfs_dq_alloc_inode(struct inode *inode)
L
Linus Torvalds 已提交
152
{
153
	if (sb_any_quota_active(inode->i_sb)) {
154
		vfs_dq_init(inode);
L
Linus Torvalds 已提交
155 156 157 158 159 160
		if (inode->i_sb->dq_op->alloc_inode(inode, 1) == NO_QUOTA)
			return 1;
	}
	return 0;
}

161
static inline void vfs_dq_free_inode(struct inode *inode)
L
Linus Torvalds 已提交
162
{
163
	if (sb_any_quota_active(inode->i_sb))
L
Linus Torvalds 已提交
164 165 166
		inode->i_sb->dq_op->free_inode(inode, 1);
}

167
/* Cannot be called inside a transaction */
168
static inline int vfs_dq_off(struct super_block *sb, int remount)
L
Linus Torvalds 已提交
169 170 171
{
	int ret = -ENOSYS;

172 173 174 175 176
	if (sb->s_qcop && sb->s_qcop->quota_off)
		ret = sb->s_qcop->quota_off(sb, -1, remount);
	return ret;
}

L
Linus Torvalds 已提交
177 178
#else

179
static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type)
180 181 182 183
{
	return 0;
}

184
static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
185 186 187 188 189 190 191 192 193 194 195 196 197
{
	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;
}
198

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
/* 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 已提交
220 221 222 223 224
/*
 * NO-OP when quota not configured.
 */
#define sb_dquot_ops				(NULL)
#define sb_quotactl_ops				(NULL)
225

226
static inline void vfs_dq_init(struct inode *inode)
227 228 229
{
}

230
static inline void vfs_dq_drop(struct inode *inode)
231 232 233
{
}

234
static inline int vfs_dq_alloc_inode(struct inode *inode)
235 236 237 238
{
	return 0;
}

239
static inline void vfs_dq_free_inode(struct inode *inode)
240 241 242
{
}

243
static inline int vfs_dq_off(struct super_block *sb, int remount)
244 245 246 247
{
	return 0;
}

248
static inline int vfs_dq_quota_on_remount(struct super_block *sb)
249 250 251 252
{
	return 0;
}

253
static inline int vfs_dq_transfer(struct inode *inode, struct iattr *iattr)
254 255 256 257
{
	return 0;
}

258 259
static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
		int warn, int reserve)
L
Linus Torvalds 已提交
260
{
261 262
	if (!reserve)
		inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
263 264 265
	return 0;
}

266 267
static inline void __dquot_free_space(struct inode *inode, qsize_t number,
		int reserve)
L
Linus Torvalds 已提交
268
{
269 270
	if (!reserve)
		inode_sub_bytes(inode, number);
L
Linus Torvalds 已提交
271 272
}

273
static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
L
Linus Torvalds 已提交
274
{
275
	inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
276 277 278
	return 0;
}

279 280 281
#endif /* CONFIG_QUOTA */

static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
282
{
283
	return __dquot_alloc_space(inode, nr, 1, 0);
L
Linus Torvalds 已提交
284 285
}

286
static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
287
{
288 289 290 291 292 293
	int ret;

	ret = dquot_alloc_space_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
294 295
}

296
static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
297
{
298
	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
299 300
}

301
static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
302
{
303
	return dquot_alloc_space(inode, nr << inode->i_blkbits);
304 305
}

306
static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
307
{
308
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
L
Linus Torvalds 已提交
309 310
}

311
static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
312
{
313
	int ret;
L
Linus Torvalds 已提交
314

315 316 317 318
	ret = dquot_prealloc_block_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
319 320
}

321
static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
322
{
323
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
J
Jan Kara 已提交
324 325
}

326
static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
327
{
328
	int ret;
J
Jan Kara 已提交
329

330 331 332 333
	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
334 335
}

336
static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
337
{
338
	__dquot_free_space(inode, nr, 0);
339 340
}

341
static inline void dquot_free_space(struct inode *inode, qsize_t nr)
342
{
343 344
	dquot_free_space_nodirty(inode, nr);
	mark_inode_dirty(inode);
345 346
}

347
static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
348
{
349
	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
350 351
}

352
static inline void dquot_free_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
353
{
354
	dquot_free_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
355 356
}

357 358
static inline void dquot_release_reservation_block(struct inode *inode,
		qsize_t nr)
J
Jan Kara 已提交
359
{
360
	__dquot_free_space(inode, nr << inode->i_blkbits, 1);
J
Jan Kara 已提交
361
}
L
Linus Torvalds 已提交
362 363

#endif /* _LINUX_QUOTAOPS_ */