Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ac39aadd0440ae696e6dacaa8006ce1737b17008
Commit:     ac39aadd0440ae696e6dacaa8006ce1737b17008
Parent:     9656b2c14c6ee0806c90a6be41dec71117fc8f50
Author:     Steven Whitehouse <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 10 14:49:43 2008 +0000
Committer:  Steven Whitehouse <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 08:18:03 2008 +0000

    [GFS2] Fix assert in log code
    
    Although the values were all being calculated correctly, there was a
    race in the assert due to the way it was using atomic variables. This
    changes the value we assert on so that we get the same effect by testing
    a different variable. This prevents the assert triggering when it shouldn't.
    
    Signed-off-by: Steven Whitehouse <[EMAIL PROTECTED]>
---
 fs/gfs2/log.c |   11 ++++-------
 1 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index 9164525..161ab6f 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -757,7 +757,7 @@ void __gfs2_log_flush(struct gfs2_sbd *sdp, struct 
gfs2_glock *gl)
 static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
 {
        unsigned int reserved;
-       unsigned int old;
+       unsigned int unused;
 
        gfs2_log_lock(sdp);
 
@@ -769,14 +769,11 @@ static void log_refund(struct gfs2_sbd *sdp, struct 
gfs2_trans *tr)
        sdp->sd_log_commited_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm;
        gfs2_assert_withdraw(sdp, ((int)sdp->sd_log_commited_revoke) >= 0);
        reserved = calc_reserved(sdp);
-       old = atomic_read(&sdp->sd_log_blks_free);
-       atomic_add(tr->tr_reserved - (reserved - sdp->sd_log_blks_reserved),
-                  &sdp->sd_log_blks_free);
-
-       gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) >= old);
+       unused = sdp->sd_log_blks_reserved - reserved + tr->tr_reserved;
+       gfs2_assert_withdraw(sdp, unused >= 0);
+       atomic_add(unused, &sdp->sd_log_blks_free);
        gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
                             sdp->sd_jdesc->jd_blocks);
-
        sdp->sd_log_blks_reserved = reserved;
 
        gfs2_log_unlock(sdp);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to