GFS2: Fix spectator umount issue

The tests further down the recovery function relating to
unlocking the journal need to be updated to match the
intial test. Also, a test in the umount code which was
surplus to requirements has been removed. Umounting
spectator mounts now works correctly, as expected.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
Steven Whitehouse 2010-09-29 14:20:52 +01:00
parent d594845106
commit c741c45512
2 changed files with 7 additions and 7 deletions

View File

@ -1517,7 +1517,7 @@ static void clear_glock(struct gfs2_glock *gl)
spin_unlock(&lru_lock); spin_unlock(&lru_lock);
spin_lock(&gl->gl_spin); spin_lock(&gl->gl_spin);
if (find_first_holder(gl) == NULL && gl->gl_state != LM_ST_UNLOCKED) if (gl->gl_state != LM_ST_UNLOCKED)
handle_callback(gl, LM_ST_UNLOCKED, 0); handle_callback(gl, LM_ST_UNLOCKED, 0);
spin_unlock(&gl->gl_spin); spin_unlock(&gl->gl_spin);
gfs2_glock_hold(gl); gfs2_glock_hold(gl);

View File

@ -455,12 +455,13 @@ void gfs2_recover_func(struct work_struct *work)
int ro = 0; int ro = 0;
unsigned int pass; unsigned int pass;
int error; int error;
int jlocked = 0;
if (sdp->sd_args.ar_spectator || if (sdp->sd_args.ar_spectator ||
(jd->jd_jid != sdp->sd_lockstruct.ls_jid)) { (jd->jd_jid != sdp->sd_lockstruct.ls_jid)) {
fs_info(sdp, "jid=%u: Trying to acquire journal lock...\n", fs_info(sdp, "jid=%u: Trying to acquire journal lock...\n",
jd->jd_jid); jd->jd_jid);
jlocked = 1;
/* Acquire the journal lock so we can do recovery */ /* Acquire the journal lock so we can do recovery */
error = gfs2_glock_nq_num(sdp, jd->jd_jid, &gfs2_journal_glops, error = gfs2_glock_nq_num(sdp, jd->jd_jid, &gfs2_journal_glops,
@ -555,13 +556,12 @@ void gfs2_recover_func(struct work_struct *work)
jd->jd_jid, t); jd->jd_jid, t);
} }
if (jd->jd_jid != sdp->sd_lockstruct.ls_jid)
gfs2_glock_dq_uninit(&ji_gh);
gfs2_recovery_done(sdp, jd->jd_jid, LM_RD_SUCCESS); gfs2_recovery_done(sdp, jd->jd_jid, LM_RD_SUCCESS);
if (jd->jd_jid != sdp->sd_lockstruct.ls_jid) if (jlocked) {
gfs2_glock_dq_uninit(&ji_gh);
gfs2_glock_dq_uninit(&j_gh); gfs2_glock_dq_uninit(&j_gh);
}
fs_info(sdp, "jid=%u: Done\n", jd->jd_jid); fs_info(sdp, "jid=%u: Done\n", jd->jd_jid);
goto done; goto done;
@ -569,7 +569,7 @@ void gfs2_recover_func(struct work_struct *work)
fail_gunlock_tr: fail_gunlock_tr:
gfs2_glock_dq_uninit(&t_gh); gfs2_glock_dq_uninit(&t_gh);
fail_gunlock_ji: fail_gunlock_ji:
if (jd->jd_jid != sdp->sd_lockstruct.ls_jid) { if (jlocked) {
gfs2_glock_dq_uninit(&ji_gh); gfs2_glock_dq_uninit(&ji_gh);
fail_gunlock_j: fail_gunlock_j:
gfs2_glock_dq_uninit(&j_gh); gfs2_glock_dq_uninit(&j_gh);