--- /dev/null
+Signed-off-by: Josh Durgin <address@hidden>
+---
+ block/rbd.c | 19 +++++++++++++++++++
+ 1 files changed, 19 insertions(+), 0 deletions(-)
+
+diff --git a/block/rbd.c b/block/rbd.c
+index 1280d66..eebc334 100644
+--- a/block/rbd.c
++++ b/block/rbd.c
+@@ -476,6 +476,25 @@ static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags)
+ s->snap = g_strdup(snap_buf);
+ }
+
++ /*
++ * Fallback to more conservative semantics if setting cache
++ * options fails. Ignore errors from setting rbd_cache because the
++ * only possible error is that the option does not exist, and
++ * librbd defaults to no caching. If write through caching cannot
++ * be set up, fall back to no caching.
++ */
++ if (flags & BDRV_O_NOCACHE) {
++ rados_conf_set(s->cluster, "rbd_cache", "false");
++ } else {
++ rados_conf_set(s->cluster, "rbd_cache", "true");
++ if (!(flags & BDRV_O_CACHE_WB)) {
++ r = rados_conf_set(s->cluster, "rbd_cache_max_dirty", "0");
++ if (r < 0) {
++ rados_conf_set(s->cluster, "rbd_cache", "false");
++ }
++ }
++ }
++
+ if (strstr(conf, "conf=") == NULL) {
+ /* try default location, but ignore failure */
+ rados_conf_read_file(s->cluster, NULL);
+--
+1.7.5.4