dquot.c 78.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
/*
 * Implementation of the diskquota system for the LINUX operating system. QUOTA
 * is implemented using the BSD system call interface as the means of
 * communication with the user level. This file contains the generic routines
 * called by the different filesystems on allocation of an inode or block.
 * These routines take care of the administration needed to have a consistent
 * diskquota tracking system. The ideas of both user and group quotas are based
 * on the Melbourne quota system as used on BSD derived systems. The internal
 * implementation is based on one of the several variants of the LINUX
 * inode-subsystem with added complexity of the diskquota system.
 * 
 * Author:	Marco van Wieringen <mvw@planets.elm.net>
 *
 * Fixes:   Dmitry Gorodchanin <pgmdsg@ibi.com>, 11 Feb 96
 *
 *		Revised list management to avoid races
 *		-- Bill Hawes, <whawes@star.net>, 9/98
 *
 *		Fixed races in dquot_transfer(), dqget() and dquot_alloc_...().
 *		As the consequence the locking was moved from dquot_decr_...(),
 *		dquot_incr_...() to calling functions.
 *		invalidate_dquots() now writes modified dquots.
 *		Serialized quota_off() and quota_on() for mount point.
 *		Fixed a few bugs in grow_dquots().
 *		Fixed deadlock in write_dquot() - we no longer account quotas on
 *		quota files
 *		remove_dquot_ref() moved to inode.c - it now traverses through inodes
 *		add_dquot_ref() restarts after blocking
 *		Added check for bogus uid and fixed check for group in quotactl.
 *		Jan Kara, <jack@suse.cz>, sponsored by SuSE CR, 10-11/99
 *
 *		Used struct list_head instead of own list struct
 *		Invalidation of referenced dquots is no longer possible
 *		Improved free_dquots list management
 *		Quota and i_blocks are now updated in one place to avoid races
 *		Warnings are now delayed so we won't block in critical section
 *		Write updated not to require dquot lock
 *		Jan Kara, <jack@suse.cz>, 9/2000
 *
 *		Added dynamic quota structure allocation
 *		Jan Kara <jack@suse.cz> 12/2000
 *
 *		Rewritten quota interface. Implemented new quota format and
 *		formats registering.
 *		Jan Kara, <jack@suse.cz>, 2001,2002
 *
 *		New SMP locking.
 *		Jan Kara, <jack@suse.cz>, 10/2002
 *
 *		Added journalled quota support, fix lock inversion problems
 *		Jan Kara, <jack@suse.cz>, 2003,2004
 *
 * (C) Copyright 1994 - 1997 Marco van Wieringen 
 */

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/mm.h>
#include <linux/time.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/stat.h>
#include <linux/tty.h>
#include <linux/file.h>
#include <linux/slab.h>
#include <linux/sysctl.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/security.h>
A
Al Viro 已提交
74
#include <linux/sched.h>
75
#include <linux/cred.h>
L
Linus Torvalds 已提交
76 77
#include <linux/kmod.h>
#include <linux/namei.h>
78
#include <linux/capability.h>
A
Adrian Bunk 已提交
79
#include <linux/quotaops.h>
80
#include "../internal.h" /* ugh */
L
Linus Torvalds 已提交
81

82
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
83 84

/*
85 86 87 88 89 90 91 92 93 94
 * There are five quota SMP locks:
 * * dq_list_lock protects all lists with quotas and quota formats.
 * * dquot->dq_dqb_lock protects data from dq_dqb
 * * inode->i_lock protects inode->i_blocks, i_bytes and also guards
 *   consistency of dquot->dq_dqb with inode->i_blocks, i_bytes so that
 *   dquot_transfer() can stabilize amount it transfers
 * * dq_data_lock protects mem_dqinfo structures and modifications of dquot
 *   pointers in the inode
 * * dq_state_lock protects modifications of quota state (on quotaon and
 *   quotaoff) and readers who care about latest values take it as well.
L
Linus Torvalds 已提交
95
 *
96 97
 * The spinlock ordering is hence:
 *   dq_data_lock > dq_list_lock > i_lock > dquot->dq_dqb_lock,
J
Jan Kara 已提交
98
 *   dq_list_lock > dq_state_lock
L
Linus Torvalds 已提交
99 100 101 102
 *
 * Note that some things (eg. sb pointer, type, id) doesn't change during
 * the life of the dquot structure and so needn't to be protected by a lock
 *
N
Niu Yawei 已提交
103 104 105 106 107 108
 * Operation accessing dquots via inode pointers are protected by dquot_srcu.
 * Operation of reading pointer needs srcu_read_lock(&dquot_srcu), and
 * synchronize_srcu(&dquot_srcu) is called after clearing pointers from
 * inode and before dropping dquot references to avoid use of dquots after
 * they are freed. dq_data_lock is used to serialize the pointer setting and
 * clearing operations.
J
Jan Kara 已提交
109 110
 * Special care needs to be taken about S_NOQUOTA inode flag (marking that
 * inode is a quota file). Functions adding pointers from inode to dquots have
N
Niu Yawei 已提交
111 112
 * to check this flag under dq_data_lock and then (if S_NOQUOTA is not set) they
 * have to do all pointer modifications before dropping dq_data_lock. This makes
J
Jan Kara 已提交
113 114
 * sure they cannot race with quotaon which first sets S_NOQUOTA flag and
 * then drops all pointers to dquots from an inode.
L
Linus Torvalds 已提交
115
 *
116 117 118 119 120
 * Each dquot has its dq_lock mutex.  Dquot is locked when it is being read to
 * memory (or space for it is being allocated) on the first dqget(), when it is
 * being written out, and when it is being released on the last dqput(). The
 * allocation and release operations are serialized by the dq_lock and by
 * checking the use count in dquot_release().
L
Linus Torvalds 已提交
121 122
 *
 * Lock ordering (including related VFS locks) is the following:
J
Jan Kara 已提交
123
 *   s_umount > i_mutex > journal_lock > dquot->dq_lock > dqio_sem
L
Linus Torvalds 已提交
124 125
 */

126 127 128
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_list_lock);
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_state_lock);
__cacheline_aligned_in_smp DEFINE_SPINLOCK(dq_data_lock);
129
EXPORT_SYMBOL(dq_data_lock);
N
Niu Yawei 已提交
130
DEFINE_STATIC_SRCU(dquot_srcu);
L
Linus Torvalds 已提交
131

132 133
static DECLARE_WAIT_QUEUE_HEAD(dquot_ref_wq);

134
void __quota_error(struct super_block *sb, const char *func,
135
		   const char *fmt, ...)
136 137
{
	if (printk_ratelimit()) {
138 139 140
		va_list args;
		struct va_format vaf;

141
		va_start(args, fmt);
142 143 144 145 146 147 148

		vaf.fmt = fmt;
		vaf.va = &args;

		printk(KERN_ERR "Quota error (device %s): %s: %pV\n",
		       sb->s_id, func, &vaf);

149 150 151 152 153
		va_end(args);
	}
}
EXPORT_SYMBOL(__quota_error);

154
#if defined(CONFIG_QUOTA_DEBUG) || defined(CONFIG_PRINT_QUOTA_WARNING)
L
Linus Torvalds 已提交
155
static char *quotatypes[] = INITQFNAMES;
156
#endif
L
Linus Torvalds 已提交
157 158 159 160
static struct quota_format_type *quota_formats;	/* List of registered formats */
static struct quota_module_name module_names[] = INIT_QUOTA_MODULE_NAMES;

/* SLAB cache for dquot structures */
161
static struct kmem_cache *dquot_cachep;
L
Linus Torvalds 已提交
162 163 164 165 166 167 168 169 170

int register_quota_format(struct quota_format_type *fmt)
{
	spin_lock(&dq_list_lock);
	fmt->qf_next = quota_formats;
	quota_formats = fmt;
	spin_unlock(&dq_list_lock);
	return 0;
}
171
EXPORT_SYMBOL(register_quota_format);
L
Linus Torvalds 已提交
172 173 174 175 176 177

void unregister_quota_format(struct quota_format_type *fmt)
{
	struct quota_format_type **actqf;

	spin_lock(&dq_list_lock);
J
Jan Kara 已提交
178 179 180
	for (actqf = &quota_formats; *actqf && *actqf != fmt;
	     actqf = &(*actqf)->qf_next)
		;
L
Linus Torvalds 已提交
181 182 183 184
	if (*actqf)
		*actqf = (*actqf)->qf_next;
	spin_unlock(&dq_list_lock);
}
185
EXPORT_SYMBOL(unregister_quota_format);
L
Linus Torvalds 已提交
186 187 188 189 190 191

static struct quota_format_type *find_quota_format(int id)
{
	struct quota_format_type *actqf;

	spin_lock(&dq_list_lock);
J
Jan Kara 已提交
192 193 194
	for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id;
	     actqf = actqf->qf_next)
		;
L
Linus Torvalds 已提交
195 196 197 198 199
	if (!actqf || !try_module_get(actqf->qf_owner)) {
		int qm;

		spin_unlock(&dq_list_lock);
		
J
Jan Kara 已提交
200 201 202 203 204
		for (qm = 0; module_names[qm].qm_fmt_id &&
			     module_names[qm].qm_fmt_id != id; qm++)
			;
		if (!module_names[qm].qm_fmt_id ||
		    request_module(module_names[qm].qm_mod_name))
L
Linus Torvalds 已提交
205 206 207
			return NULL;

		spin_lock(&dq_list_lock);
J
Jan Kara 已提交
208 209 210
		for (actqf = quota_formats; actqf && actqf->qf_fmt_id != id;
		     actqf = actqf->qf_next)
			;
L
Linus Torvalds 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
		if (actqf && !try_module_get(actqf->qf_owner))
			actqf = NULL;
	}
	spin_unlock(&dq_list_lock);
	return actqf;
}

static void put_quota_format(struct quota_format_type *fmt)
{
	module_put(fmt->qf_owner);
}

/*
 * Dquot List Management:
 * The quota code uses three lists for dquot management: the inuse_list,
 * free_dquots, and dquot_hash[] array. A single dquot structure may be
 * on all three lists, depending on its current state.
 *
 * All dquots are placed to the end of inuse_list when first created, and this
 * list is used for invalidate operation, which must look at every dquot.
 *
 * Unused dquots (dq_count == 0) are added to the free_dquots list when freed,
 * and this list is searched whenever we need an available dquot.  Dquots are
 * removed from the list as soon as they are used again, and
 * dqstats.free_dquots gives the number of dquots on the list. When
 * dquot is invalidated it's completely released from memory.
 *
 * Dquots with a specific identity (device, type and id) are placed on
 * one of the dquot_hash[] hash chains. The provides an efficient search
 * mechanism to locate a specific dquot.
 */

static LIST_HEAD(inuse_list);
static LIST_HEAD(free_dquots);
static unsigned int dq_hash_bits, dq_hash_mask;
static struct hlist_head *dquot_hash;

struct dqstats dqstats;
249
EXPORT_SYMBOL(dqstats);
L
Linus Torvalds 已提交
250

251
static qsize_t inode_get_rsv_space(struct inode *inode);
252
static qsize_t __inode_get_rsv_space(struct inode *inode);
253
static int __dquot_initialize(struct inode *inode, int type);
254

L
Linus Torvalds 已提交
255
static inline unsigned int
E
Eric W. Biederman 已提交
256
hashfn(const struct super_block *sb, struct kqid qid)
L
Linus Torvalds 已提交
257
{
E
Eric W. Biederman 已提交
258 259
	unsigned int id = from_kqid(&init_user_ns, qid);
	int type = qid.type;
L
Linus Torvalds 已提交
260 261 262 263 264 265 266 267 268 269 270
	unsigned long tmp;

	tmp = (((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type);
	return (tmp + (tmp >> dq_hash_bits)) & dq_hash_mask;
}

/*
 * Following list functions expect dq_list_lock to be held
 */
static inline void insert_dquot_hash(struct dquot *dquot)
{
J
Jan Kara 已提交
271
	struct hlist_head *head;
E
Eric W. Biederman 已提交
272
	head = dquot_hash + hashfn(dquot->dq_sb, dquot->dq_id);
L
Linus Torvalds 已提交
273 274 275 276 277 278 279 280
	hlist_add_head(&dquot->dq_hash, head);
}

static inline void remove_dquot_hash(struct dquot *dquot)
{
	hlist_del_init(&dquot->dq_hash);
}

J
Jan Kara 已提交
281
static struct dquot *find_dquot(unsigned int hashent, struct super_block *sb,
E
Eric W. Biederman 已提交
282
				struct kqid qid)
L
Linus Torvalds 已提交
283 284 285 286 287 288
{
	struct hlist_node *node;
	struct dquot *dquot;

	hlist_for_each (node, dquot_hash+hashent) {
		dquot = hlist_entry(node, struct dquot, dq_hash);
289
		if (dquot->dq_sb == sb && qid_eq(dquot->dq_id, qid))
L
Linus Torvalds 已提交
290 291
			return dquot;
	}
J
Jan Kara 已提交
292
	return NULL;
L
Linus Torvalds 已提交
293 294 295 296 297
}

/* Add a dquot to the tail of the free list */
static inline void put_dquot_last(struct dquot *dquot)
{
298
	list_add_tail(&dquot->dq_free, &free_dquots);
299
	dqstats_inc(DQST_FREE_DQUOTS);
L
Linus Torvalds 已提交
300 301 302 303 304 305 306
}

static inline void remove_free_dquot(struct dquot *dquot)
{
	if (list_empty(&dquot->dq_free))
		return;
	list_del_init(&dquot->dq_free);
307
	dqstats_dec(DQST_FREE_DQUOTS);
L
Linus Torvalds 已提交
308 309 310 311 312 313
}

static inline void put_inuse(struct dquot *dquot)
{
	/* We add to the back of inuse list so we don't have to restart
	 * when traversing this list and we block */
314
	list_add_tail(&dquot->dq_inuse, &inuse_list);
315
	dqstats_inc(DQST_ALLOC_DQUOTS);
L
Linus Torvalds 已提交
316 317 318 319
}

static inline void remove_inuse(struct dquot *dquot)
{
320
	dqstats_dec(DQST_ALLOC_DQUOTS);
L
Linus Torvalds 已提交
321 322 323 324 325 326 327 328
	list_del(&dquot->dq_inuse);
}
/*
 * End of list functions needing dq_list_lock
 */

static void wait_on_dquot(struct dquot *dquot)
{
I
Ingo Molnar 已提交
329 330
	mutex_lock(&dquot->dq_lock);
	mutex_unlock(&dquot->dq_lock);
L
Linus Torvalds 已提交
331 332
}

J
Jan Kara 已提交
333 334 335 336 337 338 339 340 341
static inline int dquot_dirty(struct dquot *dquot)
{
	return test_bit(DQ_MOD_B, &dquot->dq_flags);
}

static inline int mark_dquot_dirty(struct dquot *dquot)
{
	return dquot->dq_sb->dq_op->mark_dirty(dquot);
}
L
Linus Torvalds 已提交
342

343
/* Mark dquot dirty in atomic manner, and return it's old dirty flag state */
L
Linus Torvalds 已提交
344 345
int dquot_mark_dquot_dirty(struct dquot *dquot)
{
346 347
	int ret = 1;

J
Jan Kara 已提交
348 349 350
	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
		return 0;

351 352 353
	if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY)
		return test_and_set_bit(DQ_MOD_B, &dquot->dq_flags);

354 355 356 357
	/* If quota is dirty already, we don't have to acquire dq_list_lock */
	if (test_bit(DQ_MOD_B, &dquot->dq_flags))
		return 1;

L
Linus Torvalds 已提交
358
	spin_lock(&dq_list_lock);
359
	if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags)) {
L
Linus Torvalds 已提交
360
		list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)->
361
				info[dquot->dq_id.type].dqi_dirty_list);
362 363
		ret = 0;
	}
L
Linus Torvalds 已提交
364
	spin_unlock(&dq_list_lock);
365
	return ret;
L
Linus Torvalds 已提交
366
}
367
EXPORT_SYMBOL(dquot_mark_dquot_dirty);
L
Linus Torvalds 已提交
368

369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
/* Dirtify all the dquots - this can block when journalling */
static inline int mark_all_dquot_dirty(struct dquot * const *dquot)
{
	int ret, err, cnt;

	ret = err = 0;
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		if (dquot[cnt])
			/* Even in case of error we have to continue */
			ret = mark_dquot_dirty(dquot[cnt]);
		if (!err)
			err = ret;
	}
	return err;
}

static inline void dqput_all(struct dquot **dquot)
{
	unsigned int cnt;

	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
		dqput(dquot[cnt]);
}

L
Linus Torvalds 已提交
393 394
static inline int clear_dquot_dirty(struct dquot *dquot)
{
395 396 397
	if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY)
		return test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags);

398 399 400
	spin_lock(&dq_list_lock);
	if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags)) {
		spin_unlock(&dq_list_lock);
L
Linus Torvalds 已提交
401
		return 0;
402
	}
L
Linus Torvalds 已提交
403
	list_del_init(&dquot->dq_dirty);
404
	spin_unlock(&dq_list_lock);
L
Linus Torvalds 已提交
405 406 407 408 409
	return 1;
}

void mark_info_dirty(struct super_block *sb, int type)
{
410 411 412
	spin_lock(&dq_data_lock);
	sb_dqopt(sb)->info[type].dqi_flags |= DQF_INFO_DIRTY;
	spin_unlock(&dq_data_lock);
L
Linus Torvalds 已提交
413 414 415 416 417 418 419 420 421 422 423 424
}
EXPORT_SYMBOL(mark_info_dirty);

/*
 *	Read dquot from disk and alloc space for it
 */

int dquot_acquire(struct dquot *dquot)
{
	int ret = 0, ret2 = 0;
	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);

I
Ingo Molnar 已提交
425
	mutex_lock(&dquot->dq_lock);
L
Linus Torvalds 已提交
426
	if (!test_bit(DQ_READ_B, &dquot->dq_flags))
427
		ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot);
L
Linus Torvalds 已提交
428 429
	if (ret < 0)
		goto out_iolock;
430 431
	/* Make sure flags update is visible after dquot has been filled */
	smp_mb__before_atomic();
L
Linus Torvalds 已提交
432 433 434
	set_bit(DQ_READ_B, &dquot->dq_flags);
	/* Instantiate dquot if needed */
	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) {
435
		ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot);
L
Linus Torvalds 已提交
436
		/* Write the info if needed */
437 438 439
		if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
			ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
					dquot->dq_sb, dquot->dq_id.type);
J
Jan Kara 已提交
440
		}
L
Linus Torvalds 已提交
441 442 443 444 445 446 447
		if (ret < 0)
			goto out_iolock;
		if (ret2 < 0) {
			ret = ret2;
			goto out_iolock;
		}
	}
448 449 450 451 452
	/*
	 * Make sure flags update is visible after on-disk struct has been
	 * allocated. Paired with smp_rmb() in dqget().
	 */
	smp_mb__before_atomic();
L
Linus Torvalds 已提交
453 454
	set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
out_iolock:
I
Ingo Molnar 已提交
455
	mutex_unlock(&dquot->dq_lock);
L
Linus Torvalds 已提交
456 457
	return ret;
}
458
EXPORT_SYMBOL(dquot_acquire);
L
Linus Torvalds 已提交
459 460 461 462 463 464

/*
 *	Write dquot to disk
 */
int dquot_commit(struct dquot *dquot)
{
465
	int ret = 0;
L
Linus Torvalds 已提交
466 467
	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);

468
	mutex_lock(&dquot->dq_lock);
469
	if (!clear_dquot_dirty(dquot))
470
		goto out_lock;
L
Linus Torvalds 已提交
471 472
	/* Inactive dquot can be only if there was error during read/init
	 * => we have better not writing it */
473
	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
474
		ret = dqopt->ops[dquot->dq_id.type]->commit_dqblk(dquot);
475 476
	else
		ret = -EIO;
477 478
out_lock:
	mutex_unlock(&dquot->dq_lock);
L
Linus Torvalds 已提交
479 480
	return ret;
}
481
EXPORT_SYMBOL(dquot_commit);
L
Linus Torvalds 已提交
482 483 484 485 486 487 488 489 490

/*
 *	Release dquot
 */
int dquot_release(struct dquot *dquot)
{
	int ret = 0, ret2 = 0;
	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);

I
Ingo Molnar 已提交
491
	mutex_lock(&dquot->dq_lock);
L
Linus Torvalds 已提交
492 493 494
	/* Check whether we are not racing with some other dqget() */
	if (atomic_read(&dquot->dq_count) > 1)
		goto out_dqlock;
495 496
	if (dqopt->ops[dquot->dq_id.type]->release_dqblk) {
		ret = dqopt->ops[dquot->dq_id.type]->release_dqblk(dquot);
L
Linus Torvalds 已提交
497
		/* Write the info */
498 499 500
		if (info_dirty(&dqopt->info[dquot->dq_id.type])) {
			ret2 = dqopt->ops[dquot->dq_id.type]->write_file_info(
						dquot->dq_sb, dquot->dq_id.type);
J
Jan Kara 已提交
501
		}
L
Linus Torvalds 已提交
502 503 504 505 506
		if (ret >= 0)
			ret = ret2;
	}
	clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
out_dqlock:
I
Ingo Molnar 已提交
507
	mutex_unlock(&dquot->dq_lock);
L
Linus Torvalds 已提交
508 509
	return ret;
}
510
EXPORT_SYMBOL(dquot_release);
L
Linus Torvalds 已提交
511

512
void dquot_destroy(struct dquot *dquot)
513 514 515
{
	kmem_cache_free(dquot_cachep, dquot);
}
516
EXPORT_SYMBOL(dquot_destroy);
517 518 519 520 521 522

static inline void do_destroy_dquot(struct dquot *dquot)
{
	dquot->dq_sb->dq_op->destroy_dquot(dquot);
}

L
Linus Torvalds 已提交
523 524
/* Invalidate all dquots on the list. Note that this function is called after
 * quota is disabled and pointers from inodes removed so there cannot be new
525 526
 * quota users. There can still be some users of quotas due to inodes being
 * just deleted or pruned by prune_icache() (those are not attached to any
J
Jan Kara 已提交
527
 * list) or parallel quotactl call. We have to wait for such users.
528
 */
L
Linus Torvalds 已提交
529 530
static void invalidate_dquots(struct super_block *sb, int type)
{
531
	struct dquot *dquot, *tmp;
L
Linus Torvalds 已提交
532

533
restart:
L
Linus Torvalds 已提交
534
	spin_lock(&dq_list_lock);
535
	list_for_each_entry_safe(dquot, tmp, &inuse_list, dq_inuse) {
L
Linus Torvalds 已提交
536 537
		if (dquot->dq_sb != sb)
			continue;
538
		if (dquot->dq_id.type != type)
L
Linus Torvalds 已提交
539
			continue;
540 541
		/* Wait for dquot users */
		if (atomic_read(&dquot->dq_count)) {
542
			dqgrab(dquot);
543
			spin_unlock(&dq_list_lock);
544 545
			/*
			 * Once dqput() wakes us up, we know it's time to free
546 547 548 549 550 551
			 * the dquot.
			 * IMPORTANT: we rely on the fact that there is always
			 * at most one process waiting for dquot to free.
			 * Otherwise dq_count would be > 1 and we would never
			 * wake up.
			 */
552 553
			wait_event(dquot_ref_wq,
				   atomic_read(&dquot->dq_count) == 1);
554 555 556 557 558 559 560 561 562 563
			dqput(dquot);
			/* At this moment dquot() need not exist (it could be
			 * reclaimed by prune_dqcache(). Hence we must
			 * restart. */
			goto restart;
		}
		/*
		 * Quota now has no users and it has been written on last
		 * dqput()
		 */
L
Linus Torvalds 已提交
564 565 566
		remove_dquot_hash(dquot);
		remove_free_dquot(dquot);
		remove_inuse(dquot);
567
		do_destroy_dquot(dquot);
L
Linus Torvalds 已提交
568 569 570 571
	}
	spin_unlock(&dq_list_lock);
}

572 573 574 575 576 577 578 579
/* Call callback for every active dquot on given filesystem */
int dquot_scan_active(struct super_block *sb,
		      int (*fn)(struct dquot *dquot, unsigned long priv),
		      unsigned long priv)
{
	struct dquot *dquot, *old_dquot = NULL;
	int ret = 0;

580 581
	WARN_ON_ONCE(!rwsem_is_locked(&sb->s_umount));

582 583 584 585 586 587 588 589 590
	spin_lock(&dq_list_lock);
	list_for_each_entry(dquot, &inuse_list, dq_inuse) {
		if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
			continue;
		if (dquot->dq_sb != sb)
			continue;
		/* Now we have active dquot so we can just increase use count */
		atomic_inc(&dquot->dq_count);
		spin_unlock(&dq_list_lock);
591
		dqstats_inc(DQST_LOOKUPS);
592 593
		dqput(old_dquot);
		old_dquot = dquot;
594 595 596 597 598 599 600 601 602 603 604
		/*
		 * ->release_dquot() can be racing with us. Our reference
		 * protects us from new calls to it so just wait for any
		 * outstanding call and recheck the DQ_ACTIVE_B after that.
		 */
		wait_on_dquot(dquot);
		if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
			ret = fn(dquot, priv);
			if (ret < 0)
				goto out;
		}
605 606 607 608 609 610 611 612 613
		spin_lock(&dq_list_lock);
		/* We are safe to continue now because our dquot could not
		 * be moved out of the inuse list while we hold the reference */
	}
	spin_unlock(&dq_list_lock);
out:
	dqput(old_dquot);
	return ret;
}
614
EXPORT_SYMBOL(dquot_scan_active);
615

616 617
/* Write all dquot structures to quota files */
int dquot_writeback_dquots(struct super_block *sb, int type)
L
Linus Torvalds 已提交
618 619 620 621 622
{
	struct list_head *dirty;
	struct dquot *dquot;
	struct quota_info *dqopt = sb_dqopt(sb);
	int cnt;
623
	int err, ret = 0;
L
Linus Torvalds 已提交
624

625 626
	WARN_ON_ONCE(!rwsem_is_locked(&sb->s_umount));

L
Linus Torvalds 已提交
627 628 629
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		if (type != -1 && cnt != type)
			continue;
630
		if (!sb_has_quota_active(sb, cnt))
L
Linus Torvalds 已提交
631 632 633 634
			continue;
		spin_lock(&dq_list_lock);
		dirty = &dqopt->info[cnt].dqi_dirty_list;
		while (!list_empty(dirty)) {
J
Jan Kara 已提交
635 636
			dquot = list_first_entry(dirty, struct dquot,
						 dq_dirty);
J
Jan Kara 已提交
637 638 639

			WARN_ON(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));

L
Linus Torvalds 已提交
640 641 642
			/* Now we have active dquot from which someone is
 			 * holding reference so we can safely just increase
			 * use count */
643
			dqgrab(dquot);
L
Linus Torvalds 已提交
644
			spin_unlock(&dq_list_lock);
645
			dqstats_inc(DQST_LOOKUPS);
646
			err = sb->dq_op->write_dquot(dquot);
Z
zhangyi (F) 已提交
647 648 649 650 651 652 653 654 655
			if (err) {
				/*
				 * Clear dirty bit anyway to avoid infinite
				 * loop here.
				 */
				clear_dquot_dirty(dquot);
				if (!ret)
					ret = err;
			}
L
Linus Torvalds 已提交
656 657 658 659 660 661 662
			dqput(dquot);
			spin_lock(&dq_list_lock);
		}
		spin_unlock(&dq_list_lock);
	}

	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
663 664
		if ((cnt == type || type == -1) && sb_has_quota_active(sb, cnt)
		    && info_dirty(&dqopt->info[cnt]))
L
Linus Torvalds 已提交
665
			sb->dq_op->write_info(sb, cnt);
666
	dqstats_inc(DQST_SYNCS);
L
Linus Torvalds 已提交
667

668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
	return ret;
}
EXPORT_SYMBOL(dquot_writeback_dquots);

/* Write all dquot structures to disk and make them visible from userspace */
int dquot_quota_sync(struct super_block *sb, int type)
{
	struct quota_info *dqopt = sb_dqopt(sb);
	int cnt;
	int ret;

	ret = dquot_writeback_dquots(sb, type);
	if (ret)
		return ret;
	if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
		return 0;

	/* This is not very clever (and fast) but currently I don't know about
	 * any other simple way of getting quota data to disk and we must get
	 * them there for userspace to be visible... */
	if (sb->s_op->sync_fs)
		sb->s_op->sync_fs(sb, 1);
	sync_blockdev(sb->s_bdev);

	/*
	 * Now when everything is written we can discard the pagecache so
	 * that userspace sees the changes.
	 */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		if (type != -1 && cnt != type)
			continue;
		if (!sb_has_quota_active(sb, cnt))
			continue;
A
Al Viro 已提交
701
		inode_lock(dqopt->files[cnt]);
702
		truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
A
Al Viro 已提交
703
		inode_unlock(dqopt->files[cnt]);
704 705
	}

L
Linus Torvalds 已提交
706 707
	return 0;
}
708
EXPORT_SYMBOL(dquot_quota_sync);
L
Linus Torvalds 已提交
709

710 711
static unsigned long
dqcache_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
L
Linus Torvalds 已提交
712 713 714
{
	struct list_head *head;
	struct dquot *dquot;
715
	unsigned long freed = 0;
L
Linus Torvalds 已提交
716

717
	spin_lock(&dq_list_lock);
L
Linus Torvalds 已提交
718
	head = free_dquots.prev;
719
	while (head != &free_dquots && sc->nr_to_scan) {
L
Linus Torvalds 已提交
720 721 722 723
		dquot = list_entry(head, struct dquot, dq_free);
		remove_dquot_hash(dquot);
		remove_free_dquot(dquot);
		remove_inuse(dquot);
724
		do_destroy_dquot(dquot);
725 726
		sc->nr_to_scan--;
		freed++;
L
Linus Torvalds 已提交
727 728
		head = free_dquots.prev;
	}
729
	spin_unlock(&dq_list_lock);
730
	return freed;
L
Linus Torvalds 已提交
731 732
}

733 734
static unsigned long
dqcache_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
L
Linus Torvalds 已提交
735
{
736 737
	return vfs_pressure_ratio(
	percpu_counter_read_positive(&dqstats.counter[DQST_FREE_DQUOTS]));
L
Linus Torvalds 已提交
738 739
}

740
static struct shrinker dqcache_shrinker = {
741 742
	.count_objects = dqcache_shrink_count,
	.scan_objects = dqcache_shrink_scan,
743 744 745
	.seeks = DEFAULT_SEEKS,
};

L
Linus Torvalds 已提交
746 747 748
/*
 * Put reference to dquot
 */
749
void dqput(struct dquot *dquot)
L
Linus Torvalds 已提交
750
{
751 752
	int ret;

L
Linus Torvalds 已提交
753 754
	if (!dquot)
		return;
755
#ifdef CONFIG_QUOTA_DEBUG
L
Linus Torvalds 已提交
756
	if (!atomic_read(&dquot->dq_count)) {
757
		quota_error(dquot->dq_sb, "trying to free free dquot of %s %d",
758 759
			    quotatypes[dquot->dq_id.type],
			    from_kqid(&init_user_ns, dquot->dq_id));
L
Linus Torvalds 已提交
760 761 762
		BUG();
	}
#endif
763
	dqstats_inc(DQST_DROPS);
L
Linus Torvalds 已提交
764 765 766 767 768
we_slept:
	spin_lock(&dq_list_lock);
	if (atomic_read(&dquot->dq_count) > 1) {
		/* We have more than one user... nothing to do */
		atomic_dec(&dquot->dq_count);
769
		/* Releasing dquot during quotaoff phase? */
770
		if (!sb_has_quota_active(dquot->dq_sb, dquot->dq_id.type) &&
771
		    atomic_read(&dquot->dq_count) == 1)
772
			wake_up(&dquot_ref_wq);
L
Linus Torvalds 已提交
773 774 775 776
		spin_unlock(&dq_list_lock);
		return;
	}
	/* Need to release dquot? */
J
Jan Kara 已提交
777
	if (dquot_dirty(dquot)) {
L
Linus Torvalds 已提交
778 779
		spin_unlock(&dq_list_lock);
		/* Commit dquot before releasing */
780 781
		ret = dquot->dq_sb->dq_op->write_dquot(dquot);
		if (ret < 0) {
782 783 784
			quota_error(dquot->dq_sb, "Can't write quota structure"
				    " (error %d). Quota may get out of sync!",
				    ret);
785 786 787 788 789 790
			/*
			 * We clear dirty bit anyway, so that we avoid
			 * infinite loop here
			 */
			clear_dquot_dirty(dquot);
		}
L
Linus Torvalds 已提交
791 792 793 794 795 796 797 798
		goto we_slept;
	}
	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
		spin_unlock(&dq_list_lock);
		dquot->dq_sb->dq_op->release_dquot(dquot);
		goto we_slept;
	}
	atomic_dec(&dquot->dq_count);
799
#ifdef CONFIG_QUOTA_DEBUG
L
Linus Torvalds 已提交
800
	/* sanity check */
801
	BUG_ON(!list_empty(&dquot->dq_free));
L
Linus Torvalds 已提交
802 803 804 805
#endif
	put_dquot_last(dquot);
	spin_unlock(&dq_list_lock);
}
806
EXPORT_SYMBOL(dqput);
L
Linus Torvalds 已提交
807

808
struct dquot *dquot_alloc(struct super_block *sb, int type)
809 810 811
{
	return kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
}
812
EXPORT_SYMBOL(dquot_alloc);
813

L
Linus Torvalds 已提交
814 815 816 817
static struct dquot *get_empty_dquot(struct super_block *sb, int type)
{
	struct dquot *dquot;

818
	dquot = sb->dq_op->alloc_dquot(sb, type);
L
Linus Torvalds 已提交
819
	if(!dquot)
J
Jan Kara 已提交
820
		return NULL;
L
Linus Torvalds 已提交
821

I
Ingo Molnar 已提交
822
	mutex_init(&dquot->dq_lock);
L
Linus Torvalds 已提交
823 824 825 826 827
	INIT_LIST_HEAD(&dquot->dq_free);
	INIT_LIST_HEAD(&dquot->dq_inuse);
	INIT_HLIST_NODE(&dquot->dq_hash);
	INIT_LIST_HEAD(&dquot->dq_dirty);
	dquot->dq_sb = sb;
E
Eric W. Biederman 已提交
828
	dquot->dq_id = make_kqid_invalid(type);
L
Linus Torvalds 已提交
829
	atomic_set(&dquot->dq_count, 1);
830
	spin_lock_init(&dquot->dq_dqb_lock);
L
Linus Torvalds 已提交
831 832 833 834 835 836

	return dquot;
}

/*
 * Get reference to dquot
J
Jan Kara 已提交
837 838 839 840 841
 *
 * Locking is slightly tricky here. We are guarded from parallel quotaoff()
 * destroying our dquot by:
 *   a) checking for quota flags under dq_list_lock and
 *   b) getting a reference to dquot before we release dq_list_lock
L
Linus Torvalds 已提交
842
 */
843
struct dquot *dqget(struct super_block *sb, struct kqid qid)
L
Linus Torvalds 已提交
844
{
E
Eric W. Biederman 已提交
845
	unsigned int hashent = hashfn(sb, qid);
846
	struct dquot *dquot, *empty = NULL;
L
Linus Torvalds 已提交
847

848 849 850
	if (!qid_has_mapping(sb->s_user_ns, qid))
		return ERR_PTR(-EINVAL);

E
Eric W. Biederman 已提交
851
        if (!sb_has_quota_active(sb, qid.type))
852
		return ERR_PTR(-ESRCH);
L
Linus Torvalds 已提交
853 854
we_slept:
	spin_lock(&dq_list_lock);
J
Jan Kara 已提交
855
	spin_lock(&dq_state_lock);
E
Eric W. Biederman 已提交
856
	if (!sb_has_quota_active(sb, qid.type)) {
J
Jan Kara 已提交
857 858
		spin_unlock(&dq_state_lock);
		spin_unlock(&dq_list_lock);
859
		dquot = ERR_PTR(-ESRCH);
J
Jan Kara 已提交
860 861 862 863
		goto out;
	}
	spin_unlock(&dq_state_lock);

E
Eric W. Biederman 已提交
864
	dquot = find_dquot(hashent, sb, qid);
J
Jan Kara 已提交
865 866
	if (!dquot) {
		if (!empty) {
L
Linus Torvalds 已提交
867
			spin_unlock(&dq_list_lock);
E
Eric W. Biederman 已提交
868
			empty = get_empty_dquot(sb, qid.type);
J
Jan Kara 已提交
869
			if (!empty)
L
Linus Torvalds 已提交
870 871 872 873
				schedule();	/* Try to wait for a moment... */
			goto we_slept;
		}
		dquot = empty;
J
Jan Kara 已提交
874
		empty = NULL;
875
		dquot->dq_id = qid;
L
Linus Torvalds 已提交
876 877 878 879 880
		/* all dquots go on the inuse_list */
		put_inuse(dquot);
		/* hash it first so it can be found */
		insert_dquot_hash(dquot);
		spin_unlock(&dq_list_lock);
881
		dqstats_inc(DQST_LOOKUPS);
L
Linus Torvalds 已提交
882 883 884 885 886
	} else {
		if (!atomic_read(&dquot->dq_count))
			remove_free_dquot(dquot);
		atomic_inc(&dquot->dq_count);
		spin_unlock(&dq_list_lock);
887 888
		dqstats_inc(DQST_CACHE_HITS);
		dqstats_inc(DQST_LOOKUPS);
L
Linus Torvalds 已提交
889
	}
J
Jan Kara 已提交
890 891
	/* Wait for dq_lock - after this we know that either dquot_release() is
	 * already finished or it will be canceled due to dq_count > 1 test */
L
Linus Torvalds 已提交
892
	wait_on_dquot(dquot);
J
Jan Kara 已提交
893
	/* Read the dquot / allocate space in quota file */
894 895 896 897 898 899 900 901 902
	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
		int err;

		err = sb->dq_op->acquire_dquot(dquot);
		if (err < 0) {
			dqput(dquot);
			dquot = ERR_PTR(err);
			goto out;
		}
L
Linus Torvalds 已提交
903
	}
904 905 906 907 908
	/*
	 * Make sure following reads see filled structure - paired with
	 * smp_mb__before_atomic() in dquot_acquire().
	 */
	smp_rmb();
909
#ifdef CONFIG_QUOTA_DEBUG
910
	BUG_ON(!dquot->dq_sb);	/* Has somebody invalidated entry under us? */
L
Linus Torvalds 已提交
911
#endif
J
Jan Kara 已提交
912 913 914
out:
	if (empty)
		do_destroy_dquot(empty);
L
Linus Torvalds 已提交
915 916 917

	return dquot;
}
918
EXPORT_SYMBOL(dqget);
L
Linus Torvalds 已提交
919

920 921 922 923 924
static inline struct dquot **i_dquot(struct inode *inode)
{
	return inode->i_sb->s_op->get_dquots(inode);
}

L
Linus Torvalds 已提交
925 926
static int dqinit_needed(struct inode *inode, int type)
{
927
	struct dquot * const *dquots;
L
Linus Torvalds 已提交
928 929 930 931
	int cnt;

	if (IS_NOQUOTA(inode))
		return 0;
932 933

	dquots = i_dquot(inode);
L
Linus Torvalds 已提交
934
	if (type != -1)
935
		return !dquots[type];
L
Linus Torvalds 已提交
936
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
937
		if (!dquots[cnt])
L
Linus Torvalds 已提交
938 939 940 941
			return 1;
	return 0;
}

J
Jan Kara 已提交
942
/* This routine is guarded by s_umount semaphore */
L
Linus Torvalds 已提交
943 944
static void add_dquot_ref(struct super_block *sb, int type)
{
945
	struct inode *inode, *old_inode = NULL;
946
#ifdef CONFIG_QUOTA_DEBUG
947
	int reserved = 0;
948
#endif
L
Linus Torvalds 已提交
949

950
	spin_lock(&sb->s_inode_list_lock);
951
	list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
952 953 954 955 956
		spin_lock(&inode->i_lock);
		if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
		    !atomic_read(&inode->i_writecount) ||
		    !dqinit_needed(inode, type)) {
			spin_unlock(&inode->i_lock);
N
Nick Piggin 已提交
957
			continue;
958
		}
959
		__iget(inode);
960
		spin_unlock(&inode->i_lock);
961
		spin_unlock(&sb->s_inode_list_lock);
962

963 964 965 966
#ifdef CONFIG_QUOTA_DEBUG
		if (unlikely(inode_get_rsv_space(inode) > 0))
			reserved = 1;
#endif
967
		iput(old_inode);
968
		__dquot_initialize(inode, type);
969 970 971 972

		/*
		 * We hold a reference to 'inode' so it couldn't have been
		 * removed from s_inodes list while we dropped the
973
		 * s_inode_list_lock. We cannot iput the inode now as we can be
974
		 * holding the last reference and we cannot iput it under
975
		 * s_inode_list_lock. So we keep the reference and iput it
976 977
		 * later.
		 */
978
		old_inode = inode;
979
		spin_lock(&sb->s_inode_list_lock);
L
Linus Torvalds 已提交
980
	}
981
	spin_unlock(&sb->s_inode_list_lock);
982
	iput(old_inode);
983

984
#ifdef CONFIG_QUOTA_DEBUG
985
	if (reserved) {
986 987 988
		quota_error(sb, "Writes happened before quota was turned on "
			"thus quota information is probably inconsistent. "
			"Please run quotacheck(8)");
989
	}
990
#endif
L
Linus Torvalds 已提交
991 992
}

J
Jan Kara 已提交
993 994
/*
 * Remove references to dquots from inode and add dquot to list for freeing
L
Lucas De Marchi 已提交
995
 * if we have the last reference to dquot
J
Jan Kara 已提交
996
 */
997 998
static void remove_inode_dquot_ref(struct inode *inode, int type,
				   struct list_head *tofree_head)
L
Linus Torvalds 已提交
999
{
1000 1001
	struct dquot **dquots = i_dquot(inode);
	struct dquot *dquot = dquots[type];
L
Linus Torvalds 已提交
1002

1003 1004 1005
	if (!dquot)
		return;

1006
	dquots[type] = NULL;
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
	if (list_empty(&dquot->dq_free)) {
		/*
		 * The inode still has reference to dquot so it can't be in the
		 * free list
		 */
		spin_lock(&dq_list_lock);
		list_add(&dquot->dq_free, tofree_head);
		spin_unlock(&dq_list_lock);
	} else {
		/*
		 * Dquot is already in a list to put so we won't drop the last
		 * reference here.
		 */
		dqput(dquot);
L
Linus Torvalds 已提交
1021 1022 1023
	}
}

J
Jan Kara 已提交
1024 1025 1026 1027 1028
/*
 * Free list of dquots
 * Dquots are removed from inodes and no new references can be got so we are
 * the only ones holding reference
 */
L
Linus Torvalds 已提交
1029 1030 1031 1032 1033 1034 1035 1036 1037
static void put_dquot_list(struct list_head *tofree_head)
{
	struct list_head *act_head;
	struct dquot *dquot;

	act_head = tofree_head->next;
	while (act_head != tofree_head) {
		dquot = list_entry(act_head, struct dquot, dq_free);
		act_head = act_head->next;
J
Jan Kara 已提交
1038 1039
		/* Remove dquot from the list so we won't have problems... */
		list_del_init(&dquot->dq_free);
L
Linus Torvalds 已提交
1040 1041 1042 1043
		dqput(dquot);
	}
}

1044 1045 1046 1047
static void remove_dquot_ref(struct super_block *sb, int type,
		struct list_head *tofree_head)
{
	struct inode *inode;
1048
	int reserved = 0;
1049

1050
	spin_lock(&sb->s_inode_list_lock);
1051
	list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
N
Nick Piggin 已提交
1052 1053 1054 1055
		/*
		 *  We have to scan also I_NEW inodes because they can already
		 *  have quota pointer initialized. Luckily, we need to touch
		 *  only quota pointers and these have separate locking
N
Niu Yawei 已提交
1056
		 *  (dq_data_lock).
N
Nick Piggin 已提交
1057
		 */
N
Niu Yawei 已提交
1058
		spin_lock(&dq_data_lock);
1059 1060 1061
		if (!IS_NOQUOTA(inode)) {
			if (unlikely(inode_get_rsv_space(inode) > 0))
				reserved = 1;
1062
			remove_inode_dquot_ref(inode, type, tofree_head);
1063
		}
N
Niu Yawei 已提交
1064
		spin_unlock(&dq_data_lock);
1065
	}
1066
	spin_unlock(&sb->s_inode_list_lock);
1067 1068 1069 1070 1071 1072 1073
#ifdef CONFIG_QUOTA_DEBUG
	if (reserved) {
		printk(KERN_WARNING "VFS (%s): Writes happened after quota"
			" was disabled thus quota information is probably "
			"inconsistent. Please run quotacheck(8).\n", sb->s_id);
	}
#endif
1074 1075
}

L
Linus Torvalds 已提交
1076 1077 1078 1079 1080
/* Gather all references from inodes and drop them */
static void drop_dquot_ref(struct super_block *sb, int type)
{
	LIST_HEAD(tofree_head);

1081 1082
	if (sb->dq_op) {
		remove_dquot_ref(sb, type, &tofree_head);
N
Niu Yawei 已提交
1083
		synchronize_srcu(&dquot_srcu);
1084 1085
		put_dquot_list(&tofree_head);
	}
L
Linus Torvalds 已提交
1086 1087
}

1088 1089 1090
static inline
void dquot_free_reserved_space(struct dquot *dquot, qsize_t number)
{
1091 1092 1093 1094 1095 1096
	if (dquot->dq_dqb.dqb_rsvspace >= number)
		dquot->dq_dqb.dqb_rsvspace -= number;
	else {
		WARN_ON_ONCE(1);
		dquot->dq_dqb.dqb_rsvspace = 0;
	}
Z
zhangyi (F) 已提交
1097 1098 1099 1100
	if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <=
	    dquot->dq_dqb.dqb_bsoftlimit)
		dquot->dq_dqb.dqb_btime = (time64_t) 0;
	clear_bit(DQ_BLKS_B, &dquot->dq_flags);
1101 1102
}

J
Jan Kara 已提交
1103
static void dquot_decr_inodes(struct dquot *dquot, qsize_t number)
L
Linus Torvalds 已提交
1104
{
1105 1106
	if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
	    dquot->dq_dqb.dqb_curinodes >= number)
L
Linus Torvalds 已提交
1107 1108 1109 1110
		dquot->dq_dqb.dqb_curinodes -= number;
	else
		dquot->dq_dqb.dqb_curinodes = 0;
	if (dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit)
A
Arnd Bergmann 已提交
1111
		dquot->dq_dqb.dqb_itime = (time64_t) 0;
L
Linus Torvalds 已提交
1112 1113 1114
	clear_bit(DQ_INODES_B, &dquot->dq_flags);
}

J
Jan Kara 已提交
1115
static void dquot_decr_space(struct dquot *dquot, qsize_t number)
L
Linus Torvalds 已提交
1116
{
1117 1118
	if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
	    dquot->dq_dqb.dqb_curspace >= number)
L
Linus Torvalds 已提交
1119 1120 1121
		dquot->dq_dqb.dqb_curspace -= number;
	else
		dquot->dq_dqb.dqb_curspace = 0;
Z
zhangyi (F) 已提交
1122 1123
	if (dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace <=
	    dquot->dq_dqb.dqb_bsoftlimit)
A
Arnd Bergmann 已提交
1124
		dquot->dq_dqb.dqb_btime = (time64_t) 0;
L
Linus Torvalds 已提交
1125 1126 1127
	clear_bit(DQ_BLKS_B, &dquot->dq_flags);
}

1128 1129
struct dquot_warn {
	struct super_block *w_sb;
1130
	struct kqid w_dq_id;
1131 1132 1133
	short w_type;
};

1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
static int warning_issued(struct dquot *dquot, const int warntype)
{
	int flag = (warntype == QUOTA_NL_BHARDWARN ||
		warntype == QUOTA_NL_BSOFTLONGWARN) ? DQ_BLKS_B :
		((warntype == QUOTA_NL_IHARDWARN ||
		warntype == QUOTA_NL_ISOFTLONGWARN) ? DQ_INODES_B : 0);

	if (!flag)
		return 0;
	return test_and_set_bit(flag, &dquot->dq_flags);
}

J
Jan Kara 已提交
1146
#ifdef CONFIG_PRINT_QUOTA_WARNING
L
Linus Torvalds 已提交
1147 1148
static int flag_print_warnings = 1;

1149
static int need_print_warning(struct dquot_warn *warn)
L
Linus Torvalds 已提交
1150 1151 1152 1153
{
	if (!flag_print_warnings)
		return 0;

1154
	switch (warn->w_dq_id.type) {
L
Linus Torvalds 已提交
1155
		case USRQUOTA:
E
Eric W. Biederman 已提交
1156
			return uid_eq(current_fsuid(), warn->w_dq_id.uid);
L
Linus Torvalds 已提交
1157
		case GRPQUOTA:
1158
			return in_group_p(warn->w_dq_id.gid);
1159 1160
		case PRJQUOTA:
			return 1;
L
Linus Torvalds 已提交
1161 1162 1163 1164 1165
	}
	return 0;
}

/* Print warning to user which exceeded quota */
1166
static void print_warning(struct dquot_warn *warn)
L
Linus Torvalds 已提交
1167 1168
{
	char *msg = NULL;
1169
	struct tty_struct *tty;
1170
	int warntype = warn->w_type;
L
Linus Torvalds 已提交
1171

1172 1173 1174
	if (warntype == QUOTA_NL_IHARDBELOW ||
	    warntype == QUOTA_NL_ISOFTBELOW ||
	    warntype == QUOTA_NL_BHARDBELOW ||
1175
	    warntype == QUOTA_NL_BSOFTBELOW || !need_print_warning(warn))
L
Linus Torvalds 已提交
1176 1177
		return;

1178 1179
	tty = get_current_tty();
	if (!tty)
A
Alan Cox 已提交
1180
		return;
1181
	tty_write_message(tty, warn->w_sb->s_id);
J
Jan Kara 已提交
1182
	if (warntype == QUOTA_NL_ISOFTWARN || warntype == QUOTA_NL_BSOFTWARN)
1183
		tty_write_message(tty, ": warning, ");
L
Linus Torvalds 已提交
1184
	else
1185
		tty_write_message(tty, ": write failed, ");
1186
	tty_write_message(tty, quotatypes[warn->w_dq_id.type]);
L
Linus Torvalds 已提交
1187
	switch (warntype) {
J
Jan Kara 已提交
1188
		case QUOTA_NL_IHARDWARN:
L
Linus Torvalds 已提交
1189 1190
			msg = " file limit reached.\r\n";
			break;
J
Jan Kara 已提交
1191
		case QUOTA_NL_ISOFTLONGWARN:
L
Linus Torvalds 已提交
1192 1193
			msg = " file quota exceeded too long.\r\n";
			break;
J
Jan Kara 已提交
1194
		case QUOTA_NL_ISOFTWARN:
L
Linus Torvalds 已提交
1195 1196
			msg = " file quota exceeded.\r\n";
			break;
J
Jan Kara 已提交
1197
		case QUOTA_NL_BHARDWARN:
L
Linus Torvalds 已提交
1198 1199
			msg = " block limit reached.\r\n";
			break;
J
Jan Kara 已提交
1200
		case QUOTA_NL_BSOFTLONGWARN:
L
Linus Torvalds 已提交
1201 1202
			msg = " block quota exceeded too long.\r\n";
			break;
J
Jan Kara 已提交
1203
		case QUOTA_NL_BSOFTWARN:
L
Linus Torvalds 已提交
1204 1205 1206
			msg = " block quota exceeded.\r\n";
			break;
	}
1207
	tty_write_message(tty, msg);
A
Alan Cox 已提交
1208
	tty_kref_put(tty);
L
Linus Torvalds 已提交
1209
}
J
Jan Kara 已提交
1210 1211
#endif

1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
static void prepare_warning(struct dquot_warn *warn, struct dquot *dquot,
			    int warntype)
{
	if (warning_issued(dquot, warntype))
		return;
	warn->w_type = warntype;
	warn->w_sb = dquot->dq_sb;
	warn->w_dq_id = dquot->dq_id;
}

1222 1223 1224
/*
 * Write warnings to the console and send warning messages over netlink.
 *
1225
 * Note that this function can call into tty and networking code.
1226
 */
1227
static void flush_warnings(struct dquot_warn *warn)
L
Linus Torvalds 已提交
1228 1229 1230
{
	int i;

S
Steven Whitehouse 已提交
1231
	for (i = 0; i < MAXQUOTAS; i++) {
1232 1233
		if (warn[i].w_type == QUOTA_NL_NOWARN)
			continue;
J
Jan Kara 已提交
1234
#ifdef CONFIG_PRINT_QUOTA_WARNING
1235
		print_warning(&warn[i]);
J
Jan Kara 已提交
1236
#endif
1237
		quota_send_warning(warn[i].w_dq_id,
1238
				   warn[i].w_sb->s_dev, warn[i].w_type);
S
Steven Whitehouse 已提交
1239
	}
L
Linus Torvalds 已提交
1240 1241
}

J
Jan Kara 已提交
1242
static int ignore_hardlimit(struct dquot *dquot)
L
Linus Torvalds 已提交
1243
{
1244
	struct mem_dqinfo *info = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
L
Linus Torvalds 已提交
1245 1246

	return capable(CAP_SYS_RESOURCE) &&
J
Jan Kara 已提交
1247
	       (info->dqi_format->qf_fmt_id != QFMT_VFS_OLD ||
J
Jan Kara 已提交
1248
		!(info->dqi_flags & DQF_ROOT_SQUASH));
L
Linus Torvalds 已提交
1249 1250
}

1251 1252
static int dquot_add_inodes(struct dquot *dquot, qsize_t inodes,
			    struct dquot_warn *warn)
L
Linus Torvalds 已提交
1253
{
1254 1255
	qsize_t newinodes;
	int ret = 0;
J
Jan Kara 已提交
1256

1257 1258
	spin_lock(&dquot->dq_dqb_lock);
	newinodes = dquot->dq_dqb.dqb_curinodes + inodes;
1259
	if (!sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type) ||
1260
	    test_bit(DQ_FAKE_B, &dquot->dq_flags))
1261
		goto add;
L
Linus Torvalds 已提交
1262 1263

	if (dquot->dq_dqb.dqb_ihardlimit &&
J
Jan Kara 已提交
1264
	    newinodes > dquot->dq_dqb.dqb_ihardlimit &&
L
Linus Torvalds 已提交
1265
            !ignore_hardlimit(dquot)) {
1266
		prepare_warning(warn, dquot, QUOTA_NL_IHARDWARN);
1267 1268
		ret = -EDQUOT;
		goto out;
L
Linus Torvalds 已提交
1269 1270 1271
	}

	if (dquot->dq_dqb.dqb_isoftlimit &&
J
Jan Kara 已提交
1272 1273
	    newinodes > dquot->dq_dqb.dqb_isoftlimit &&
	    dquot->dq_dqb.dqb_itime &&
A
Arnd Bergmann 已提交
1274
	    ktime_get_real_seconds() >= dquot->dq_dqb.dqb_itime &&
L
Linus Torvalds 已提交
1275
            !ignore_hardlimit(dquot)) {
1276
		prepare_warning(warn, dquot, QUOTA_NL_ISOFTLONGWARN);
1277 1278
		ret = -EDQUOT;
		goto out;
L
Linus Torvalds 已提交
1279 1280 1281
	}

	if (dquot->dq_dqb.dqb_isoftlimit &&
J
Jan Kara 已提交
1282
	    newinodes > dquot->dq_dqb.dqb_isoftlimit &&
L
Linus Torvalds 已提交
1283
	    dquot->dq_dqb.dqb_itime == 0) {
1284
		prepare_warning(warn, dquot, QUOTA_NL_ISOFTWARN);
A
Arnd Bergmann 已提交
1285
		dquot->dq_dqb.dqb_itime = ktime_get_real_seconds() +
1286
		    sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type].dqi_igrace;
L
Linus Torvalds 已提交
1287
	}
1288 1289
add:
	dquot->dq_dqb.dqb_curinodes = newinodes;
L
Linus Torvalds 已提交
1290

1291 1292 1293
out:
	spin_unlock(&dquot->dq_dqb_lock);
	return ret;
L
Linus Torvalds 已提交
1294 1295
}

1296 1297 1298
static int dquot_add_space(struct dquot *dquot, qsize_t space,
			   qsize_t rsv_space, unsigned int flags,
			   struct dquot_warn *warn)
L
Linus Torvalds 已提交
1299
{
1300
	qsize_t tspace;
J
Jan Kara 已提交
1301
	struct super_block *sb = dquot->dq_sb;
1302
	int ret = 0;
1303

1304
	spin_lock(&dquot->dq_dqb_lock);
1305
	if (!sb_has_quota_limits_enabled(sb, dquot->dq_id.type) ||
1306
	    test_bit(DQ_FAKE_B, &dquot->dq_flags))
1307
		goto finish;
L
Linus Torvalds 已提交
1308

1309
	tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace
1310 1311
		+ space + rsv_space;

L
Linus Torvalds 已提交
1312
	if (dquot->dq_dqb.dqb_bhardlimit &&
1313
	    tspace > dquot->dq_dqb.dqb_bhardlimit &&
L
Linus Torvalds 已提交
1314
            !ignore_hardlimit(dquot)) {
1315
		if (flags & DQUOT_SPACE_WARN)
1316
			prepare_warning(warn, dquot, QUOTA_NL_BHARDWARN);
1317
		ret = -EDQUOT;
1318
		goto finish;
L
Linus Torvalds 已提交
1319 1320 1321
	}

	if (dquot->dq_dqb.dqb_bsoftlimit &&
1322
	    tspace > dquot->dq_dqb.dqb_bsoftlimit &&
J
Jan Kara 已提交
1323
	    dquot->dq_dqb.dqb_btime &&
A
Arnd Bergmann 已提交
1324
	    ktime_get_real_seconds() >= dquot->dq_dqb.dqb_btime &&
L
Linus Torvalds 已提交
1325
            !ignore_hardlimit(dquot)) {
1326
		if (flags & DQUOT_SPACE_WARN)
1327
			prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN);
1328
		ret = -EDQUOT;
1329
		goto finish;
L
Linus Torvalds 已提交
1330 1331 1332
	}

	if (dquot->dq_dqb.dqb_bsoftlimit &&
1333
	    tspace > dquot->dq_dqb.dqb_bsoftlimit &&
L
Linus Torvalds 已提交
1334
	    dquot->dq_dqb.dqb_btime == 0) {
1335
		if (flags & DQUOT_SPACE_WARN) {
1336
			prepare_warning(warn, dquot, QUOTA_NL_BSOFTWARN);
A
Arnd Bergmann 已提交
1337
			dquot->dq_dqb.dqb_btime = ktime_get_real_seconds() +
1338
			    sb_dqopt(sb)->info[dquot->dq_id.type].dqi_bgrace;
1339
		} else {
L
Linus Torvalds 已提交
1340 1341 1342 1343
			/*
			 * We don't allow preallocation to exceed softlimit so exceeding will
			 * be always printed
			 */
1344
			ret = -EDQUOT;
1345
			goto finish;
1346
		}
L
Linus Torvalds 已提交
1347
	}
1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
finish:
	/*
	 * We have to be careful and go through warning generation & grace time
	 * setting even if DQUOT_SPACE_NOFAIL is set. That's why we check it
	 * only here...
	 */
	if (flags & DQUOT_SPACE_NOFAIL)
		ret = 0;
	if (!ret) {
		dquot->dq_dqb.dqb_rsvspace += rsv_space;
		dquot->dq_dqb.dqb_curspace += space;
	}
1360 1361
	spin_unlock(&dquot->dq_dqb_lock);
	return ret;
L
Linus Torvalds 已提交
1362 1363
}

1364
static int info_idq_free(struct dquot *dquot, qsize_t inodes)
1365
{
J
Jan Kara 已提交
1366 1367
	qsize_t newinodes;

1368
	if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
1369
	    dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit ||
1370
	    !sb_has_quota_limits_enabled(dquot->dq_sb, dquot->dq_id.type))
1371 1372
		return QUOTA_NL_NOWARN;

J
Jan Kara 已提交
1373 1374
	newinodes = dquot->dq_dqb.dqb_curinodes - inodes;
	if (newinodes <= dquot->dq_dqb.dqb_isoftlimit)
1375 1376
		return QUOTA_NL_ISOFTBELOW;
	if (dquot->dq_dqb.dqb_curinodes >= dquot->dq_dqb.dqb_ihardlimit &&
J
Jan Kara 已提交
1377
	    newinodes < dquot->dq_dqb.dqb_ihardlimit)
1378 1379 1380 1381 1382 1383
		return QUOTA_NL_IHARDBELOW;
	return QUOTA_NL_NOWARN;
}

static int info_bdq_free(struct dquot *dquot, qsize_t space)
{
Z
zhangyi (F) 已提交
1384 1385 1386 1387
	qsize_t tspace;

	tspace = dquot->dq_dqb.dqb_curspace + dquot->dq_dqb.dqb_rsvspace;

1388
	if (test_bit(DQ_FAKE_B, &dquot->dq_flags) ||
Z
zhangyi (F) 已提交
1389
	    tspace <= dquot->dq_dqb.dqb_bsoftlimit)
1390 1391
		return QUOTA_NL_NOWARN;

Z
zhangyi (F) 已提交
1392
	if (tspace - space <= dquot->dq_dqb.dqb_bsoftlimit)
1393
		return QUOTA_NL_BSOFTBELOW;
Z
zhangyi (F) 已提交
1394 1395
	if (tspace >= dquot->dq_dqb.dqb_bhardlimit &&
	    tspace - space < dquot->dq_dqb.dqb_bhardlimit)
1396 1397 1398
		return QUOTA_NL_BHARDBELOW;
	return QUOTA_NL_NOWARN;
}
1399

1400 1401 1402 1403 1404 1405 1406 1407 1408
static int dquot_active(const struct inode *inode)
{
	struct super_block *sb = inode->i_sb;

	if (IS_NOQUOTA(inode))
		return 0;
	return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb);
}

L
Linus Torvalds 已提交
1409
/*
1410 1411 1412 1413
 * Initialize quota pointers in inode
 *
 * 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.
L
Linus Torvalds 已提交
1414
 */
1415
static int __dquot_initialize(struct inode *inode, int type)
L
Linus Torvalds 已提交
1416
{
1417
	int cnt, init_needed = 0;
1418
	struct dquot **dquots, *got[MAXQUOTAS] = {};
J
Jan Kara 已提交
1419
	struct super_block *sb = inode->i_sb;
1420
	qsize_t rsv;
1421
	int ret = 0;
L
Linus Torvalds 已提交
1422

1423
	if (!dquot_active(inode))
1424
		return 0;
J
Jan Kara 已提交
1425

1426 1427
	dquots = i_dquot(inode);

J
Jan Kara 已提交
1428 1429
	/* First get references to structures we might need. */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1430
		struct kqid qid;
1431 1432
		kprojid_t projid;
		int rc;
1433
		struct dquot *dquot;
1434

J
Jan Kara 已提交
1435 1436
		if (type != -1 && cnt != type)
			continue;
1437 1438 1439 1440 1441
		/*
		 * The i_dquot should have been initialized in most cases,
		 * we check it without locking here to avoid unnecessary
		 * dqget()/dqput() calls.
		 */
1442
		if (dquots[cnt])
1443
			continue;
1444 1445 1446 1447

		if (!sb_has_quota_active(sb, cnt))
			continue;

1448 1449
		init_needed = 1;

J
Jan Kara 已提交
1450 1451
		switch (cnt) {
		case USRQUOTA:
1452
			qid = make_kqid_uid(inode->i_uid);
J
Jan Kara 已提交
1453 1454
			break;
		case GRPQUOTA:
1455
			qid = make_kqid_gid(inode->i_gid);
J
Jan Kara 已提交
1456
			break;
1457 1458 1459 1460 1461 1462
		case PRJQUOTA:
			rc = inode->i_sb->dq_op->get_projid(inode, &projid);
			if (rc)
				continue;
			qid = make_kqid_projid(projid);
			break;
J
Jan Kara 已提交
1463
		}
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
		dquot = dqget(sb, qid);
		if (IS_ERR(dquot)) {
			/* We raced with somebody turning quotas off... */
			if (PTR_ERR(dquot) != -ESRCH) {
				ret = PTR_ERR(dquot);
				goto out_put;
			}
			dquot = NULL;
		}
		got[cnt] = dquot;
J
Jan Kara 已提交
1474 1475
	}

1476 1477
	/* All required i_dquot has been initialized */
	if (!init_needed)
1478
		return 0;
1479

N
Niu Yawei 已提交
1480
	spin_lock(&dq_data_lock);
L
Linus Torvalds 已提交
1481
	if (IS_NOQUOTA(inode))
1482
		goto out_lock;
L
Linus Torvalds 已提交
1483 1484 1485
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		if (type != -1 && cnt != type)
			continue;
J
Jan Kara 已提交
1486 1487 1488
		/* Avoid races with quotaoff() */
		if (!sb_has_quota_active(sb, cnt))
			continue;
1489 1490 1491
		/* We could race with quotaon or dqget() could have failed */
		if (!got[cnt])
			continue;
1492 1493
		if (!dquots[cnt]) {
			dquots[cnt] = got[cnt];
J
Jan Kara 已提交
1494
			got[cnt] = NULL;
1495 1496 1497 1498 1499
			/*
			 * Make quota reservation system happy if someone
			 * did a write before quota was turned on
			 */
			rsv = inode_get_rsv_space(inode);
1500 1501 1502 1503 1504 1505 1506 1507 1508
			if (unlikely(rsv)) {
				spin_lock(&inode->i_lock);
				/* Get reservation again under proper lock */
				rsv = __inode_get_rsv_space(inode);
				spin_lock(&dquots[cnt]->dq_dqb_lock);
				dquots[cnt]->dq_dqb.dqb_rsvspace += rsv;
				spin_unlock(&dquots[cnt]->dq_dqb_lock);
				spin_unlock(&inode->i_lock);
			}
L
Linus Torvalds 已提交
1509 1510
		}
	}
1511
out_lock:
N
Niu Yawei 已提交
1512
	spin_unlock(&dq_data_lock);
1513
out_put:
J
Jan Kara 已提交
1514
	/* Drop unused references */
1515
	dqput_all(got);
1516 1517

	return ret;
1518 1519
}

1520
int dquot_initialize(struct inode *inode)
1521
{
1522
	return __dquot_initialize(inode, -1);
L
Linus Torvalds 已提交
1523
}
1524
EXPORT_SYMBOL(dquot_initialize);
L
Linus Torvalds 已提交
1525

1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541
bool dquot_initialize_needed(struct inode *inode)
{
	struct dquot **dquots;
	int i;

	if (!dquot_active(inode))
		return false;

	dquots = i_dquot(inode);
	for (i = 0; i < MAXQUOTAS; i++)
		if (!dquots[i] && sb_has_quota_active(inode->i_sb, i))
			return true;
	return false;
}
EXPORT_SYMBOL(dquot_initialize_needed);

L
Linus Torvalds 已提交
1542
/*
N
Niu Yawei 已提交
1543 1544 1545 1546 1547 1548
 * Release all quotas referenced by inode.
 *
 * This function only be called on inode free or converting
 * a file to quota file, no other users for the i_dquot in
 * both cases, so we needn't call synchronize_srcu() after
 * clearing i_dquot.
L
Linus Torvalds 已提交
1549
 */
1550
static void __dquot_drop(struct inode *inode)
L
Linus Torvalds 已提交
1551 1552
{
	int cnt;
1553
	struct dquot **dquots = i_dquot(inode);
J
Jan Kara 已提交
1554
	struct dquot *put[MAXQUOTAS];
L
Linus Torvalds 已提交
1555

N
Niu Yawei 已提交
1556
	spin_lock(&dq_data_lock);
L
Linus Torvalds 已提交
1557
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1558 1559
		put[cnt] = dquots[cnt];
		dquots[cnt] = NULL;
L
Linus Torvalds 已提交
1560
	}
N
Niu Yawei 已提交
1561
	spin_unlock(&dq_data_lock);
1562
	dqput_all(put);
L
Linus Torvalds 已提交
1563 1564
}

1565 1566
void dquot_drop(struct inode *inode)
{
1567
	struct dquot * const *dquots;
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
	int cnt;

	if (IS_NOQUOTA(inode))
		return;

	/*
	 * Test before calling to rule out calls from proc and such
	 * where we are not allowed to block. Note that this is
	 * actually reliable test even without the lock - the caller
	 * must assure that nobody can come after the DQUOT_DROP and
	 * add quota pointers back anyway.
	 */
1580
	dquots = i_dquot(inode);
1581
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1582
		if (dquots[cnt])
1583 1584 1585 1586 1587 1588 1589
			break;
	}

	if (cnt < MAXQUOTAS)
		__dquot_drop(inode);
}
EXPORT_SYMBOL(dquot_drop);
1590

1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602
/*
 * inode_reserved_space is managed internally by quota, and protected by
 * i_lock similar to i_blocks+i_bytes.
 */
static qsize_t *inode_reserved_space(struct inode * inode)
{
	/* Filesystem must explicitly define it's own method in order to use
	 * quota reservation interface */
	BUG_ON(!inode->i_sb->dq_op->get_reserved_space);
	return inode->i_sb->dq_op->get_reserved_space(inode);
}

1603
static qsize_t __inode_get_rsv_space(struct inode *inode)
1604
{
1605 1606 1607
	if (!inode->i_sb->dq_op->get_reserved_space)
		return 0;
	return *inode_reserved_space(inode);
1608 1609 1610 1611 1612
}

static qsize_t inode_get_rsv_space(struct inode *inode)
{
	qsize_t ret;
1613 1614 1615

	if (!inode->i_sb->dq_op->get_reserved_space)
		return 0;
1616
	spin_lock(&inode->i_lock);
1617
	ret = __inode_get_rsv_space(inode);
1618 1619 1620 1621
	spin_unlock(&inode->i_lock);
	return ret;
}

L
Linus Torvalds 已提交
1622
/*
1623 1624 1625 1626 1627 1628 1629
 * This functions updates i_blocks+i_bytes fields and quota information
 * (together with appropriate checks).
 *
 * NOTE: We absolutely rely on the fact that caller dirties the inode
 * (usually helpers in quotaops.h care about this) and holds a handle for
 * the current transaction so that dquot write and inode write go into the
 * same transaction.
L
Linus Torvalds 已提交
1630 1631 1632 1633 1634
 */

/*
 * This operation can block, but only after everything is updated
 */
1635
int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
L
Linus Torvalds 已提交
1636
{
N
Niu Yawei 已提交
1637
	int cnt, ret = 0, index;
1638
	struct dquot_warn warn[MAXQUOTAS];
1639
	int reserve = flags & DQUOT_SPACE_RESERVE;
1640
	struct dquot **dquots;
L
Linus Torvalds 已提交
1641

1642
	if (!dquot_active(inode)) {
1643 1644 1645 1646 1647 1648 1649
		if (reserve) {
			spin_lock(&inode->i_lock);
			*inode_reserved_space(inode) += number;
			spin_unlock(&inode->i_lock);
		} else {
			inode_add_bytes(inode, number);
		}
1650 1651 1652
		goto out;
	}

L
Linus Torvalds 已提交
1653
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1654
		warn[cnt].w_type = QUOTA_NL_NOWARN;
L
Linus Torvalds 已提交
1655

1656
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1657
	index = srcu_read_lock(&dquot_srcu);
1658
	spin_lock(&inode->i_lock);
L
Linus Torvalds 已提交
1659
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1660
		if (!dquots[cnt])
L
Linus Torvalds 已提交
1661
			continue;
1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
		if (flags & DQUOT_SPACE_RESERVE) {
			ret = dquot_add_space(dquots[cnt], 0, number, flags,
					      &warn[cnt]);
		} else {
			ret = dquot_add_space(dquots[cnt], number, 0, flags,
					      &warn[cnt]);
		}
		if (ret) {
			/* Back out changes we already did */
			for (cnt--; cnt >= 0; cnt--) {
				if (!dquots[cnt])
					continue;
				spin_lock(&dquots[cnt]->dq_dqb_lock);
				if (flags & DQUOT_SPACE_RESERVE) {
					dquots[cnt]->dq_dqb.dqb_rsvspace -=
									number;
				} else {
					dquots[cnt]->dq_dqb.dqb_curspace -=
									number;
				}
				spin_unlock(&dquots[cnt]->dq_dqb_lock);
			}
			spin_unlock(&inode->i_lock);
1685
			goto out_flush_warn;
1686
		}
L
Linus Torvalds 已提交
1687
	}
1688
	if (reserve)
1689
		*inode_reserved_space(inode) += number;
1690 1691 1692
	else
		__inode_add_bytes(inode, number);
	spin_unlock(&inode->i_lock);
1693

1694 1695
	if (reserve)
		goto out_flush_warn;
1696
	mark_all_dquot_dirty(dquots);
1697
out_flush_warn:
N
Niu Yawei 已提交
1698
	srcu_read_unlock(&dquot_srcu, index);
1699
	flush_warnings(warn);
1700 1701 1702
out:
	return ret;
}
1703
EXPORT_SYMBOL(__dquot_alloc_space);
L
Linus Torvalds 已提交
1704 1705 1706 1707

/*
 * This operation can block, but only after everything is updated
 */
1708
int dquot_alloc_inode(struct inode *inode)
L
Linus Torvalds 已提交
1709
{
N
Niu Yawei 已提交
1710
	int cnt, ret = 0, index;
1711
	struct dquot_warn warn[MAXQUOTAS];
1712
	struct dquot * const *dquots;
L
Linus Torvalds 已提交
1713

1714
	if (!dquot_active(inode))
1715
		return 0;
L
Linus Torvalds 已提交
1716
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
1717
		warn[cnt].w_type = QUOTA_NL_NOWARN;
N
Niu Yawei 已提交
1718

1719
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1720
	index = srcu_read_lock(&dquot_srcu);
1721
	spin_lock(&inode->i_lock);
L
Linus Torvalds 已提交
1722
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1723
		if (!dquots[cnt])
L
Linus Torvalds 已提交
1724
			continue;
1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
		ret = dquot_add_inodes(dquots[cnt], 1, &warn[cnt]);
		if (ret) {
			for (cnt--; cnt >= 0; cnt--) {
				if (!dquots[cnt])
					continue;
				/* Back out changes we already did */
				spin_lock(&dquots[cnt]->dq_dqb_lock);
				dquots[cnt]->dq_dqb.dqb_curinodes--;
				spin_unlock(&dquots[cnt]->dq_dqb_lock);
			}
L
Linus Torvalds 已提交
1735
			goto warn_put_all;
1736
		}
L
Linus Torvalds 已提交
1737
	}
1738

L
Linus Torvalds 已提交
1739
warn_put_all:
1740
	spin_unlock(&inode->i_lock);
1741
	if (ret == 0)
1742
		mark_all_dquot_dirty(dquots);
N
Niu Yawei 已提交
1743
	srcu_read_unlock(&dquot_srcu, index);
1744
	flush_warnings(warn);
L
Linus Torvalds 已提交
1745 1746
	return ret;
}
1747
EXPORT_SYMBOL(dquot_alloc_inode);
L
Linus Torvalds 已提交
1748

1749 1750 1751 1752
/*
 * Convert in-memory reserved quotas to real consumed quotas
 */
int dquot_claim_space_nodirty(struct inode *inode, qsize_t number)
1753
{
1754
	struct dquot **dquots;
N
Niu Yawei 已提交
1755
	int cnt, index;
1756

1757
	if (!dquot_active(inode)) {
1758 1759 1760 1761
		spin_lock(&inode->i_lock);
		*inode_reserved_space(inode) -= number;
		__inode_add_bytes(inode, number);
		spin_unlock(&inode->i_lock);
1762
		return 0;
1763 1764
	}

1765
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1766
	index = srcu_read_lock(&dquot_srcu);
1767
	spin_lock(&inode->i_lock);
1768 1769
	/* Claim reserved quotas to allocated quotas */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1770 1771 1772
		if (dquots[cnt]) {
			struct dquot *dquot = dquots[cnt];

1773
			spin_lock(&dquot->dq_dqb_lock);
1774 1775 1776 1777
			if (WARN_ON_ONCE(dquot->dq_dqb.dqb_rsvspace < number))
				number = dquot->dq_dqb.dqb_rsvspace;
			dquot->dq_dqb.dqb_curspace += number;
			dquot->dq_dqb.dqb_rsvspace -= number;
1778
			spin_unlock(&dquot->dq_dqb_lock);
1779
		}
1780 1781
	}
	/* Update inode bytes */
1782 1783 1784
	*inode_reserved_space(inode) -= number;
	__inode_add_bytes(inode, number);
	spin_unlock(&inode->i_lock);
1785
	mark_all_dquot_dirty(dquots);
N
Niu Yawei 已提交
1786
	srcu_read_unlock(&dquot_srcu, index);
1787
	return 0;
1788
}
1789
EXPORT_SYMBOL(dquot_claim_space_nodirty);
1790

1791 1792 1793 1794 1795
/*
 * Convert allocated space back to in-memory reserved quotas
 */
void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number)
{
1796
	struct dquot **dquots;
N
Niu Yawei 已提交
1797
	int cnt, index;
1798 1799

	if (!dquot_active(inode)) {
1800 1801 1802 1803
		spin_lock(&inode->i_lock);
		*inode_reserved_space(inode) += number;
		__inode_sub_bytes(inode, number);
		spin_unlock(&inode->i_lock);
1804 1805 1806
		return;
	}

1807
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1808
	index = srcu_read_lock(&dquot_srcu);
1809
	spin_lock(&inode->i_lock);
1810 1811
	/* Claim reserved quotas to allocated quotas */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1812 1813 1814
		if (dquots[cnt]) {
			struct dquot *dquot = dquots[cnt];

1815
			spin_lock(&dquot->dq_dqb_lock);
1816 1817 1818 1819
			if (WARN_ON_ONCE(dquot->dq_dqb.dqb_curspace < number))
				number = dquot->dq_dqb.dqb_curspace;
			dquot->dq_dqb.dqb_rsvspace += number;
			dquot->dq_dqb.dqb_curspace -= number;
1820
			spin_unlock(&dquot->dq_dqb_lock);
1821
		}
1822 1823
	}
	/* Update inode bytes */
1824 1825 1826
	*inode_reserved_space(inode) += number;
	__inode_sub_bytes(inode, number);
	spin_unlock(&inode->i_lock);
1827
	mark_all_dquot_dirty(dquots);
N
Niu Yawei 已提交
1828
	srcu_read_unlock(&dquot_srcu, index);
1829 1830 1831 1832
	return;
}
EXPORT_SYMBOL(dquot_reclaim_space_nodirty);

L
Linus Torvalds 已提交
1833 1834 1835
/*
 * This operation can block, but only after everything is updated
 */
1836
void __dquot_free_space(struct inode *inode, qsize_t number, int flags)
L
Linus Torvalds 已提交
1837 1838
{
	unsigned int cnt;
1839
	struct dquot_warn warn[MAXQUOTAS];
1840
	struct dquot **dquots;
N
Niu Yawei 已提交
1841
	int reserve = flags & DQUOT_SPACE_RESERVE, index;
L
Linus Torvalds 已提交
1842

1843
	if (!dquot_active(inode)) {
1844 1845 1846 1847 1848 1849 1850
		if (reserve) {
			spin_lock(&inode->i_lock);
			*inode_reserved_space(inode) -= number;
			spin_unlock(&inode->i_lock);
		} else {
			inode_sub_bytes(inode, number);
		}
1851
		return;
L
Linus Torvalds 已提交
1852
	}
1853

1854
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1855
	index = srcu_read_lock(&dquot_srcu);
1856
	spin_lock(&inode->i_lock);
L
Linus Torvalds 已提交
1857
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1858 1859 1860 1861
		int wtype;

		warn[cnt].w_type = QUOTA_NL_NOWARN;
		if (!dquots[cnt])
L
Linus Torvalds 已提交
1862
			continue;
1863
		spin_lock(&dquots[cnt]->dq_dqb_lock);
1864 1865 1866
		wtype = info_bdq_free(dquots[cnt], number);
		if (wtype != QUOTA_NL_NOWARN)
			prepare_warning(&warn[cnt], dquots[cnt], wtype);
1867
		if (reserve)
1868
			dquot_free_reserved_space(dquots[cnt], number);
1869
		else
1870
			dquot_decr_space(dquots[cnt], number);
1871
		spin_unlock(&dquots[cnt]->dq_dqb_lock);
L
Linus Torvalds 已提交
1872
	}
1873
	if (reserve)
1874
		*inode_reserved_space(inode) -= number;
1875 1876 1877
	else
		__inode_sub_bytes(inode, number);
	spin_unlock(&inode->i_lock);
1878 1879 1880

	if (reserve)
		goto out_unlock;
1881
	mark_all_dquot_dirty(dquots);
1882
out_unlock:
N
Niu Yawei 已提交
1883
	srcu_read_unlock(&dquot_srcu, index);
1884
	flush_warnings(warn);
1885
}
1886
EXPORT_SYMBOL(__dquot_free_space);
1887

L
Linus Torvalds 已提交
1888 1889 1890
/*
 * This operation can block, but only after everything is updated
 */
1891
void dquot_free_inode(struct inode *inode)
L
Linus Torvalds 已提交
1892 1893
{
	unsigned int cnt;
1894
	struct dquot_warn warn[MAXQUOTAS];
1895
	struct dquot * const *dquots;
N
Niu Yawei 已提交
1896
	int index;
L
Linus Torvalds 已提交
1897

1898
	if (!dquot_active(inode))
1899
		return;
1900

1901
	dquots = i_dquot(inode);
N
Niu Yawei 已提交
1902
	index = srcu_read_lock(&dquot_srcu);
1903
	spin_lock(&inode->i_lock);
L
Linus Torvalds 已提交
1904
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1905 1906 1907 1908
		int wtype;

		warn[cnt].w_type = QUOTA_NL_NOWARN;
		if (!dquots[cnt])
L
Linus Torvalds 已提交
1909
			continue;
1910
		spin_lock(&dquots[cnt]->dq_dqb_lock);
1911 1912 1913 1914
		wtype = info_idq_free(dquots[cnt], 1);
		if (wtype != QUOTA_NL_NOWARN)
			prepare_warning(&warn[cnt], dquots[cnt], wtype);
		dquot_decr_inodes(dquots[cnt], 1);
1915
		spin_unlock(&dquots[cnt]->dq_dqb_lock);
L
Linus Torvalds 已提交
1916
	}
1917
	spin_unlock(&inode->i_lock);
1918
	mark_all_dquot_dirty(dquots);
N
Niu Yawei 已提交
1919
	srcu_read_unlock(&dquot_srcu, index);
1920
	flush_warnings(warn);
L
Linus Torvalds 已提交
1921
}
1922
EXPORT_SYMBOL(dquot_free_inode);
L
Linus Torvalds 已提交
1923 1924 1925

/*
 * Transfer the number of inode and blocks from one diskquota to an other.
1926 1927 1928
 * On success, dquot references in transfer_to are consumed and references
 * to original dquots that need to be released are placed there. On failure,
 * references are kept untouched.
L
Linus Torvalds 已提交
1929 1930 1931
 *
 * This operation can block, but only after everything is updated
 * A transaction must be started when entering this function.
1932
 *
N
Niu Yawei 已提交
1933 1934
 * We are holding reference on transfer_from & transfer_to, no need to
 * protect them by srcu_read_lock().
L
Linus Torvalds 已提交
1935
 */
1936
int __dquot_transfer(struct inode *inode, struct dquot **transfer_to)
L
Linus Torvalds 已提交
1937
{
1938
	qsize_t cur_space;
1939
	qsize_t rsv_space = 0;
1940
	qsize_t inode_usage = 1;
1941
	struct dquot *transfer_from[MAXQUOTAS] = {};
1942
	int cnt, ret = 0;
1943
	char is_valid[MAXQUOTAS] = {};
1944 1945 1946
	struct dquot_warn warn_to[MAXQUOTAS];
	struct dquot_warn warn_from_inodes[MAXQUOTAS];
	struct dquot_warn warn_from_space[MAXQUOTAS];
L
Linus Torvalds 已提交
1947 1948

	if (IS_NOQUOTA(inode))
1949
		return 0;
1950 1951 1952 1953 1954 1955 1956

	if (inode->i_sb->dq_op->get_inode_usage) {
		ret = inode->i_sb->dq_op->get_inode_usage(inode, &inode_usage);
		if (ret)
			return ret;
	}

J
Jan Kara 已提交
1957
	/* Initialize the arrays */
1958 1959 1960 1961 1962
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		warn_to[cnt].w_type = QUOTA_NL_NOWARN;
		warn_from_inodes[cnt].w_type = QUOTA_NL_NOWARN;
		warn_from_space[cnt].w_type = QUOTA_NL_NOWARN;
	}
N
Niu Yawei 已提交
1963 1964

	spin_lock(&dq_data_lock);
1965
	spin_lock(&inode->i_lock);
J
Jan Kara 已提交
1966
	if (IS_NOQUOTA(inode)) {	/* File without quota accounting? */
1967
		spin_unlock(&inode->i_lock);
N
Niu Yawei 已提交
1968
		spin_unlock(&dq_data_lock);
1969
		return 0;
J
Jan Kara 已提交
1970
	}
1971 1972 1973 1974 1975 1976
	cur_space = __inode_get_bytes(inode);
	rsv_space = __inode_get_rsv_space(inode);
	/*
	 * Build the transfer_from list, check limits, and update usage in
	 * the target structures.
	 */
L
Linus Torvalds 已提交
1977
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
1978 1979 1980
		/*
		 * Skip changes for same uid or gid or for turned off quota-type.
		 */
J
Jan Kara 已提交
1981
		if (!transfer_to[cnt])
L
Linus Torvalds 已提交
1982
			continue;
1983 1984 1985 1986
		/* Avoid races with quotaoff() */
		if (!sb_has_quota_active(inode->i_sb, cnt))
			continue;
		is_valid[cnt] = 1;
1987
		transfer_from[cnt] = i_dquot(inode)[cnt];
1988 1989
		ret = dquot_add_inodes(transfer_to[cnt], inode_usage,
				       &warn_to[cnt]);
1990 1991
		if (ret)
			goto over_quota;
1992 1993 1994
		ret = dquot_add_space(transfer_to[cnt], cur_space, rsv_space, 0,
				      &warn_to[cnt]);
		if (ret) {
1995
			spin_lock(&transfer_to[cnt]->dq_dqb_lock);
1996
			dquot_decr_inodes(transfer_to[cnt], inode_usage);
1997
			spin_unlock(&transfer_to[cnt]->dq_dqb_lock);
J
Jan Kara 已提交
1998
			goto over_quota;
1999
		}
L
Linus Torvalds 已提交
2000 2001
	}

2002
	/* Decrease usage for source structures and update quota pointers */
L
Linus Torvalds 已提交
2003
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
2004
		if (!is_valid[cnt])
L
Linus Torvalds 已提交
2005 2006 2007
			continue;
		/* Due to IO error we might not have transfer_from[] structure */
		if (transfer_from[cnt]) {
2008
			int wtype;
2009 2010

			spin_lock(&transfer_from[cnt]->dq_dqb_lock);
2011
			wtype = info_idq_free(transfer_from[cnt], inode_usage);
2012 2013 2014
			if (wtype != QUOTA_NL_NOWARN)
				prepare_warning(&warn_from_inodes[cnt],
						transfer_from[cnt], wtype);
2015 2016
			wtype = info_bdq_free(transfer_from[cnt],
					      cur_space + rsv_space);
2017 2018 2019
			if (wtype != QUOTA_NL_NOWARN)
				prepare_warning(&warn_from_space[cnt],
						transfer_from[cnt], wtype);
2020
			dquot_decr_inodes(transfer_from[cnt], inode_usage);
2021 2022 2023
			dquot_decr_space(transfer_from[cnt], cur_space);
			dquot_free_reserved_space(transfer_from[cnt],
						  rsv_space);
2024
			spin_unlock(&transfer_from[cnt]->dq_dqb_lock);
L
Linus Torvalds 已提交
2025
		}
2026
		i_dquot(inode)[cnt] = transfer_to[cnt];
L
Linus Torvalds 已提交
2027
	}
2028
	spin_unlock(&inode->i_lock);
L
Linus Torvalds 已提交
2029
	spin_unlock(&dq_data_lock);
J
Jan Kara 已提交
2030

2031 2032
	mark_all_dquot_dirty(transfer_from);
	mark_all_dquot_dirty(transfer_to);
2033 2034 2035
	flush_warnings(warn_to);
	flush_warnings(warn_from_inodes);
	flush_warnings(warn_from_space);
2036
	/* Pass back references to put */
2037
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
2038 2039
		if (is_valid[cnt])
			transfer_to[cnt] = transfer_from[cnt];
2040
	return 0;
J
Jan Kara 已提交
2041
over_quota:
2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052
	/* Back out changes we already did */
	for (cnt--; cnt >= 0; cnt--) {
		if (!is_valid[cnt])
			continue;
		spin_lock(&transfer_to[cnt]->dq_dqb_lock);
		dquot_decr_inodes(transfer_to[cnt], inode_usage);
		dquot_decr_space(transfer_to[cnt], cur_space);
		dquot_free_reserved_space(transfer_to[cnt], rsv_space);
		spin_unlock(&transfer_to[cnt]->dq_dqb_lock);
	}
	spin_unlock(&inode->i_lock);
J
Jan Kara 已提交
2053
	spin_unlock(&dq_data_lock);
2054
	flush_warnings(warn_to);
2055
	return ret;
L
Linus Torvalds 已提交
2056
}
2057
EXPORT_SYMBOL(__dquot_transfer);
L
Linus Torvalds 已提交
2058

2059 2060 2061
/* Wrapper for transferring ownership of an inode for uid/gid only
 * Called from FSXXX_setattr()
 */
2062
int dquot_transfer(struct inode *inode, struct iattr *iattr)
2063
{
2064
	struct dquot *transfer_to[MAXQUOTAS] = {};
2065
	struct dquot *dquot;
2066 2067
	struct super_block *sb = inode->i_sb;
	int ret;
2068

2069
	if (!dquot_active(inode))
2070
		return 0;
2071

2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093
	if (iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)){
		dquot = dqget(sb, make_kqid_uid(iattr->ia_uid));
		if (IS_ERR(dquot)) {
			if (PTR_ERR(dquot) != -ESRCH) {
				ret = PTR_ERR(dquot);
				goto out_put;
			}
			dquot = NULL;
		}
		transfer_to[USRQUOTA] = dquot;
	}
	if (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid)){
		dquot = dqget(sb, make_kqid_gid(iattr->ia_gid));
		if (IS_ERR(dquot)) {
			if (PTR_ERR(dquot) != -ESRCH) {
				ret = PTR_ERR(dquot);
				goto out_put;
			}
			dquot = NULL;
		}
		transfer_to[GRPQUOTA] = dquot;
	}
2094
	ret = __dquot_transfer(inode, transfer_to);
2095
out_put:
2096 2097
	dqput_all(transfer_to);
	return ret;
2098
}
2099
EXPORT_SYMBOL(dquot_transfer);
2100

L
Linus Torvalds 已提交
2101 2102 2103 2104 2105 2106 2107
/*
 * Write info of quota file to disk
 */
int dquot_commit_info(struct super_block *sb, int type)
{
	struct quota_info *dqopt = sb_dqopt(sb);

2108
	return dqopt->ops[type]->write_file_info(sb, type);
L
Linus Torvalds 已提交
2109
}
2110
EXPORT_SYMBOL(dquot_commit_info);
L
Linus Torvalds 已提交
2111

2112 2113 2114 2115
int dquot_get_next_id(struct super_block *sb, struct kqid *qid)
{
	struct quota_info *dqopt = sb_dqopt(sb);

2116 2117 2118 2119
	if (!sb_has_quota_active(sb, qid->type))
		return -ESRCH;
	if (!dqopt->ops[qid->type]->get_next_id)
		return -ENOSYS;
2120
	return dqopt->ops[qid->type]->get_next_id(sb, qid);
2121 2122 2123
}
EXPORT_SYMBOL(dquot_get_next_id);

L
Linus Torvalds 已提交
2124 2125 2126
/*
 * Definitions of diskquota operations.
 */
2127
const struct dquot_operations dquot_operations = {
L
Linus Torvalds 已提交
2128 2129 2130 2131
	.write_dquot	= dquot_commit,
	.acquire_dquot	= dquot_acquire,
	.release_dquot	= dquot_release,
	.mark_dirty	= dquot_mark_dquot_dirty,
2132 2133 2134
	.write_info	= dquot_commit_info,
	.alloc_dquot	= dquot_alloc,
	.destroy_dquot	= dquot_destroy,
2135
	.get_next_id	= dquot_get_next_id,
L
Linus Torvalds 已提交
2136
};
2137
EXPORT_SYMBOL(dquot_operations);
L
Linus Torvalds 已提交
2138

2139 2140 2141 2142 2143 2144 2145 2146 2147
/*
 * Generic helper for ->open on filesystems supporting disk quotas.
 */
int dquot_file_open(struct inode *inode, struct file *file)
{
	int error;

	error = generic_file_open(inode, file);
	if (!error && (file->f_mode & FMODE_WRITE))
2148
		error = dquot_initialize(inode);
2149 2150 2151 2152
	return error;
}
EXPORT_SYMBOL(dquot_file_open);

L
Linus Torvalds 已提交
2153 2154 2155
/*
 * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
 */
2156
int dquot_disable(struct super_block *sb, int type, unsigned int flags)
L
Linus Torvalds 已提交
2157
{
2158
	int cnt, ret = 0;
L
Linus Torvalds 已提交
2159 2160 2161
	struct quota_info *dqopt = sb_dqopt(sb);
	struct inode *toputinode[MAXQUOTAS];

2162 2163 2164 2165
	/* s_umount should be held in exclusive mode */
	if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
		up_read(&sb->s_umount);

2166 2167 2168 2169 2170 2171 2172
	/* Cannot turn off usage accounting without turning off limits, or
	 * suspend quotas and simultaneously turn quotas off. */
	if ((flags & DQUOT_USAGE_ENABLED && !(flags & DQUOT_LIMITS_ENABLED))
	    || (flags & DQUOT_SUSPENDED && flags & (DQUOT_LIMITS_ENABLED |
	    DQUOT_USAGE_ENABLED)))
		return -EINVAL;

2173 2174 2175 2176 2177
	/*
	 * Skip everything if there's nothing to do. We have to do this because
	 * sometimes we are called when fill_super() failed and calling
	 * sync_fs() in such cases does no good.
	 */
J
Jan Kara 已提交
2178
	if (!sb_any_quota_loaded(sb))
2179
		return 0;
J
Jan Kara 已提交
2180

L
Linus Torvalds 已提交
2181 2182 2183 2184
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		toputinode[cnt] = NULL;
		if (type != -1 && cnt != type)
			continue;
2185
		if (!sb_has_quota_loaded(sb, cnt))
2186
			continue;
2187 2188

		if (flags & DQUOT_SUSPENDED) {
J
Jan Kara 已提交
2189
			spin_lock(&dq_state_lock);
2190 2191
			dqopt->flags |=
				dquot_state_flag(DQUOT_SUSPENDED, cnt);
J
Jan Kara 已提交
2192
			spin_unlock(&dq_state_lock);
2193
		} else {
J
Jan Kara 已提交
2194
			spin_lock(&dq_state_lock);
2195 2196 2197 2198 2199 2200
			dqopt->flags &= ~dquot_state_flag(flags, cnt);
			/* Turning off suspended quotas? */
			if (!sb_has_quota_loaded(sb, cnt) &&
			    sb_has_quota_suspended(sb, cnt)) {
				dqopt->flags &=	~dquot_state_flag(
							DQUOT_SUSPENDED, cnt);
J
Jan Kara 已提交
2201
				spin_unlock(&dq_state_lock);
2202 2203 2204 2205
				iput(dqopt->files[cnt]);
				dqopt->files[cnt] = NULL;
				continue;
			}
J
Jan Kara 已提交
2206
			spin_unlock(&dq_state_lock);
2207
		}
2208 2209 2210

		/* We still have to keep quota loaded? */
		if (sb_has_quota_loaded(sb, cnt) && !(flags & DQUOT_SUSPENDED))
L
Linus Torvalds 已提交
2211 2212 2213 2214 2215 2216
			continue;

		/* Note: these are blocking operations */
		drop_dquot_ref(sb, cnt);
		invalidate_dquots(sb, cnt);
		/*
J
Jan Kara 已提交
2217 2218
		 * Now all dquots should be invalidated, all writes done so we
		 * should be only users of the info. No locks needed.
L
Linus Torvalds 已提交
2219 2220 2221 2222 2223 2224 2225 2226
		 */
		if (info_dirty(&dqopt->info[cnt]))
			sb->dq_op->write_info(sb, cnt);
		if (dqopt->ops[cnt]->free_file_info)
			dqopt->ops[cnt]->free_file_info(sb, cnt);
		put_quota_format(dqopt->info[cnt].dqi_format);

		toputinode[cnt] = dqopt->files[cnt];
2227
		if (!sb_has_quota_loaded(sb, cnt))
2228
			dqopt->files[cnt] = NULL;
L
Linus Torvalds 已提交
2229 2230 2231 2232 2233
		dqopt->info[cnt].dqi_flags = 0;
		dqopt->info[cnt].dqi_igrace = 0;
		dqopt->info[cnt].dqi_bgrace = 0;
		dqopt->ops[cnt] = NULL;
	}
2234 2235 2236 2237 2238

	/* Skip syncing and setting flags if quota files are hidden */
	if (dqopt->flags & DQUOT_QUOTA_SYS_FILE)
		goto put_inodes;

L
Linus Torvalds 已提交
2239
	/* Sync the superblock so that buffers with quota data are written to
2240
	 * disk (and so userspace sees correct data afterwards). */
L
Linus Torvalds 已提交
2241 2242 2243 2244 2245 2246 2247 2248 2249
	if (sb->s_op->sync_fs)
		sb->s_op->sync_fs(sb, 1);
	sync_blockdev(sb->s_bdev);
	/* Now the quota files are just ordinary files and we can set the
	 * inode flags back. Moreover we discard the pagecache so that
	 * userspace sees the writes we did bypassing the pagecache. We
	 * must also discard the blockdev buffers so that we see the
	 * changes done by userspace on the next quotaon() */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
2250 2251
		/* This can happen when suspending quotas on remount-ro... */
		if (toputinode[cnt] && !sb_has_quota_loaded(sb, cnt)) {
J
Jan Kara 已提交
2252
			inode_lock(toputinode[cnt]);
2253
			toputinode[cnt]->i_flags &= ~S_NOQUOTA;
J
Jan Kara 已提交
2254 2255 2256
			truncate_inode_pages(&toputinode[cnt]->i_data, 0);
			inode_unlock(toputinode[cnt]);
			mark_inode_dirty_sync(toputinode[cnt]);
2257 2258 2259 2260 2261 2262
		}
	if (sb->s_bdev)
		invalidate_bdev(sb->s_bdev);
put_inodes:
	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
		if (toputinode[cnt]) {
2263
			/* On remount RO, we keep the inode pointer so that we
2264 2265 2266 2267 2268 2269 2270
			 * can reenable quota on the subsequent remount RW. We
			 * have to check 'flags' variable and not use sb_has_
			 * function because another quotaon / quotaoff could
			 * change global state before we got here. We refuse
			 * to suspend quotas when there is pending delete on
			 * the quota file... */
			if (!(flags & DQUOT_SUSPENDED))
2271 2272 2273
				iput(toputinode[cnt]);
			else if (!toputinode[cnt]->i_nlink)
				ret = -EBUSY;
L
Linus Torvalds 已提交
2274
		}
2275
	return ret;
L
Linus Torvalds 已提交
2276
}
2277
EXPORT_SYMBOL(dquot_disable);
L
Linus Torvalds 已提交
2278

2279
int dquot_quota_off(struct super_block *sb, int type)
2280
{
2281 2282
	return dquot_disable(sb, type,
			     DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
2283
}
2284
EXPORT_SYMBOL(dquot_quota_off);
2285

L
Linus Torvalds 已提交
2286 2287 2288 2289
/*
 *	Turn quotas on on a device
 */

2290 2291 2292 2293 2294 2295
/*
 * Helper function to turn quotas on when we already have the inode of
 * quota file and no quota information is loaded.
 */
static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
	unsigned int flags)
L
Linus Torvalds 已提交
2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
{
	struct quota_format_type *fmt = find_quota_format(format_id);
	struct super_block *sb = inode->i_sb;
	struct quota_info *dqopt = sb_dqopt(sb);
	int error;

	if (!fmt)
		return -ESRCH;
	if (!S_ISREG(inode->i_mode)) {
		error = -EACCES;
		goto out_fmt;
	}
	if (IS_RDONLY(inode)) {
		error = -EROFS;
		goto out_fmt;
	}
2312 2313
	if (!sb->s_op->quota_write || !sb->s_op->quota_read ||
	    (type == PRJQUOTA && sb->dq_op->get_projid == NULL)) {
L
Linus Torvalds 已提交
2314 2315 2316
		error = -EINVAL;
		goto out_fmt;
	}
2317 2318 2319 2320 2321
	/* Filesystems outside of init_user_ns not yet supported */
	if (sb->s_user_ns != &init_user_ns) {
		error = -EINVAL;
		goto out_fmt;
	}
2322 2323 2324 2325 2326
	/* Usage always has to be set... */
	if (!(flags & DQUOT_USAGE_ENABLED)) {
		error = -EINVAL;
		goto out_fmt;
	}
J
Jan Kara 已提交
2327 2328 2329 2330
	if (sb_has_quota_loaded(sb, type)) {
		error = -EBUSY;
		goto out_fmt;
	}
L
Linus Torvalds 已提交
2331

2332
	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
2333 2334 2335 2336 2337 2338 2339
		/* As we bypass the pagecache we must now flush all the
		 * dirty data and invalidate caches so that kernel sees
		 * changes from userspace. It is not enough to just flush
		 * the quota file since if blocksize < pagesize, invalidation
		 * of the cache could fail because of other unrelated dirty
		 * data */
		sync_filesystem(sb);
2340 2341 2342 2343 2344 2345 2346
		invalidate_bdev(sb->s_bdev);
	}

	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
		/* We don't want quota and atime on quota files (deadlocks
		 * possible) Also nobody should write to the file - we use
		 * special IO operations which ignore the immutable bit. */
A
Al Viro 已提交
2347
		inode_lock(inode);
2348
		inode->i_flags |= S_NOQUOTA;
A
Al Viro 已提交
2349
		inode_unlock(inode);
J
Jan Kara 已提交
2350 2351 2352 2353
		/*
		 * When S_NOQUOTA is set, remove dquot references as no more
		 * references can be added
		 */
2354
		__dquot_drop(inode);
2355
	}
L
Linus Torvalds 已提交
2356 2357 2358 2359

	error = -EIO;
	dqopt->files[type] = igrab(inode);
	if (!dqopt->files[type])
J
Jan Kara 已提交
2360
		goto out_file_flags;
L
Linus Torvalds 已提交
2361 2362 2363 2364 2365 2366
	error = -EINVAL;
	if (!fmt->qf_ops->check_quota_file(sb, type))
		goto out_file_init;

	dqopt->ops[type] = fmt->qf_ops;
	dqopt->info[type].dqi_format = fmt;
2367
	dqopt->info[type].dqi_fmt_id = format_id;
L
Linus Torvalds 已提交
2368
	INIT_LIST_HEAD(&dqopt->info[type].dqi_dirty_list);
J
Jan Kara 已提交
2369
	error = dqopt->ops[type]->read_file_info(sb, type);
2370
	if (error < 0)
L
Linus Torvalds 已提交
2371
		goto out_file_init;
2372 2373
	if (dqopt->flags & DQUOT_QUOTA_SYS_FILE) {
		spin_lock(&dq_data_lock);
2374
		dqopt->info[type].dqi_flags |= DQF_SYS_FILE;
2375 2376
		spin_unlock(&dq_data_lock);
	}
J
Jan Kara 已提交
2377
	spin_lock(&dq_state_lock);
2378
	dqopt->flags |= dquot_state_flag(flags, type);
J
Jan Kara 已提交
2379
	spin_unlock(&dq_state_lock);
L
Linus Torvalds 已提交
2380 2381 2382 2383 2384 2385 2386 2387

	add_dquot_ref(sb, type);

	return 0;

out_file_init:
	dqopt->files[type] = NULL;
	iput(inode);
J
Jan Kara 已提交
2388
out_file_flags:
2389 2390 2391
	inode_lock(inode);
	inode->i_flags &= ~S_NOQUOTA;
	inode_unlock(inode);
L
Linus Torvalds 已提交
2392 2393 2394 2395 2396 2397
out_fmt:
	put_quota_format(fmt);

	return error; 
}

2398
/* Reenable quotas on remount RW */
2399
int dquot_resume(struct super_block *sb, int type)
2400 2401 2402
{
	struct quota_info *dqopt = sb_dqopt(sb);
	struct inode *inode;
2403
	int ret = 0, cnt;
2404
	unsigned int flags;
2405

2406 2407 2408 2409
	/* s_umount should be held in exclusive mode */
	if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
		up_read(&sb->s_umount);

2410 2411 2412
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
		if (type != -1 && cnt != type)
			continue;
J
Jan Kara 已提交
2413
		if (!sb_has_quota_suspended(sb, cnt))
2414
			continue;
J
Jan Kara 已提交
2415

2416 2417 2418 2419 2420 2421 2422 2423
		inode = dqopt->files[cnt];
		dqopt->files[cnt] = NULL;
		spin_lock(&dq_state_lock);
		flags = dqopt->flags & dquot_state_flag(DQUOT_USAGE_ENABLED |
							DQUOT_LIMITS_ENABLED,
							cnt);
		dqopt->flags &= ~dquot_state_flag(DQUOT_STATE_FLAGS, cnt);
		spin_unlock(&dq_state_lock);
2424

2425 2426 2427 2428 2429
		flags = dquot_generic_flag(flags, cnt);
		ret = vfs_load_quota_inode(inode, cnt,
				dqopt->info[cnt].dqi_fmt_id, flags);
		iput(inode);
	}
2430 2431 2432

	return ret;
}
2433
EXPORT_SYMBOL(dquot_resume);
2434

2435
int dquot_quota_on(struct super_block *sb, int type, int format_id,
A
Al Viro 已提交
2436
		   const struct path *path)
2437 2438 2439 2440 2441
{
	int error = security_quota_on(path->dentry);
	if (error)
		return error;
	/* Quota file not on the same filesystem? */
2442
	if (path->dentry->d_sb != sb)
2443 2444
		error = -EXDEV;
	else
2445
		error = vfs_load_quota_inode(d_inode(path->dentry), type,
2446 2447
					     format_id, DQUOT_USAGE_ENABLED |
					     DQUOT_LIMITS_ENABLED);
2448 2449
	return error;
}
2450
EXPORT_SYMBOL(dquot_quota_on);
L
Linus Torvalds 已提交
2451

2452 2453 2454 2455
/*
 * More powerful function for turning on quotas allowing setting
 * of individual quota flags
 */
2456 2457
int dquot_enable(struct inode *inode, int type, int format_id,
		 unsigned int flags)
2458 2459 2460 2461
{
	struct super_block *sb = inode->i_sb;

	/* Just unsuspend quotas? */
2462
	BUG_ON(flags & DQUOT_SUSPENDED);
2463 2464 2465
	/* s_umount should be held in exclusive mode */
	if (WARN_ON_ONCE(down_read_trylock(&sb->s_umount)))
		up_read(&sb->s_umount);
2466

2467 2468 2469 2470 2471
	if (!flags)
		return 0;
	/* Just updating flags needed? */
	if (sb_has_quota_loaded(sb, type)) {
		if (flags & DQUOT_USAGE_ENABLED &&
J
Jan Kara 已提交
2472 2473
		    sb_has_quota_usage_enabled(sb, type))
			return -EBUSY;
2474
		if (flags & DQUOT_LIMITS_ENABLED &&
J
Jan Kara 已提交
2475 2476
		    sb_has_quota_limits_enabled(sb, type))
			return -EBUSY;
J
Jan Kara 已提交
2477
		spin_lock(&dq_state_lock);
2478
		sb_dqopt(sb)->flags |= dquot_state_flag(flags, type);
J
Jan Kara 已提交
2479
		spin_unlock(&dq_state_lock);
J
Jan Kara 已提交
2480
		return 0;
2481 2482 2483 2484
	}

	return vfs_load_quota_inode(inode, type, format_id, flags);
}
2485
EXPORT_SYMBOL(dquot_enable);
2486

L
Linus Torvalds 已提交
2487 2488 2489 2490
/*
 * This function is used when filesystem needs to initialize quotas
 * during mount time.
 */
2491
int dquot_quota_on_mount(struct super_block *sb, char *qf_name,
2492
		int format_id, int type)
L
Linus Torvalds 已提交
2493
{
2494
	struct dentry *dentry;
L
Linus Torvalds 已提交
2495 2496
	int error;

A
Al Viro 已提交
2497
	dentry = lookup_one_len_unlocked(qf_name, sb->s_root, strlen(qf_name));
2498 2499 2500
	if (IS_ERR(dentry))
		return PTR_ERR(dentry);

2501
	if (d_really_is_negative(dentry)) {
J
Jan Kara 已提交
2502 2503 2504 2505
		error = -ENOENT;
		goto out;
	}

L
Linus Torvalds 已提交
2506
	error = security_quota_on(dentry);
2507
	if (!error)
2508
		error = vfs_load_quota_inode(d_inode(dentry), type, format_id,
2509
				DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
2510

J
Jan Kara 已提交
2511
out:
2512 2513
	dput(dentry);
	return error;
L
Linus Torvalds 已提交
2514
}
2515
EXPORT_SYMBOL(dquot_quota_on_mount);
2516

2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596
static int dquot_quota_enable(struct super_block *sb, unsigned int flags)
{
	int ret;
	int type;
	struct quota_info *dqopt = sb_dqopt(sb);

	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE))
		return -ENOSYS;
	/* Accounting cannot be turned on while fs is mounted */
	flags &= ~(FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT);
	if (!flags)
		return -EINVAL;
	for (type = 0; type < MAXQUOTAS; type++) {
		if (!(flags & qtype_enforce_flag(type)))
			continue;
		/* Can't enforce without accounting */
		if (!sb_has_quota_usage_enabled(sb, type))
			return -EINVAL;
		ret = dquot_enable(dqopt->files[type], type,
				   dqopt->info[type].dqi_fmt_id,
				   DQUOT_LIMITS_ENABLED);
		if (ret < 0)
			goto out_err;
	}
	return 0;
out_err:
	/* Backout enforcement enablement we already did */
	for (type--; type >= 0; type--)  {
		if (flags & qtype_enforce_flag(type))
			dquot_disable(sb, type, DQUOT_LIMITS_ENABLED);
	}
	/* Error code translation for better compatibility with XFS */
	if (ret == -EBUSY)
		ret = -EEXIST;
	return ret;
}

static int dquot_quota_disable(struct super_block *sb, unsigned int flags)
{
	int ret;
	int type;
	struct quota_info *dqopt = sb_dqopt(sb);

	if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE))
		return -ENOSYS;
	/*
	 * We don't support turning off accounting via quotactl. In principle
	 * quota infrastructure can do this but filesystems don't expect
	 * userspace to be able to do it.
	 */
	if (flags &
		  (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT))
		return -EOPNOTSUPP;

	/* Filter out limits not enabled */
	for (type = 0; type < MAXQUOTAS; type++)
		if (!sb_has_quota_limits_enabled(sb, type))
			flags &= ~qtype_enforce_flag(type);
	/* Nothing left? */
	if (!flags)
		return -EEXIST;
	for (type = 0; type < MAXQUOTAS; type++) {
		if (flags & qtype_enforce_flag(type)) {
			ret = dquot_disable(sb, type, DQUOT_LIMITS_ENABLED);
			if (ret < 0)
				goto out_err;
		}
	}
	return 0;
out_err:
	/* Backout enforcement disabling we already did */
	for (type--; type >= 0; type--)  {
		if (flags & qtype_enforce_flag(type))
			dquot_enable(dqopt->files[type], type,
				     dqopt->info[type].dqi_fmt_id,
				     DQUOT_LIMITS_ENABLED);
	}
	return ret;
}

L
Linus Torvalds 已提交
2597
/* Generic routine for getting common part of quota structure */
2598
static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di)
L
Linus Torvalds 已提交
2599 2600 2601
{
	struct mem_dqblk *dm = &dquot->dq_dqb;

C
Christoph Hellwig 已提交
2602
	memset(di, 0, sizeof(*di));
2603
	spin_lock(&dquot->dq_dqb_lock);
2604 2605
	di->d_spc_hardlimit = dm->dqb_bhardlimit;
	di->d_spc_softlimit = dm->dqb_bsoftlimit;
C
Christoph Hellwig 已提交
2606 2607
	di->d_ino_hardlimit = dm->dqb_ihardlimit;
	di->d_ino_softlimit = dm->dqb_isoftlimit;
2608 2609 2610 2611
	di->d_space = dm->dqb_curspace + dm->dqb_rsvspace;
	di->d_ino_count = dm->dqb_curinodes;
	di->d_spc_timer = dm->dqb_btime;
	di->d_ino_timer = dm->dqb_itime;
2612
	spin_unlock(&dquot->dq_dqb_lock);
L
Linus Torvalds 已提交
2613 2614
}

E
Eric W. Biederman 已提交
2615
int dquot_get_dqblk(struct super_block *sb, struct kqid qid,
2616
		    struct qc_dqblk *di)
L
Linus Torvalds 已提交
2617 2618 2619
{
	struct dquot *dquot;

2620
	dquot = dqget(sb, qid);
2621 2622
	if (IS_ERR(dquot))
		return PTR_ERR(dquot);
L
Linus Torvalds 已提交
2623 2624
	do_get_dqblk(dquot, di);
	dqput(dquot);
J
Jan Kara 已提交
2625

L
Linus Torvalds 已提交
2626 2627
	return 0;
}
2628
EXPORT_SYMBOL(dquot_get_dqblk);
L
Linus Torvalds 已提交
2629

2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650
int dquot_get_next_dqblk(struct super_block *sb, struct kqid *qid,
			 struct qc_dqblk *di)
{
	struct dquot *dquot;
	int err;

	if (!sb->dq_op->get_next_id)
		return -ENOSYS;
	err = sb->dq_op->get_next_id(sb, qid);
	if (err < 0)
		return err;
	dquot = dqget(sb, *qid);
	if (IS_ERR(dquot))
		return PTR_ERR(dquot);
	do_get_dqblk(dquot, di);
	dqput(dquot);

	return 0;
}
EXPORT_SYMBOL(dquot_get_next_dqblk);

2651 2652 2653 2654
#define VFS_QC_MASK \
	(QC_SPACE | QC_SPC_SOFT | QC_SPC_HARD | \
	 QC_INO_COUNT | QC_INO_SOFT | QC_INO_HARD | \
	 QC_SPC_TIMER | QC_INO_TIMER)
C
Christoph Hellwig 已提交
2655

L
Linus Torvalds 已提交
2656
/* Generic routine for setting common part of quota structure */
2657
static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di)
L
Linus Torvalds 已提交
2658 2659 2660
{
	struct mem_dqblk *dm = &dquot->dq_dqb;
	int check_blim = 0, check_ilim = 0;
2661
	struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type];
2662

2663
	if (di->d_fieldmask & ~VFS_QC_MASK)
C
Christoph Hellwig 已提交
2664 2665
		return -EINVAL;

2666
	if (((di->d_fieldmask & QC_SPC_SOFT) &&
2667
	     di->d_spc_softlimit > dqi->dqi_max_spc_limit) ||
2668
	    ((di->d_fieldmask & QC_SPC_HARD) &&
2669
	     di->d_spc_hardlimit > dqi->dqi_max_spc_limit) ||
2670
	    ((di->d_fieldmask & QC_INO_SOFT) &&
2671
	     (di->d_ino_softlimit > dqi->dqi_max_ino_limit)) ||
2672
	    ((di->d_fieldmask & QC_INO_HARD) &&
2673
	     (di->d_ino_hardlimit > dqi->dqi_max_ino_limit)))
2674
		return -ERANGE;
L
Linus Torvalds 已提交
2675

2676
	spin_lock(&dquot->dq_dqb_lock);
2677 2678
	if (di->d_fieldmask & QC_SPACE) {
		dm->dqb_curspace = di->d_space - dm->dqb_rsvspace;
L
Linus Torvalds 已提交
2679
		check_blim = 1;
2680
		set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags);
L
Linus Torvalds 已提交
2681
	}
C
Christoph Hellwig 已提交
2682

2683 2684 2685 2686 2687
	if (di->d_fieldmask & QC_SPC_SOFT)
		dm->dqb_bsoftlimit = di->d_spc_softlimit;
	if (di->d_fieldmask & QC_SPC_HARD)
		dm->dqb_bhardlimit = di->d_spc_hardlimit;
	if (di->d_fieldmask & (QC_SPC_SOFT | QC_SPC_HARD)) {
L
Linus Torvalds 已提交
2688
		check_blim = 1;
2689
		set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags);
L
Linus Torvalds 已提交
2690
	}
C
Christoph Hellwig 已提交
2691

2692 2693
	if (di->d_fieldmask & QC_INO_COUNT) {
		dm->dqb_curinodes = di->d_ino_count;
L
Linus Torvalds 已提交
2694
		check_ilim = 1;
2695
		set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags);
L
Linus Torvalds 已提交
2696
	}
C
Christoph Hellwig 已提交
2697

2698
	if (di->d_fieldmask & QC_INO_SOFT)
C
Christoph Hellwig 已提交
2699
		dm->dqb_isoftlimit = di->d_ino_softlimit;
2700
	if (di->d_fieldmask & QC_INO_HARD)
C
Christoph Hellwig 已提交
2701
		dm->dqb_ihardlimit = di->d_ino_hardlimit;
2702
	if (di->d_fieldmask & (QC_INO_SOFT | QC_INO_HARD)) {
L
Linus Torvalds 已提交
2703
		check_ilim = 1;
2704
		set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags);
L
Linus Torvalds 已提交
2705
	}
C
Christoph Hellwig 已提交
2706

2707 2708
	if (di->d_fieldmask & QC_SPC_TIMER) {
		dm->dqb_btime = di->d_spc_timer;
2709
		check_blim = 1;
2710
		set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags);
2711
	}
C
Christoph Hellwig 已提交
2712

2713 2714
	if (di->d_fieldmask & QC_INO_TIMER) {
		dm->dqb_itime = di->d_ino_timer;
2715
		check_ilim = 1;
2716
		set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags);
2717
	}
L
Linus Torvalds 已提交
2718 2719

	if (check_blim) {
J
Jan Kara 已提交
2720
		if (!dm->dqb_bsoftlimit ||
Z
zhangyi (F) 已提交
2721
		    dm->dqb_curspace + dm->dqb_rsvspace < dm->dqb_bsoftlimit) {
L
Linus Torvalds 已提交
2722 2723
			dm->dqb_btime = 0;
			clear_bit(DQ_BLKS_B, &dquot->dq_flags);
2724
		} else if (!(di->d_fieldmask & QC_SPC_TIMER))
J
Jan Kara 已提交
2725
			/* Set grace only if user hasn't provided his own... */
A
Arnd Bergmann 已提交
2726
			dm->dqb_btime = ktime_get_real_seconds() + dqi->dqi_bgrace;
L
Linus Torvalds 已提交
2727 2728
	}
	if (check_ilim) {
J
Jan Kara 已提交
2729 2730
		if (!dm->dqb_isoftlimit ||
		    dm->dqb_curinodes < dm->dqb_isoftlimit) {
L
Linus Torvalds 已提交
2731 2732
			dm->dqb_itime = 0;
			clear_bit(DQ_INODES_B, &dquot->dq_flags);
2733
		} else if (!(di->d_fieldmask & QC_INO_TIMER))
J
Jan Kara 已提交
2734
			/* Set grace only if user hasn't provided his own... */
A
Arnd Bergmann 已提交
2735
			dm->dqb_itime = ktime_get_real_seconds() + dqi->dqi_igrace;
L
Linus Torvalds 已提交
2736
	}
J
Jan Kara 已提交
2737 2738
	if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit ||
	    dm->dqb_isoftlimit)
L
Linus Torvalds 已提交
2739 2740 2741
		clear_bit(DQ_FAKE_B, &dquot->dq_flags);
	else
		set_bit(DQ_FAKE_B, &dquot->dq_flags);
2742
	spin_unlock(&dquot->dq_dqb_lock);
L
Linus Torvalds 已提交
2743
	mark_dquot_dirty(dquot);
2744 2745

	return 0;
L
Linus Torvalds 已提交
2746 2747
}

E
Eric W. Biederman 已提交
2748
int dquot_set_dqblk(struct super_block *sb, struct kqid qid,
2749
		  struct qc_dqblk *di)
L
Linus Torvalds 已提交
2750 2751
{
	struct dquot *dquot;
2752
	int rc;
L
Linus Torvalds 已提交
2753

2754
	dquot = dqget(sb, qid);
2755 2756
	if (IS_ERR(dquot)) {
		rc = PTR_ERR(dquot);
2757
		goto out;
L
Linus Torvalds 已提交
2758
	}
2759
	rc = do_set_dqblk(dquot, di);
L
Linus Torvalds 已提交
2760
	dqput(dquot);
2761
out:
2762
	return rc;
L
Linus Torvalds 已提交
2763
}
2764
EXPORT_SYMBOL(dquot_set_dqblk);
L
Linus Torvalds 已提交
2765 2766

/* Generic routine for getting common part of quota file information */
2767
int dquot_get_state(struct super_block *sb, struct qc_state *state)
L
Linus Torvalds 已提交
2768 2769
{
	struct mem_dqinfo *mi;
2770 2771 2772
	struct qc_type_state *tstate;
	struct quota_info *dqopt = sb_dqopt(sb);
	int type;
L
Linus Torvalds 已提交
2773
  
2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793
	memset(state, 0, sizeof(*state));
	for (type = 0; type < MAXQUOTAS; type++) {
		if (!sb_has_quota_active(sb, type))
			continue;
		tstate = state->s_state + type;
		mi = sb_dqopt(sb)->info + type;
		tstate->flags = QCI_ACCT_ENABLED;
		spin_lock(&dq_data_lock);
		if (mi->dqi_flags & DQF_SYS_FILE)
			tstate->flags |= QCI_SYSFILE;
		if (mi->dqi_flags & DQF_ROOT_SQUASH)
			tstate->flags |= QCI_ROOT_SQUASH;
		if (sb_has_quota_limits_enabled(sb, type))
			tstate->flags |= QCI_LIMITS_ENFORCED;
		tstate->spc_timelimit = mi->dqi_bgrace;
		tstate->ino_timelimit = mi->dqi_igrace;
		tstate->ino = dqopt->files[type]->i_ino;
		tstate->blocks = dqopt->files[type]->i_blocks;
		tstate->nextents = 1;	/* We don't know... */
		spin_unlock(&dq_data_lock);
L
Linus Torvalds 已提交
2794 2795 2796
	}
	return 0;
}
2797
EXPORT_SYMBOL(dquot_get_state);
L
Linus Torvalds 已提交
2798 2799

/* Generic routine for setting common part of quota file information */
2800
int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii)
L
Linus Torvalds 已提交
2801 2802
{
	struct mem_dqinfo *mi;
2803
	int err = 0;
L
Linus Torvalds 已提交
2804

2805 2806 2807
	if ((ii->i_fieldmask & QC_WARNS_MASK) ||
	    (ii->i_fieldmask & QC_RT_SPC_TIMER))
		return -EINVAL;
2808 2809
	if (!sb_has_quota_active(sb, type))
		return -ESRCH;
L
Linus Torvalds 已提交
2810
	mi = sb_dqopt(sb)->info + type;
2811 2812
	if (ii->i_fieldmask & QC_FLAGS) {
		if ((ii->i_flags & QCI_ROOT_SQUASH &&
2813 2814
		     mi->dqi_format->qf_fmt_id != QFMT_VFS_OLD))
			return -EINVAL;
2815
	}
L
Linus Torvalds 已提交
2816
	spin_lock(&dq_data_lock);
2817 2818 2819 2820 2821 2822 2823 2824 2825 2826
	if (ii->i_fieldmask & QC_SPC_TIMER)
		mi->dqi_bgrace = ii->i_spc_timelimit;
	if (ii->i_fieldmask & QC_INO_TIMER)
		mi->dqi_igrace = ii->i_ino_timelimit;
	if (ii->i_fieldmask & QC_FLAGS) {
		if (ii->i_flags & QCI_ROOT_SQUASH)
			mi->dqi_flags |= DQF_ROOT_SQUASH;
		else
			mi->dqi_flags &= ~DQF_ROOT_SQUASH;
	}
L
Linus Torvalds 已提交
2827 2828 2829 2830
	spin_unlock(&dq_data_lock);
	mark_info_dirty(sb, type);
	/* Force write to disk */
	sb->dq_op->write_info(sb, type);
2831
	return err;
L
Linus Torvalds 已提交
2832
}
2833
EXPORT_SYMBOL(dquot_set_dqinfo);
L
Linus Torvalds 已提交
2834

2835 2836 2837 2838
const struct quotactl_ops dquot_quotactl_sysfile_ops = {
	.quota_enable	= dquot_quota_enable,
	.quota_disable	= dquot_quota_disable,
	.quota_sync	= dquot_quota_sync,
2839
	.get_state	= dquot_get_state,
2840 2841
	.set_info	= dquot_set_dqinfo,
	.get_dqblk	= dquot_get_dqblk,
2842
	.get_nextdqblk	= dquot_get_next_dqblk,
2843 2844 2845 2846
	.set_dqblk	= dquot_set_dqblk
};
EXPORT_SYMBOL(dquot_quotactl_sysfile_ops);

2847 2848 2849 2850
static int do_proc_dqstats(struct ctl_table *table, int write,
		     void __user *buffer, size_t *lenp, loff_t *ppos)
{
	unsigned int type = (int *)table->data - dqstats.stat;
2851 2852 2853 2854

	/* Update global table */
	dqstats.stat[type] =
			percpu_counter_sum_positive(&dqstats.counter[type]);
2855 2856 2857
	return proc_dointvec(table, write, buffer, lenp, ppos);
}

2858
static struct ctl_table fs_dqstats_table[] = {
L
Linus Torvalds 已提交
2859 2860
	{
		.procname	= "lookups",
2861
		.data		= &dqstats.stat[DQST_LOOKUPS],
L
Linus Torvalds 已提交
2862 2863
		.maxlen		= sizeof(int),
		.mode		= 0444,
2864
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2865 2866 2867
	},
	{
		.procname	= "drops",
2868
		.data		= &dqstats.stat[DQST_DROPS],
L
Linus Torvalds 已提交
2869 2870
		.maxlen		= sizeof(int),
		.mode		= 0444,
2871
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2872 2873 2874
	},
	{
		.procname	= "reads",
2875
		.data		= &dqstats.stat[DQST_READS],
L
Linus Torvalds 已提交
2876 2877
		.maxlen		= sizeof(int),
		.mode		= 0444,
2878
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2879 2880 2881
	},
	{
		.procname	= "writes",
2882
		.data		= &dqstats.stat[DQST_WRITES],
L
Linus Torvalds 已提交
2883 2884
		.maxlen		= sizeof(int),
		.mode		= 0444,
2885
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2886 2887 2888
	},
	{
		.procname	= "cache_hits",
2889
		.data		= &dqstats.stat[DQST_CACHE_HITS],
L
Linus Torvalds 已提交
2890 2891
		.maxlen		= sizeof(int),
		.mode		= 0444,
2892
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2893 2894 2895
	},
	{
		.procname	= "allocated_dquots",
2896
		.data		= &dqstats.stat[DQST_ALLOC_DQUOTS],
L
Linus Torvalds 已提交
2897 2898
		.maxlen		= sizeof(int),
		.mode		= 0444,
2899
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2900 2901 2902
	},
	{
		.procname	= "free_dquots",
2903
		.data		= &dqstats.stat[DQST_FREE_DQUOTS],
L
Linus Torvalds 已提交
2904 2905
		.maxlen		= sizeof(int),
		.mode		= 0444,
2906
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2907 2908 2909
	},
	{
		.procname	= "syncs",
2910
		.data		= &dqstats.stat[DQST_SYNCS],
L
Linus Torvalds 已提交
2911 2912
		.maxlen		= sizeof(int),
		.mode		= 0444,
2913
		.proc_handler	= do_proc_dqstats,
L
Linus Torvalds 已提交
2914
	},
J
Jan Kara 已提交
2915
#ifdef CONFIG_PRINT_QUOTA_WARNING
L
Linus Torvalds 已提交
2916 2917 2918 2919 2920
	{
		.procname	= "warnings",
		.data		= &flag_print_warnings,
		.maxlen		= sizeof(int),
		.mode		= 0644,
2921
		.proc_handler	= proc_dointvec,
L
Linus Torvalds 已提交
2922
	},
J
Jan Kara 已提交
2923
#endif
2924
	{ },
L
Linus Torvalds 已提交
2925 2926
};

2927
static struct ctl_table fs_table[] = {
L
Linus Torvalds 已提交
2928 2929 2930 2931 2932
	{
		.procname	= "quota",
		.mode		= 0555,
		.child		= fs_dqstats_table,
	},
2933
	{ },
L
Linus Torvalds 已提交
2934 2935
};

2936
static struct ctl_table sys_table[] = {
L
Linus Torvalds 已提交
2937 2938 2939 2940 2941
	{
		.procname	= "fs",
		.mode		= 0555,
		.child		= fs_table,
	},
2942
	{ },
L
Linus Torvalds 已提交
2943 2944 2945 2946
};

static int __init dquot_init(void)
{
2947
	int i, ret;
L
Linus Torvalds 已提交
2948 2949 2950 2951
	unsigned long nr_hash, order;

	printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__);

2952
	register_sysctl_table(sys_table);
L
Linus Torvalds 已提交
2953

2954
	dquot_cachep = kmem_cache_create("dquot",
L
Linus Torvalds 已提交
2955
			sizeof(struct dquot), sizeof(unsigned long) * 4,
2956 2957
			(SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
				SLAB_MEM_SPREAD|SLAB_PANIC),
2958
			NULL);
L
Linus Torvalds 已提交
2959 2960 2961 2962 2963 2964

	order = 0;
	dquot_hash = (struct hlist_head *)__get_free_pages(GFP_ATOMIC, order);
	if (!dquot_hash)
		panic("Cannot create dquot hash table");

2965
	for (i = 0; i < _DQST_DQSTAT_LAST; i++) {
2966
		ret = percpu_counter_init(&dqstats.counter[i], 0, GFP_KERNEL);
2967 2968 2969
		if (ret)
			panic("Cannot create dquot stat counters");
	}
2970

L
Linus Torvalds 已提交
2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983
	/* Find power-of-two hlist_heads which can fit into allocation */
	nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct hlist_head);
	dq_hash_bits = 0;
	do {
		dq_hash_bits++;
	} while (nr_hash >> dq_hash_bits);
	dq_hash_bits--;

	nr_hash = 1UL << dq_hash_bits;
	dq_hash_mask = nr_hash - 1;
	for (i = 0; i < nr_hash; i++)
		INIT_HLIST_HEAD(dquot_hash + i);

A
Anton Blanchard 已提交
2984 2985
	pr_info("VFS: Dquot-cache hash table entries: %ld (order %ld,"
		" %ld bytes)\n", nr_hash, order, (PAGE_SIZE << order));
L
Linus Torvalds 已提交
2986

2987
	register_shrinker(&dqcache_shrinker);
L
Linus Torvalds 已提交
2988 2989 2990

	return 0;
}
2991
fs_initcall(dquot_init);