diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index b2984fb7b35c..29eb7adc4284 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1470,7 +1470,6 @@ int gfs2_quota_init(struct gfs2_sbd *sdp) if (qd == NULL) goto fail_brelse; - qd->qd_lockref.count = 0; set_bit(QDF_CHANGE, &qd->qd_flags); qd->qd_change = qc_change; qd->qd_slot = slot; @@ -1542,6 +1541,12 @@ void gfs2_quota_cleanup(struct gfs2_sbd *sdp) spin_lock(&qd_lock); list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) { spin_lock(&qd->qd_lockref.lock); + if (qd->qd_lockref.count == 1 && + test_and_clear_bit(QDF_CHANGE, &qd->qd_flags)) { + qd->qd_change = 0; + qd->qd_slot_ref = 0; + qd->qd_lockref.count = 0; + } if (qd->qd_lockref.count != 0) { spin_unlock(&qd->qd_lockref.lock); continue;