From: Mark Syms <mark.syms@citrix.com>
Date: Wed, 26 Jul 2017 09:27:34 +0100
Subject: CA-260195 Only log once for watchdog timeout

Signed-off-by: Mark Syms <mark.syms@citrix.com>
---
 drivers/tapdisk-vbd.c | 24 +++++++++++++++++++++---
 drivers/tapdisk-vbd.h |  2 ++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/tapdisk-vbd.c b/drivers/tapdisk-vbd.c
index 1fa874f..90db71f 100644
--- a/drivers/tapdisk-vbd.c
+++ b/drivers/tapdisk-vbd.c
@@ -100,6 +100,7 @@ tapdisk_vbd_create(uint16_t uuid)
 
 	vbd->uuid        = uuid;
 	vbd->req_timeout = TD_VBD_REQUEST_TIMEOUT;
+	vbd->watchdog_warned = false;
 
 	INIT_LIST_HEAD(&vbd->images);
 	INIT_LIST_HEAD(&vbd->new_requests);
@@ -1194,14 +1195,26 @@ tapdisk_vbd_check_state(td_vbd_t *vbd)
 		tapdisk_vbd_close(vbd);
 }
 
+void watchdog_cleared(td_vbd_t *vbd)
+{
+	if (vbd->watchdog_warned) {
+		DBG(TLOG_WARN, "%s: watchdog timeout: requests were blocked\n", vbd->name);
+		/* Ideally want a direct way to flush the log */
+		tlog_precious(1);
+	}
+	vbd->watchdog_warned = false;
+}
+
 void
 tapdisk_vbd_check_progress(td_vbd_t *vbd)
 {
 	time_t diff;
 	struct timeval now, delta;
 
-	if (list_empty(&vbd->pending_requests))
+	if (list_empty(&vbd->pending_requests)) {
+		watchdog_cleared(vbd);
 		return;
+	}
 
 	gettimeofday(&now, NULL);
 	timersub(&now, &vbd->ts, &delta);
@@ -1211,13 +1224,18 @@ tapdisk_vbd_check_progress(td_vbd_t *vbd)
 	{
 		if(tapdisk_vbd_queue_ready(vbd))
 		{
-			DBG(TLOG_WARN, "%s: watchdog timeout: pending requests "
-			"idle for %ld seconds\n", vbd->name, diff);
+			if (!vbd->watchdog_warned) {
+				DBG(TLOG_WARN, "%s: watchdog timeout: pending requests "
+				    "idle for %ld seconds\n", vbd->name, diff);
+				vbd->watchdog_warned = true;
+			}
 			tapdisk_vbd_drop_log(vbd);
 		}
 		return;
 	}
 
+	watchdog_cleared(vbd);
+
 	tapdisk_server_set_max_timeout(TD_VBD_WATCHDOG_TIMEOUT - diff);
 }
 
diff --git a/drivers/tapdisk-vbd.h b/drivers/tapdisk-vbd.h
index bab0a0f..82e7b24 100644
--- a/drivers/tapdisk-vbd.h
+++ b/drivers/tapdisk-vbd.h
@@ -162,6 +162,8 @@ struct td_vbd_handle {
 	stats_t vdi_stats;
 
 	char                       *logpath;
+
+	bool                       watchdog_warned;
 };
 
 #define tapdisk_vbd_for_each_request(vreq, tmp, list)	                \
-- 
1.8.3.1

