• Bob Peterson's avatar
    gfs2: Add quota_change type · 432928c9
    Bob Peterson authored
    Function do_qc has two main uses: (1) to re-sync the local quota changes
    (qd) to the master quotas, and (2) normal quota changes. In the case of
    normal quota changes, the change can be positive or negative, as the
    quota usage goes up and down.
    
    Before this patch function do_qc was distinguishing one from another by
    whether the resulting value is or isn't zero: In the case of a re-sync
    (called do_sync) the quota value is moved from the temporary value to a
    master value, so the amount is added to one and subtracted from the
    other. The problem is that since the values can be positive or negative
    we can occasionally run into situations where we are not doing a re-sync
    but the quota change just happens to cancel out the previous value.
    
    In the case of a re-sync extra references and locks are taken, and so
    do_qc needs to release them. In the case of a normal quota change, no
    extra references and locks are taken, so it must not try to release
    them.
    
    The problem is: if the quota change is not a re-sync but the value just
    happens to cancel out the original quota change, the resulting zero
    value fools do_qc into thinking this is a re-sync and therefore it must
    release the extra references. This results in problems, mainly having to
    do with slot reference numbers going smaller than zero.
    
    This patch introduces new constants, QC_SYNC and QC_CHANGE so do_qc can
    really tell the difference. For QC_SYNC calls it must release the extra
    references acquired by gfs2_quota_unlock's call to qd_check_sync. For
    QC_CHANGE calls it does not have extra references to put.
    
    Note that this allows quota changes back to a value of zero, and so I
    removed an assert warning related to that.
    Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    432928c9
util.c 15.3 KB