Commit fd041f0b authored by Steven Whitehouse's avatar Steven Whitehouse
Browse files

[GFS2] Use atomic_t for journal free blocks counter



This patch changes the counter which keeps track of the free
blocks in the journal to an atomic_t in preparation for the
following patch which will update the log reservation code.
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 2bcd610d
...@@ -595,7 +595,7 @@ struct gfs2_sbd { ...@@ -595,7 +595,7 @@ struct gfs2_sbd {
struct list_head sd_log_le_databuf; struct list_head sd_log_le_databuf;
struct list_head sd_log_le_ordered; struct list_head sd_log_le_ordered;
unsigned int sd_log_blks_free; atomic_t sd_log_blks_free;
struct mutex sd_log_reserve_mutex; struct mutex sd_log_reserve_mutex;
u64 sd_log_sequence; u64 sd_log_sequence;
......
...@@ -301,7 +301,7 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks) ...@@ -301,7 +301,7 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
mutex_lock(&sdp->sd_log_reserve_mutex); mutex_lock(&sdp->sd_log_reserve_mutex);
gfs2_log_lock(sdp); gfs2_log_lock(sdp);
while(sdp->sd_log_blks_free <= (blks + reserved_blks)) { while(atomic_read(&sdp->sd_log_blks_free) <= (blks + reserved_blks)) {
gfs2_log_unlock(sdp); gfs2_log_unlock(sdp);
gfs2_ail1_empty(sdp, 0); gfs2_ail1_empty(sdp, 0);
gfs2_log_flush(sdp, NULL); gfs2_log_flush(sdp, NULL);
...@@ -310,7 +310,7 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks) ...@@ -310,7 +310,7 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
gfs2_ail1_start(sdp, 0); gfs2_ail1_start(sdp, 0);
gfs2_log_lock(sdp); gfs2_log_lock(sdp);
} }
sdp->sd_log_blks_free -= blks; atomic_sub(blks, &sdp->sd_log_blks_free);
gfs2_log_unlock(sdp); gfs2_log_unlock(sdp);
mutex_unlock(&sdp->sd_log_reserve_mutex); mutex_unlock(&sdp->sd_log_reserve_mutex);
...@@ -330,9 +330,9 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks) ...@@ -330,9 +330,9 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
{ {
gfs2_log_lock(sdp); gfs2_log_lock(sdp);
sdp->sd_log_blks_free += blks; atomic_add(blks, &sdp->sd_log_blks_free);
gfs2_assert_withdraw(sdp, gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); atomic_read(&sdp->sd_log_blks_free) <= sdp->sd_jdesc->jd_blocks);
gfs2_log_unlock(sdp); gfs2_log_unlock(sdp);
up_read(&sdp->sd_log_flush_lock); up_read(&sdp->sd_log_flush_lock);
} }
...@@ -559,8 +559,8 @@ static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail) ...@@ -559,8 +559,8 @@ static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail)
ail2_empty(sdp, new_tail); ail2_empty(sdp, new_tail);
gfs2_log_lock(sdp); gfs2_log_lock(sdp);
sdp->sd_log_blks_free += dist; atomic_add(dist, &sdp->sd_log_blks_free);
gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks); gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <= sdp->sd_jdesc->jd_blocks);
gfs2_log_unlock(sdp); gfs2_log_unlock(sdp);
sdp->sd_log_tail = new_tail; sdp->sd_log_tail = new_tail;
...@@ -733,7 +733,7 @@ void __gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl) ...@@ -733,7 +733,7 @@ void __gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
log_flush_commit(sdp); log_flush_commit(sdp);
else if (sdp->sd_log_tail != current_tail(sdp) && !sdp->sd_log_idle){ else if (sdp->sd_log_tail != current_tail(sdp) && !sdp->sd_log_idle){
gfs2_log_lock(sdp); gfs2_log_lock(sdp);
sdp->sd_log_blks_free--; /* Adjust for unreserved buffer */ atomic_dec(&sdp->sd_log_blks_free); /* Adjust for unreserved buffer */
gfs2_log_unlock(sdp); gfs2_log_unlock(sdp);
log_write_header(sdp, 0, PULL); log_write_header(sdp, 0, PULL);
} }
...@@ -773,12 +773,12 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) ...@@ -773,12 +773,12 @@ 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; 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); gfs2_assert_withdraw(sdp, ((int)sdp->sd_log_commited_revoke) >= 0);
reserved = calc_reserved(sdp); reserved = calc_reserved(sdp);
old = sdp->sd_log_blks_free; old = atomic_read(&sdp->sd_log_blks_free);
sdp->sd_log_blks_free += tr->tr_reserved - atomic_add(tr->tr_reserved - (reserved - sdp->sd_log_blks_reserved),
(reserved - sdp->sd_log_blks_reserved); &sdp->sd_log_blks_free);
gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free >= old); gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) >= old);
gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free <= gfs2_assert_withdraw(sdp, atomic_read(&sdp->sd_log_blks_free) <=
sdp->sd_jdesc->jd_blocks); sdp->sd_jdesc->jd_blocks);
sdp->sd_log_blks_reserved = reserved; sdp->sd_log_blks_reserved = reserved;
...@@ -831,7 +831,7 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp) ...@@ -831,7 +831,7 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp)
log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT, log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT,
(sdp->sd_log_tail == current_tail(sdp)) ? 0 : PULL); (sdp->sd_log_tail == current_tail(sdp)) ? 0 : PULL);
gfs2_assert_warn(sdp, sdp->sd_log_blks_free == sdp->sd_jdesc->jd_blocks); gfs2_assert_warn(sdp, atomic_read(&sdp->sd_log_blks_free) == sdp->sd_jdesc->jd_blocks);
gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail); gfs2_assert_warn(sdp, sdp->sd_log_head == sdp->sd_log_tail);
gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list)); gfs2_assert_warn(sdp, list_empty(&sdp->sd_ail2_list));
......
...@@ -339,7 +339,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo) ...@@ -339,7 +339,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
if (sdp->sd_args.ar_spectator) { if (sdp->sd_args.ar_spectator) {
sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0); sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
sdp->sd_log_blks_free = sdp->sd_jdesc->jd_blocks; atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
} else { } else {
if (sdp->sd_lockstruct.ls_jid >= gfs2_jindex_size(sdp)) { if (sdp->sd_lockstruct.ls_jid >= gfs2_jindex_size(sdp)) {
fs_err(sdp, "can't mount journal #%u\n", fs_err(sdp, "can't mount journal #%u\n",
...@@ -376,7 +376,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo) ...@@ -376,7 +376,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
sdp->sd_jdesc->jd_jid, error); sdp->sd_jdesc->jd_jid, error);
goto fail_jinode_gh; goto fail_jinode_gh;
} }
sdp->sd_log_blks_free = sdp->sd_jdesc->jd_blocks; atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
} }
if (sdp->sd_lockstruct.ls_first) { if (sdp->sd_lockstruct.ls_first) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment