Staging: hv: Introduce a function to wait to drain outgoing I/O

Rather than busy loop waiting to drain I/O, introduce a function
that does not burn CPU cycles waiting.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Abhishek Kane <v-abkane@microsoft.com>
Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
diff --git a/drivers/staging/hv/storvsc_api.h b/drivers/staging/hv/storvsc_api.h
index 32228c0..1887940 100644
--- a/drivers/staging/hv/storvsc_api.h
+++ b/drivers/staging/hv/storvsc_api.h
@@ -26,6 +26,7 @@
 #define _STORVSC_API_H_
 
 #include <linux/kernel.h>
+#include <linux/wait.h>
 #include "vstorage.h"
 #include "vmbus_api.h"
 #include "vmbus.h"
@@ -108,8 +109,11 @@
 	/* 0 indicates the device is being destroyed */
 	atomic_t ref_count;
 
+	bool	 drain_notify;
 	atomic_t num_outstanding_req;
 
+	wait_queue_head_t waiting_to_drain;
+
 	/*
 	 * Each unique Port/Path/Target represents 1 channel ie scsi
 	 * controller. In reality, the pathid, targetid is always 0
@@ -161,6 +165,14 @@
 	return hvdr_to_stordr(hvdrv);
 }
 
+static inline void storvsc_wait_to_drain(struct storvsc_device *dev)
+{
+	dev->drain_notify = true;
+	wait_event(dev->waiting_to_drain,
+		   atomic_read(&dev->num_outstanding_req) == 0);
+	dev->drain_notify = false;
+}
+
 /* Interface */
 
 int storvsc_dev_add(struct hv_device *device,