Commit 1ea06bec authored by Niu Yawei's avatar Niu Yawei Committed by Jan Kara
Browse files

quota: avoid unnecessary dqget()/dqput() calls



Avoid unnecessary dqget()/dqput() calls in __dquot_initialize(),
that will introduce global lock contention otherwise.

Signed-off-by: default avatarLai Siyao <lai.siyao@intel.com>
Signed-off-by: default avatarNiu Yawei <yawei.niu@intel.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 606cdcca
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -1402,7 +1402,7 @@ static int dquot_active(const struct inode *inode)
 */
static void __dquot_initialize(struct inode *inode, int type)
{
	int cnt;
	int cnt, init_needed = 0;
	struct dquot *got[MAXQUOTAS];
	struct super_block *sb = inode->i_sb;
	qsize_t rsv;
@@ -1418,6 +1418,15 @@ static void __dquot_initialize(struct inode *inode, int type)
		got[cnt] = NULL;
		if (type != -1 && cnt != type)
			continue;
		/*
		 * The i_dquot should have been initialized in most cases,
		 * we check it without locking here to avoid unnecessary
		 * dqget()/dqput() calls.
		 */
		if (inode->i_dquot[cnt])
			continue;
		init_needed = 1;

		switch (cnt) {
		case USRQUOTA:
			qid = make_kqid_uid(inode->i_uid);
@@ -1429,6 +1438,10 @@ static void __dquot_initialize(struct inode *inode, int type)
		got[cnt] = dqget(sb, qid);
	}

	/* All required i_dquot has been initialized */
	if (!init_needed)
		return;

	down_write(&sb_dqopt(sb)->dqptr_sem);
	if (IS_NOQUOTA(inode))
		goto out_err;