On Fri, Apr 21, 2023 at 9:07 PM Bob Peterson <rpete...@redhat.com> wrote: > Before this patch, function gfs2_ail_empty_gl did not return errors it > encountered from __gfs2_trans_begin. Those errors usually came from the > fact that the file system was made read-only, often due to unmount, > (but theoretically could be due to -o remount,ro) which prevented > the transaction from starting. > > The inability to start a transaction prevented its revokes from being > properly written to the journal for glocks during unmount (and > transition to ro). > > That meant glocks could be unlocked without the metadata properly > revoked in the journal. So other nodes could grab the glock thinking > that their lvb values were correct, but in fact corresponded to the > glock without its revokes properly synced. That presented as lvb > mismatch errors. > > This patch allows gfs2_ail_empty_gl to return the error properly to > the caller.
Alright, > Signed-off-by: Bob Peterson <rpete...@redhat.com> > --- > fs/gfs2/glops.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c > index 6e33c8058059..8e245d793e6b 100644 > --- a/fs/gfs2/glops.c > +++ b/fs/gfs2/glops.c > @@ -90,7 +90,7 @@ static int gfs2_ail_empty_gl(struct gfs2_glock *gl) > struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; > struct gfs2_trans tr; > unsigned int revokes; > - int ret; > + int ret = 0; > > revokes = atomic_read(&gl->gl_ail_count); > > @@ -124,15 +124,15 @@ static int gfs2_ail_empty_gl(struct gfs2_glock *gl) > memset(&tr, 0, sizeof(tr)); > set_bit(TR_ONSTACK, &tr.tr_flags); > ret = __gfs2_trans_begin(&tr, sdp, 0, revokes, _RET_IP_); > - if (ret) > - goto flush; > - __gfs2_ail_flush(gl, 0, revokes); > - gfs2_trans_end(sdp); > + if (!ret) { > + __gfs2_ail_flush(gl, 0, revokes); > + gfs2_trans_end(sdp); > + } but the above hunk doesn't help, so let me skip that. > flush: > gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | > GFS2_LFC_AIL_EMPTY_GL); > - return 0; > + return ret; > } > > void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync) > @@ -326,7 +326,9 @@ static int inode_go_sync(struct gfs2_glock *gl) > ret = gfs2_inode_metasync(gl); > if (!error) > error = ret; > - gfs2_ail_empty_gl(gl); > + ret = gfs2_ail_empty_gl(gl); > + if (!error) > + error = ret; > /* > * Writeback of the data mapping may cause the dirty flag to be set > * so we have to clear it again here. > -- > 2.39.2 > Thanks, Andreas