Hi Bob,

On Tue, May 26, 2020 at 3:05 PM Bob Peterson <rpete...@redhat.com> wrote:
> This adds checks for gfs2_log_flush being stuck, similarly to the check
> in gfs2_ail1_flush.
>
> Signed-off-by: Bob Peterson <rpete...@redhat.com>
> ---
>  fs/gfs2/log.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
> index 1d51b4781bdd..636c82dda68b 100644
> --- a/fs/gfs2/log.c
> +++ b/fs/gfs2/log.c
> @@ -145,9 +145,6 @@ static void dump_ail_list(struct gfs2_sbd *sdp)
>         struct gfs2_bufdata *bd;
>         struct buffer_head *bh;
>
> -       fs_err(sdp, "Error: In gfs2_ail1_flush for ten minutes! t=%d\n",
> -              current->journal_info ? 1 : 0);
> -
>         list_for_each_entry_reverse(tr, &sdp->sd_ail1_list, tr_list) {
>                 list_for_each_entry_reverse(bd, &tr->tr_ail1_list,
>                                             bd_ail_st_list) {
> @@ -197,6 +194,8 @@ void gfs2_ail1_flush(struct gfs2_sbd *sdp, struct 
> writeback_control *wbc)
>  restart:
>         ret = 0;
>         if (time_after(jiffies, flush_start + (HZ * 600))) {
> +               fs_err(sdp, "Error: In gfs2_ail1_flush for ten minutes! "
> +                      "t=%d\n", current->journal_info ? 1 : 0);
>                 dump_ail_list(sdp);
>                 goto out;
>         }
> @@ -970,7 +969,16 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct 
> gfs2_glock *gl, u32 flags)
>
>         if (!(flags & GFS2_LOG_HEAD_FLUSH_NORMAL)) {
>                 if (!sdp->sd_log_idle) {
> +                       unsigned long start = jiffies;
> +
>                         for (;;) {
> +                               if (time_after(jiffies, start + (HZ * 600))) {

This should probably have some rate limiting as well, for example:

                                        start = jiffies;

I'm not sure what provides similar rate limiting in gfs2_ail1_flush.

> +                                       fs_err(sdp, "Error: In gfs2_log_flush 
> "
> +                                              "for 10 minutes! t=%d\n",
> +                                              current->journal_info ? 1 : 0);

Please don't break the format string up like that; this makes grepping harder.

> +                                       dump_ail_list(sdp);
> +                                       break;
> +                               }
>                                 gfs2_ail1_start(sdp);
>                                 gfs2_ail1_wait(sdp);
>                                 if (gfs2_ail1_empty(sdp, 0))
> --
> 2.26.2
>

Reply via email to