On Fri, Aug 09, 2019 at 02:42:31PM +0200, Jan Kara wrote: > @@ -1660,10 +1660,9 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) > __jbd2_journal_file_buffer(jh, transaction, BJ_Forget); > spin_unlock(&journal->j_list_lock); > } > - > +drop: > jbd_unlock_bh_state(bh); > __brelse(bh); > -drop: > if (drop_reserve) { > /* no need to reserve log space for this block -bzzz */ > handle->h_buffer_credits++; (Workflow observation: this is an example where Gerrit can be *so* *much* *better* than e-mail review at times; sometimes, you *really* want to see more context than what e-mail affords you.) After this patch, the resulting code looks like this: ----- drop: jbd_unlock_bh_state(bh); __brelse(bh); if (drop_reserve) { /* no need to reserve log space for this block -bzzz */ handle->h_buffer_credits++; } return err; not_jbd: jbd_unlock_bh_state(bh); __bforget(bh); goto drop; ---- And we still have a case we jump to not_jbd, at which point hilarity will ensue. This is cleaned up in the following patch in this sequence, but this leaves us in a not-great state if we are ever bisecting. - Ted