A cleancache "backend" that provides transcendent memory registers itself
 to the kernel's cleancache "frontend" by calling cleancache_register_ops,
 passing a pointer to a cleancache_ops structure with funcs set appropriately.
-Note that cleancache_register_ops returns the previous settings so that
-chaining can be performed if desired. The functions provided must conform to
-certain semantics as follows:
+The functions provided must conform to certain semantics as follows:
 
 Most important, cleancache is "ephemeral".  Pages which are copied into
 cleancache have an indefinite lifetime which is completely unknowable
 
 #ifdef CONFIG_CLEANCACHE
        BUG_ON(sizeof(struct cleancache_filekey) != sizeof(struct tmem_oid));
        if (tmem_enabled && cleancache) {
-               char *s = "";
-               struct cleancache_ops *old_ops =
-                       cleancache_register_ops(&tmem_cleancache_ops);
-               if (old_ops)
-                       s = " (WARNING: cleancache_ops overridden)";
-               pr_info("cleancache enabled, RAM provided by Xen Transcendent Memory%s\n",
-                       s);
+               int err;
+
+               err = cleancache_register_ops(&tmem_cleancache_ops);
+               if (err)
+                       pr_warn("xen-tmem: failed to enable cleancache: %d\n",
+                               err);
+               else
+                       pr_info("cleancache enabled, RAM provided by "
+                               "Xen Transcendent Memory\n");
        }
 #endif
 #ifdef CONFIG_XEN_SELFBALLOONING
 
        void (*invalidate_fs)(int);
 };
 
-extern struct cleancache_ops *
-       cleancache_register_ops(struct cleancache_ops *ops);
+extern int cleancache_register_ops(struct cleancache_ops *ops);
 extern void __cleancache_init_fs(struct super_block *);
 extern void __cleancache_init_shared_fs(struct super_block *);
 extern int  __cleancache_get_page(struct page *);
 
  */
 
 /*
- * Register operations for cleancache, returning previous thus allowing
- * detection of multiple backends and possible nesting.
+ * Register operations for cleancache. Returns 0 on success.
  */
-struct cleancache_ops *cleancache_register_ops(struct cleancache_ops *ops)
+int cleancache_register_ops(struct cleancache_ops *ops)
 {
-       struct cleancache_ops *old = cleancache_ops;
        int i;
 
        mutex_lock(&poolid_mutex);
+       if (cleancache_ops) {
+               mutex_unlock(&poolid_mutex);
+               return -EBUSY;
+       }
        for (i = 0; i < MAX_INITIALIZABLE_FS; i++) {
                if (fs_poolid_map[i] == FS_NO_BACKEND)
                        fs_poolid_map[i] = ops->init_fs(PAGE_SIZE);
        barrier();
        cleancache_ops = ops;
        mutex_unlock(&poolid_mutex);
-       return old;
+       return 0;
 }
 EXPORT_SYMBOL(cleancache_register_ops);