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