Warn when a log space reservation is stuck for more than 60 seconds.

Signed-off-by: Andreas Gruenbacher <agrue...@redhat.com>
---
 fs/gfs2/log.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
index cf6b46247df4..3e3bc63f5377 100644
--- a/fs/gfs2/log.c
+++ b/fs/gfs2/log.c
@@ -354,15 +354,24 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int 
blks)
 retry:
        free_blocks = atomic_read(&sdp->sd_log_blks_free);
        if (unlikely(free_blocks <= wanted)) {
-               do {
+               for(;;) {
                        prepare_to_wait_exclusive(&sdp->sd_log_waitq, &wait,
                                        TASK_UNINTERRUPTIBLE);
                        wake_up(&sdp->sd_logd_waitq);
                        did_wait = 1;
-                       if (atomic_read(&sdp->sd_log_blks_free) <= wanted)
-                               io_schedule();
                        free_blocks = atomic_read(&sdp->sd_log_blks_free);
-               } while(free_blocks <= wanted);
+                       if (free_blocks > wanted)
+                               break;
+                       io_schedule_timeout(60 * HZ);
+                       free_blocks = atomic_read(&sdp->sd_log_blks_free);
+                       if (free_blocks > wanted)
+                               break;
+                       fs_warn(sdp, "Could not reserve %u log blocks for more "
+                                    "than 60 seconds, only %u out of %u "
+                                    "blocks available\n",
+                               wanted, free_blocks - 1,
+                               sdp->sd_jdesc->jd_blocks);
+               }
                finish_wait(&sdp->sd_log_waitq, &wait);
        }
        atomic_inc(&sdp->sd_reserving_log);
-- 
2.14.3

Reply via email to