quotaops.h 8.7 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 51 52

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);
53 54
int vfs_quota_enable(struct inode *inode, int type, int format_id,
	unsigned int flags);
55 56
int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
 	struct path *path);
57 58 59
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);
60
int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
61
int vfs_quota_sync(struct super_block *sb, int type, int wait);
62 63 64 65 66
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);

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

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

/*
 * Functions for checking status of quota
 */

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

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

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

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

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

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

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

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

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

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

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

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

L
Linus Torvalds 已提交
159 160
#else

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

166
static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type)
167 168 169 170 171 172 173 174 175 176 177 178 179
{
	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;
}
180

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
/* 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 已提交
202 203 204 205 206
/*
 * NO-OP when quota not configured.
 */
#define sb_dquot_ops				(NULL)
#define sb_quotactl_ops				(NULL)
207

208
static inline void vfs_dq_init(struct inode *inode)
209 210 211
{
}

212
static inline void dquot_drop(struct inode *inode)
213 214 215
{
}

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

221
static inline void dquot_free_inode(const struct inode *inode)
222 223 224
{
}

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

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

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

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

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

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

261 262 263
#endif /* CONFIG_QUOTA */

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

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

	ret = dquot_alloc_space_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
276 277
}

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

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

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

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

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

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

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

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

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

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

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

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

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

#endif /* _LINUX_QUOTAOPS_ */