]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gfs2: Revert "Add quota_change type"
authorAndreas Gruenbacher <agruenba@redhat.com>
Wed, 5 Jun 2024 20:13:15 +0000 (22:13 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Sat, 8 Jun 2024 00:35:09 +0000 (02:35 +0200)
Commit 432928c93779 ("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 432928c9377959684c748a9bc6553ed2d3c2ea4f.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/quota.c
fs/gfs2/util.c

index f0aaae07a5980d84c49e01fc8ed0334df7044c1d..371fad7d64e738760046e03a7f770eb7438a3da6 100644 (file)
@@ -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);
@@ -695,7 +692,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);
@@ -720,18 +717,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 */
@@ -977,7 +972,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);
        }
 
@@ -1303,7 +1298,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);
                }
        }
 }
index 7e79b1a9e35f135a3ba51bbc67df1146bd35748c..13be8d1d228b8fa9079a6fcf91b778475569648a 100644 (file)
@@ -99,12 +99,12 @@ out_unlock:
  */
 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;
 }