https://bugzilla.novell.com/show_bug.cgi?id=879425
---
 tools/libxl/libxl.c         |    2 ++
 tools/libxl/libxl.h         |   12 ++++++++++++
 tools/libxl/libxlu_disk.c   |    2 ++
 tools/libxl/libxlu_disk_i.h |    2 +-
 tools/libxl/libxlu_disk_l.l |    1 +
 5 files changed, 18 insertions(+), 1 deletion(-)

Index: xen-4.4.3-testing/tools/libxl/libxl.c
===================================================================
--- xen-4.4.3-testing.orig/tools/libxl/libxl.c
+++ xen-4.4.3-testing/tools/libxl/libxl.c
@@ -2501,6 +2501,8 @@ static void device_disk_add(libxl__egc *
             flexarray_append_pair(back, "direct-io-safe", "1");
         if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC)
             flexarray_append_pair(back, "discard-enable", "0");
+        if ((disk->readwrite & ~LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MASK) == LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MAGIC)
+            flexarray_append_pair(back, "suse-diskcache-disable-flush", "1");
 
         flexarray_append(front, "backend-id");
         flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
Index: xen-4.4.3-testing/tools/libxl/libxl.h
===================================================================
--- xen-4.4.3-testing.orig/tools/libxl/libxl.h
+++ xen-4.4.3-testing/tools/libxl/libxl.h
@@ -118,6 +118,18 @@
 #define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK  0xffffff0fU
 
 /*
+ * The libxl_device_disk has no way to indicate that cache=unsafe is
+ * supposed to be used. Provide this knob without breaking the ABI.
+ * This is done by overloading struct libxl_device_disk->readwrite:
+ * readwrite == 0: disk is readonly, no discard
+ * readwrite == 1: disk is readwrite, backend driver may enable discard
+ * readwrite == MAGIC: disk is readwrite, backend driver should ignore
+ * flush requests from the frontend driver.
+ */
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MAGIC 0x00006000U
+#define LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MASK  0xffff0fffU
+
+/*
  * libxl ABI compatibility
  *
  * The only guarantee which libxl makes regarding ABI compatibility
Index: xen-4.4.3-testing/tools/libxl/libxlu_disk.c
===================================================================
--- xen-4.4.3-testing.orig/tools/libxl/libxlu_disk.c
+++ xen-4.4.3-testing/tools/libxl/libxlu_disk.c
@@ -84,6 +84,8 @@ int xlu_disk_parse(XLU_Config *cfg,
         disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DIRECT_IO_SAFE_MAGIC;
     if (disk->readwrite && dpc.disable_discard)
         disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_DISABLE_MAGIC;
+    if (disk->readwrite && dpc.suse_diskcache_disable_flush)
+        disk->readwrite = (disk->readwrite & LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MASK) | LIBXL_HAVE_LIBXL_DEVICE_DISK_DISABLE_FLUSH_MAGIC;
 
     if (!disk->vdev) {
         xlu__disk_err(&dpc,0, "no vdev specified");
Index: xen-4.4.3-testing/tools/libxl/libxlu_disk_i.h
===================================================================
--- xen-4.4.3-testing.orig/tools/libxl/libxlu_disk_i.h
+++ xen-4.4.3-testing/tools/libxl/libxlu_disk_i.h
@@ -10,7 +10,7 @@ typedef struct {
     void *scanner;
     YY_BUFFER_STATE buf;
     libxl_device_disk *disk;
-    int access_set, direct_io_safe, disable_discard, had_depr_prefix;
+    int access_set, suse_diskcache_disable_flush, direct_io_safe, disable_discard, had_depr_prefix;
     const char *spec;
 } DiskParseContext;
 
Index: xen-4.4.3-testing/tools/libxl/libxlu_disk_l.l
===================================================================
--- xen-4.4.3-testing.orig/tools/libxl/libxlu_disk_l.l
+++ xen-4.4.3-testing/tools/libxl/libxlu_disk_l.l
@@ -176,6 +176,7 @@ script=[^,]*,?	{ STRIP(','); SAVESTRING(
 direct-io-safe,? { DPC->direct_io_safe = 1; }
 discard,?	{ DPC->disable_discard = 0; }
 no-discard,?	{ DPC->disable_discard = 1; }
+suse-diskcache-disable-flush,? { DPC->suse_diskcache_disable_flush = 1; }
 
  /* the target magic parameter, eats the rest of the string */
 
