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

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

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);

59 60
int dquot_file_open(struct inode *inode, struct file *file);

61 62
int vfs_quota_on(struct super_block *sb, int type, int format_id,
 	char *path, int remount);
63 64
int vfs_quota_enable(struct inode *inode, int type, int format_id,
	unsigned int flags);
65 66
int vfs_quota_on_path(struct super_block *sb, int type, int format_id,
 	struct path *path);
67 68 69
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);
70
int vfs_quota_disable(struct super_block *sb, int type, unsigned int flags);
71
int vfs_quota_sync(struct super_block *sb, int type, int wait);
72 73
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 已提交
74 75
int vfs_get_dqblk(struct super_block *sb, int type, qid_t id,
		struct fs_disk_quota *di);
C
Christoph Hellwig 已提交
76 77
int vfs_set_dqblk(struct super_block *sb, int type, qid_t id,
		struct fs_disk_quota *di);
78

79
int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
80
int dquot_transfer(struct inode *inode, struct iattr *iattr);
81
int vfs_dq_quota_on_remount(struct super_block *sb);
L
Linus Torvalds 已提交
82

83 84 85 86
static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
{
	return sb_dqopt(sb)->info + type;
}
87 88 89 90 91

/*
 * Functions for checking status of quota
 */

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

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

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

110
static inline unsigned sb_any_quota_suspended(struct super_block *sb)
111
{
112 113 114 115
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_suspended(sb, type) << type;
	return tmsk;
116
}
117

118
/* Does kernel know about any quota information for given sb + type? */
119
static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
120 121 122 123 124
{
	/* Currently if anything is on, then quota usage is on as well */
	return sb_has_quota_usage_enabled(sb, type);
}

125
static inline unsigned sb_any_quota_loaded(struct super_block *sb)
126
{
127 128 129 130
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_loaded(sb, type) << type;
	return	tmsk;
131 132
}

133
static inline bool sb_has_quota_active(struct super_block *sb, int type)
134 135 136 137 138
{
	return sb_has_quota_loaded(sb, type) &&
	       !sb_has_quota_suspended(sb, type);
}

139
static inline unsigned sb_any_quota_active(struct super_block *sb)
140
{
141
	return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
142 143
}

L
Linus Torvalds 已提交
144 145 146
/*
 * Operations supported for diskquotas.
 */
147
extern const struct dquot_operations dquot_operations;
148
extern const struct quotactl_ops vfs_quotactl_ops;
L
Linus Torvalds 已提交
149 150 151 152

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

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

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

L
Linus Torvalds 已提交
163 164
#else

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

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

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

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

216
static inline void dquot_drop(struct inode *inode)
217 218 219
{
}

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

225
static inline void dquot_free_inode(const struct inode *inode)
226 227 228
{
}

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

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

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

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

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

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

265 266
#define dquot_file_open		generic_file_open

267 268 269
#endif /* CONFIG_QUOTA */

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

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

	ret = dquot_alloc_space_nodirty(inode, nr);
	if (!ret)
		mark_inode_dirty(inode);
	return ret;
282 283
}

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

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

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

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

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

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

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

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

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

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

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

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

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

#endif /* _LINUX_QUOTAOPS_ */