quotaops.h 9.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
#define DQUOT_SPACE_WARN	0x1
#define DQUOT_SPACE_RESERVE	0x2
14
#define DQUOT_SPACE_NOFAIL	0x4
15

16 17 18 19
static inline struct quota_info *sb_dqopt(struct super_block *sb)
{
	return &sb->s_dquot;
}
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) ||
25 26
		(ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) ||
		(ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
27 28
}

L
Linus Torvalds 已提交
29 30
#if defined(CONFIG_QUOTA)

31 32 33
#define quota_error(sb, fmt, args...) \
	__quota_error((sb), __func__, fmt , ## args)

34
extern __printf(3, 4)
35 36
void __quota_error(struct super_block *sb, const char *func,
		   const char *fmt, ...);
37

L
Linus Torvalds 已提交
38 39 40
/*
 * declaration of quota_function calls in kernel.
 */
41 42 43
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);
44
void inode_reclaim_rsv_space(struct inode *inode, qsize_t number);
45

46
void dquot_initialize(struct inode *inode);
47
void dquot_drop(struct inode *inode);
48
struct dquot *dqget(struct super_block *sb, struct kqid qid);
49
void dqput(struct dquot *dquot);
50 51 52
int dquot_scan_active(struct super_block *sb,
		      int (*fn)(struct dquot *dquot, unsigned long priv),
		      unsigned long priv);
53 54
struct dquot *dquot_alloc(struct super_block *sb, int type);
void dquot_destroy(struct dquot *dquot);
55

56 57
int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags);
void __dquot_free_space(struct inode *inode, qsize_t number, int flags);
58

59
int dquot_alloc_inode(const struct inode *inode);
60

61
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number);
62
void dquot_free_inode(const struct inode *inode);
63
void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number);
64

65 66 67 68 69 70 71 72
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);

73 74 75 76 77 78
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);

79 80
int dquot_file_open(struct inode *inode, struct file *file);

81
int dquot_enable(struct inode *inode, int type, int format_id,
82
	unsigned int flags);
83
int dquot_quota_on(struct super_block *sb, int type, int format_id,
84
 	struct path *path);
85
int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
86
 	int format_id, int type);
87
int dquot_quota_off(struct super_block *sb, int type);
88 89
int dquot_writeback_dquots(struct super_block *sb, int type);
int dquot_quota_sync(struct super_block *sb, int type);
90 91
int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
E
Eric W. Biederman 已提交
92
int dquot_get_dqblk(struct super_block *sb, struct kqid id,
C
Christoph Hellwig 已提交
93
		struct fs_disk_quota *di);
E
Eric W. Biederman 已提交
94
int dquot_set_dqblk(struct super_block *sb, struct kqid id,
C
Christoph Hellwig 已提交
95
		struct fs_disk_quota *di);
96

97
int __dquot_transfer(struct inode *inode, struct dquot **transfer_to);
98
int dquot_transfer(struct inode *inode, struct iattr *iattr);
L
Linus Torvalds 已提交
99

100 101 102 103
static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
{
	return sb_dqopt(sb)->info + type;
}
104 105 106 107 108

/*
 * Functions for checking status of quota
 */

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

115
static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type)
116
{
117 118
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_LIMITS_ENABLED, type);
119
}
120

121
static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
122
{
123 124
	return sb_dqopt(sb)->flags &
				dquot_state_flag(DQUOT_SUSPENDED, type);
125
}
126

127
static inline unsigned sb_any_quota_suspended(struct super_block *sb)
128
{
129 130 131 132
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_suspended(sb, type) << type;
	return tmsk;
133
}
134

135
/* Does kernel know about any quota information for given sb + type? */
136
static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
137 138 139 140 141
{
	/* Currently if anything is on, then quota usage is on as well */
	return sb_has_quota_usage_enabled(sb, type);
}

142
static inline unsigned sb_any_quota_loaded(struct super_block *sb)
143
{
144 145 146 147
	unsigned type, tmsk = 0;
	for (type = 0; type < MAXQUOTAS; type++)
		tmsk |= sb_has_quota_loaded(sb, type) << type;
	return	tmsk;
148 149
}

150
static inline bool sb_has_quota_active(struct super_block *sb, int type)
151 152 153 154 155
{
	return sb_has_quota_loaded(sb, type) &&
	       !sb_has_quota_suspended(sb, type);
}

L
Linus Torvalds 已提交
156 157 158
/*
 * Operations supported for diskquotas.
 */
159
extern const struct dquot_operations dquot_operations;
160
extern const struct quotactl_ops dquot_quotactl_ops;
161

L
Linus Torvalds 已提交
162 163
#else

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

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

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
/* 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;
}

200
static inline void dquot_initialize(struct inode *inode)
201 202 203
{
}

204
static inline void dquot_drop(struct inode *inode)
205 206 207
{
}

208
static inline int dquot_alloc_inode(const struct inode *inode)
209 210 211 212
{
	return 0;
}

213
static inline void dquot_free_inode(const struct inode *inode)
214 215 216
{
}

217
static inline int dquot_transfer(struct inode *inode, struct iattr *iattr)
218 219 220 221
{
	return 0;
}

222
static inline int __dquot_alloc_space(struct inode *inode, qsize_t number,
223
		int flags)
L
Linus Torvalds 已提交
224
{
225
	if (!(flags & DQUOT_SPACE_RESERVE))
226
		inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
227 228 229
	return 0;
}

230
static inline void __dquot_free_space(struct inode *inode, qsize_t number,
231
		int flags)
L
Linus Torvalds 已提交
232
{
233
	if (!(flags & DQUOT_SPACE_RESERVE))
234
		inode_sub_bytes(inode, number);
L
Linus Torvalds 已提交
235 236
}

237
static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
L
Linus Torvalds 已提交
238
{
239
	inode_add_bytes(inode, number);
L
Linus Torvalds 已提交
240 241 242
	return 0;
}

243 244 245 246 247 248 249
static inline int dquot_reclaim_space_nodirty(struct inode *inode,
					      qsize_t number)
{
	inode_sub_bytes(inode, number);
	return 0;
}

250 251 252 253 254 255 256 257 258 259 260 261 262 263
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 已提交
264 265
}

266 267
#define dquot_file_open		generic_file_open

268 269 270 271 272
static inline int dquot_writeback_dquots(struct super_block *sb, int type)
{
	return 0;
}

273 274 275
#endif /* CONFIG_QUOTA */

static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
276
{
277
	return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN);
L
Linus Torvalds 已提交
278 279
}

280 281 282
static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr)
{
	__dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL);
283
	mark_inode_dirty_sync(inode);
L
Linus Torvalds 已提交
284 285
}

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

	ret = dquot_alloc_space_nodirty(inode, nr);
291 292 293 294
	if (!ret) {
		/*
		 * Mark inode fully dirty. Since we are allocating blocks, inode
		 * would become fully dirty soon anyway and it reportedly
295
		 * reduces lock contention.
296 297 298
		 */
		mark_inode_dirty(inode);
	}
299
	return ret;
300 301
}

302
static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr)
303
{
304
	return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits);
305 306
}

307 308 309 310 311
static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr)
{
	dquot_alloc_space_nofail(inode, nr << inode->i_blkbits);
}

312
static inline int dquot_alloc_block(struct inode *inode, qsize_t nr)
313
{
314
	return dquot_alloc_space(inode, nr << inode->i_blkbits);
315 316
}

317
static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
318
{
319
	return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0);
L
Linus Torvalds 已提交
320 321
}

322
static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr)
L
Linus Torvalds 已提交
323
{
324
	int ret;
L
Linus Torvalds 已提交
325

326 327
	ret = dquot_prealloc_block_nodirty(inode, nr);
	if (!ret)
328
		mark_inode_dirty_sync(inode);
329
	return ret;
J
Jan Kara 已提交
330 331
}

332
static inline int dquot_reserve_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
333
{
334 335
	return __dquot_alloc_space(inode, nr << inode->i_blkbits,
				DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE);
J
Jan Kara 已提交
336 337
}

338
static inline int dquot_claim_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
339
{
340
	int ret;
J
Jan Kara 已提交
341

342 343
	ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits);
	if (!ret)
344
		mark_inode_dirty_sync(inode);
345
	return ret;
J
Jan Kara 已提交
346 347
}

348 349 350 351 352 353
static inline void dquot_reclaim_block(struct inode *inode, qsize_t nr)
{
	dquot_reclaim_space_nodirty(inode, nr << inode->i_blkbits);
	mark_inode_dirty_sync(inode);
}

354
static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr)
355
{
356
	__dquot_free_space(inode, nr, 0);
357 358
}

359
static inline void dquot_free_space(struct inode *inode, qsize_t nr)
360
{
361
	dquot_free_space_nodirty(inode, nr);
362
	mark_inode_dirty_sync(inode);
363 364
}

365
static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr)
366
{
367
	dquot_free_space_nodirty(inode, nr << inode->i_blkbits);
368 369
}

370
static inline void dquot_free_block(struct inode *inode, qsize_t nr)
J
Jan Kara 已提交
371
{
372
	dquot_free_space(inode, nr << inode->i_blkbits);
J
Jan Kara 已提交
373 374
}

375 376
static inline void dquot_release_reservation_block(struct inode *inode,
		qsize_t nr)
J
Jan Kara 已提交
377
{
378
	__dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE);
J
Jan Kara 已提交
379
}
L
Linus Torvalds 已提交
380 381

#endif /* _LINUX_QUOTAOPS_ */