mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
gfs2: Revert "Add quota_change type"
Commit432928c937
("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 commit432928c937
. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
4b4b6374dc
commit
ec4b5200c8
@ -75,9 +75,6 @@
|
|||||||
#define GFS2_QD_HASH_SIZE BIT(GFS2_QD_HASH_SHIFT)
|
#define GFS2_QD_HASH_SIZE BIT(GFS2_QD_HASH_SHIFT)
|
||||||
#define GFS2_QD_HASH_MASK (GFS2_QD_HASH_SIZE - 1)
|
#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 */
|
/* Lock order: qd_lock -> bucket lock -> qd->lockref.lock -> lru lock */
|
||||||
/* -> sd_bitmap_lock */
|
/* -> sd_bitmap_lock */
|
||||||
static DEFINE_SPINLOCK(qd_lock);
|
static DEFINE_SPINLOCK(qd_lock);
|
||||||
@ -695,7 +692,7 @@ static int sort_qd(const void *a, const void *b)
|
|||||||
return 0;
|
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_sbd *sdp = qd->qd_sbd;
|
||||||
struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode);
|
struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode);
|
||||||
@ -720,18 +717,16 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
|
|||||||
qd->qd_change = x;
|
qd->qd_change = x;
|
||||||
spin_unlock(&qd_lock);
|
spin_unlock(&qd_lock);
|
||||||
|
|
||||||
if (qc_type == QC_CHANGE) {
|
if (!x) {
|
||||||
if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
|
|
||||||
qd_hold(qd);
|
|
||||||
slot_hold(qd);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
|
gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
|
||||||
clear_bit(QDF_CHANGE, &qd->qd_flags);
|
clear_bit(QDF_CHANGE, &qd->qd_flags);
|
||||||
qc->qc_flags = 0;
|
qc->qc_flags = 0;
|
||||||
qc->qc_id = 0;
|
qc->qc_id = 0;
|
||||||
slot_put(qd);
|
slot_put(qd);
|
||||||
qd_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 */
|
if (change < 0) /* Reset quiet flag if we freed some blocks */
|
||||||
@ -977,7 +972,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda)
|
|||||||
if (error)
|
if (error)
|
||||||
goto out_end_trans;
|
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);
|
set_bit(QDF_REFRESH, &qd->qd_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1303,7 +1298,7 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
|
|||||||
|
|
||||||
if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
|
if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
|
||||||
qid_eq(qd->qd_id, make_kqid_gid(gid))) {
|
qid_eq(qd->qd_id, make_kqid_gid(gid))) {
|
||||||
do_qc(qd, change, QC_CHANGE);
|
do_qc(qd, change);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,12 +99,12 @@ out_unlock:
|
|||||||
*/
|
*/
|
||||||
int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp)
|
int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp)
|
||||||
{
|
{
|
||||||
|
int flags = LM_FLAG_NOEXP | GL_EXACT;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED,
|
error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, flags,
|
||||||
LM_FLAG_NOEXP | GL_EXACT,
|
|
||||||
&sdp->sd_freeze_gh);
|
&sdp->sd_freeze_gh);
|
||||||
if (error)
|
if (error && error != GLR_TRYFAILED)
|
||||||
fs_err(sdp, "can't lock the freeze glock: %d\n", error);
|
fs_err(sdp, "can't lock the freeze glock: %d\n", error);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user