quotaops.h 8.9 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

17 18 19 20 21 22 23 24
/* i_mutex must being held */
static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
{
	return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) ||
		(ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) ||
		(ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid);
}

L
Linus Torvalds 已提交
25 26 27 28 29
#if defined(CONFIG_QUOTA)

/*
 * declaration of quota_function calls in kernel.
 */
30 31 32 33
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);

34
void dquot_initialize(struct inode *inode);
35
void dquot_drop(struct inode *inode);
36 37
struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
void dqput(struct dquot *dquot);
38 39 40
int dquot_scan_active(struct super_block *sb,
		      int (*fn)(struct dquot *dquot, unsigned long priv),
		      unsigned long priv);
41 42
struct dquot *dquot_alloc(struct super_block *sb, int type);
void dquot_destroy(struct dquot *dquot);
43

44 45 46
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);
47

48
int dquot_alloc_inode(const struct inode *inode);
49

50
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
51
void dquot_free_inode(const struct inode *inode);
52

53 54 55 56 57 58 59 60
int dquot_disable(struct super_block *sb, int type, unsigned int flags);
/* Suspend quotas on remount RO */
static inline int dquot_suspend(struct super_block *sb, int type)
{
	return dquot_disable(sb, type, DQUOT_SUSPENDED);
}
int dquot_resume(struct super_block *sb, int type);

61 62 63 64 65 66
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);

67 68
int dquot_file_open(struct inode *inode, struct file *file);

69 70
int vfs_quota_on(struct super_block *sb, int type, int format_id,
 	char *path, int remount);
71 72
int vfs_quota_enable(struct inode *inode, int type, int format_id,
	unsigned int flags);
73 74
int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
 	struct path *path);
75 76 77
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);
78
int vfs_quota_sync(struct super_block *sb, int type, int wait);
79 80
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);
C
Christoph Hellwig 已提交
81 82
int vfs_get_dqblk(struct super_block *sb, int type, qid_t id,
		struct fs_disk_quota *di);
C
Christoph Hellwig 已提交
83 84
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id,
		struct fs_disk_quota *di);
85

86
int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
87
int dquot_transfer(struct inode *inode, struct iattr *iattr);
L
Linus Torvalds 已提交
88

89 90 91 92
static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
{
	return sb_dqopt(sb)->info + type;
}
93 94 95 96 97

/*
 * Functions for checking status of quota
 */

98
static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
99
{
100 101
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_USAGE_ENABLED, type);
102
}
103

104
static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
105
{
106 107
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
108
}
109

110
static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
111
{
112 113
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_SUSPENDED, type);
114
}
115

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

124
/* Does kernel know about any quota information for given sb + type? */
125
static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
126 127 128 129 130
{
	/* Currently if anything is on, then quota usage is on as well */
	return sb_has_quota_usage_enabled(sb, type);
}

131
static inline unsigned sb_any_quota_loaded(struct super_block *sb)
132
{
133 134 135 136
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_loaded(sb, type) << type;
	return	tmsk;
137 138
}

139
static inline bool sb_has_quota_active(struct super_block *sb, int type)
140 141 142 143 144
{
	return sb_has_quota_loaded(sb, type) &&
	       !sb_has_quota_suspended(sb, type);
}

145
static inline unsigned sb_any_quota_active(struct super_block *sb)
146
{
147
	return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
148 149
}

L
Linus Torvalds 已提交
150 151 152
/*
 * Operations supported for diskquotas.
 */
153
extern const struct dquot_operations dquot_operations;
154
extern const struct quotactl_ops vfs_quotactl_ops;
L
Linus Torvalds 已提交
155 156 157 158 159 160

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

#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 dquot_initialize(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 dquot_transfer(struct inode *inode, struct iattr *iattr)
226 227 228 229
{
	return 0;
}

230 231
static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
		int warn, int reserve)
L
Linus Torvalds 已提交
232
{
233 234
	if (!reserve)
		inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
235 236 237
	return 0;
}

238 239
static inline void __dquot_free_space(struct inode *inode, qsize_t number,
		int reserve)
L
Linus Torvalds 已提交
240
{
241 242
	if (!reserve)
		inode_sub_bytes(inode, number);
L
Linus Torvalds 已提交
243 244
}

245
static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
L
Linus Torvalds 已提交
246
{
247
	inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
248
	return 0;
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
}

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

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

static inline int dquot_resume(struct super_block *sb, int type)
{
	return 0;
L
Linus Torvalds 已提交
265 266
}

267 268
#define dquot_file_open		generic_file_open

269 270 271
#endif /* CONFIG_QUOTA */

static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
272
{
273
	return __dquot_alloc_space(inode, nr, 1, 0);
L
Linus Torvalds 已提交
274 275
}

276
static inline int dquot_alloc_space(struct inode *inode, qsize_t nr)
277
{
278 279 280 281 282 283
	int ret;

	ret = dquot_alloc_space_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
284 285
}

286
static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
287
{
288
	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
289 290
}

291
static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
292
{
293
	return dquot_alloc_space(inode, nr << inode->i_blkbits);
294 295
}

296
static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
297
{
298
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0, 0);
L
Linus Torvalds 已提交
299 300
}

301
static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
302
{
303
	int ret;
L
Linus Torvalds 已提交
304

305 306 307 308
	ret = dquot_prealloc_block_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
309 310
}

311
static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
312
{
313
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 1, 1);
J
Jan Kara 已提交
314 315
}

316
static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
317
{
318
	int ret;
J
Jan Kara 已提交
319

320 321 322 323
	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
J
Jan Kara 已提交
324 325
}

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

331
static inline void dquot_free_space(struct inode *inode, qsize_t nr)
332
{
333 334
	dquot_free_space_nodirty(inode, nr);
	mark_inode_dirty(inode);
335 336
}

337
static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
338
{
339
	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
340 341
}

342
static inline void dquot_free_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
343
{
344
	dquot_free_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
345 346
}

347 348
static inline void dquot_release_reservation_block(struct inode *inode,
		qsize_t nr)
J
Jan Kara 已提交
349
{
350
	__dquot_free_space(inode, nr << inode->i_blkbits, 1);
J
Jan Kara 已提交
351
}
L
Linus Torvalds 已提交
352 353

#endif /* _LINUX_QUOTAOPS_ */