Commit b11e1a84 authored by Bob Peterson's avatar Bob Peterson

gfs2: If go_sync returns error, withdraw but skip invalidate

Before this patch, if the go_sync operation returned an error during
the do_xmote process (such as unable to sync metadata to the journal)
the code did goto out. That kept the glock locked, so it could not be
given away, which correctly avoids file system corruption. However,
it never set the withdraw bit or requeueing the glock work. So it would
hang forever, unable to ever demote the glock.

This patch changes to goto to a new label, skip_inval, so that errors
from go_sync are treated the same way as errors from go_inval:
The delayed withdraw bit is set and the work is requeued. That way,
the logd should eventually figure out there's a problem and withdraw
properly there.
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent f4e2f5e1
...@@ -613,7 +613,7 @@ __acquires(&gl->gl_lockref.lock) ...@@ -613,7 +613,7 @@ __acquires(&gl->gl_lockref.lock)
fs_err(sdp, "Error %d syncing glock \n", ret); fs_err(sdp, "Error %d syncing glock \n", ret);
gfs2_dump_glock(NULL, gl, true); gfs2_dump_glock(NULL, gl, true);
} }
goto out; goto skip_inval;
} }
} }
if (test_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags)) { if (test_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags)) {
...@@ -633,6 +633,7 @@ __acquires(&gl->gl_lockref.lock) ...@@ -633,6 +633,7 @@ __acquires(&gl->gl_lockref.lock)
clear_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags); clear_bit(GLF_INVALIDATE_IN_PROGRESS, &gl->gl_flags);
} }
skip_inval:
gfs2_glock_hold(gl); gfs2_glock_hold(gl);
/* /*
* Check for an error encountered since we called go_sync and go_inval. * Check for an error encountered since we called go_sync and go_inval.
......
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