Commit 1ac7bdee authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Wen Zhiwei
Browse files

gfs2: Revert "Add quota_change type"

stable inclusion
from stable-v6.6.50
commit d9612c66af360d9405d614abcddbaf63ec952fe8
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAYKL6

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=d9612c66af360d9405d614abcddbaf63ec952fe8



--------------------------------

[ Upstream commit ec4b5200c8af9ce021399d3192b3379c089396c3 ]

Commit 432928c9 ("gfs2: Add quota_change type") makes the incorrect
assertion that function do_qc() should behave differently in the two
contexts it is used in, but that isn't actually true.  In all cases,
do_qc() grabs a "reference" when it starts using a slot in the per-node
quota changes file, and it releases that "reference" when no more
residual changes remain.  Revert that broken commit.

There are some remaining issues with function do_qc() which are
addressed in the next commit.

This reverts commit 432928c9.

Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 4df9e63b
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -75,9 +75,6 @@
#define GFS2_QD_HASH_SIZE       BIT(GFS2_QD_HASH_SHIFT)
#define GFS2_QD_HASH_MASK       (GFS2_QD_HASH_SIZE - 1)

#define QC_CHANGE 0
#define QC_SYNC 1

/* Lock order: qd_lock -> bucket lock -> qd->lockref.lock -> lru lock */
/*                     -> sd_bitmap_lock                              */
static DEFINE_SPINLOCK(qd_lock);
@@ -697,7 +694,7 @@ static int sort_qd(const void *a, const void *b)
	return 0;
}

static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
static void do_qc(struct gfs2_quota_data *qd, s64 change)
{
	struct gfs2_sbd *sdp = qd->qd_sbd;
	struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode);
@@ -722,18 +719,16 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
	qd->qd_change = x;
	spin_unlock(&qd_lock);

	if (qc_type == QC_CHANGE) {
		if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
			qd_hold(qd);
			slot_hold(qd);
		}
	} else {
	if (!x) {
		gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
		clear_bit(QDF_CHANGE, &qd->qd_flags);
		qc->qc_flags = 0;
		qc->qc_id = 0;
		slot_put(qd);
		qd_put(qd);
	} else if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
		qd_hold(qd);
		slot_hold(qd);
	}

	if (change < 0) /* Reset quiet flag if we freed some blocks */
@@ -978,7 +973,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda)
		if (error)
			goto out_end_trans;

		do_qc(qd, -qd->qd_change_sync, QC_SYNC);
		do_qc(qd, -qd->qd_change_sync);
		set_bit(QDF_REFRESH, &qd->qd_flags);
	}

@@ -1300,7 +1295,7 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,

		if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
		    qid_eq(qd->qd_id, make_kqid_gid(gid))) {
			do_qc(qd, change, QC_CHANGE);
			do_qc(qd, change);
		}
	}
}
+3 −3
Original line number Diff line number Diff line
@@ -99,12 +99,12 @@ int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
 */
int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp)
{
	int flags = LM_FLAG_NOEXP | GL_EXACT;
	int error;

	error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED,
				   LM_FLAG_NOEXP | GL_EXACT,
	error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, flags,
				   &sdp->sd_freeze_gh);
	if (error)
	if (error && error != GLR_TRYFAILED)
		fs_err(sdp, "can't lock the freeze glock: %d\n", error);
	return error;
}