Protect ubik cache accesses
[openafs.git] / src / ubik / ubik.p.h
index 5f9f48f..3fe8b15 100644 (file)
@@ -190,12 +190,28 @@ struct ubik_dbase {
     int (*getnfiles) (struct ubik_dbase * adbase);     /*!< find out number of files */
     short readers;             /*!< number of current read transactions */
     struct ubik_version cachedVersion; /*!< version of caller's cached data */
+#ifdef UKERNEL
+    struct afs_lock cache_lock;
+#else
+    struct Lock cache_lock; /*!< protects cached application data */
+#endif
 #ifdef AFS_PTHREAD_ENV
     pthread_cond_t version_cond;    /*!< condition variable to manage changes to version */
     pthread_cond_t flags_cond;      /*!< condition variable to manage changes to flags */
 #endif
 };
 
+/**
+ * ubik_CheckCache callback function.
+ *
+ * @param[in] atrans  ubik transaction
+ * @param[in] rock    rock passed to ubik_CheckCache
+ *
+ * @return operation status
+ *   @retval 0        cache was read properly
+ */
+typedef int (*ubik_updatecache_func) (struct ubik_trans *atrans, void *rock);
+
 /*! \name procedures for automatically authenticating ubik connections */
 extern int (*ubik_CRXSecurityProc) (void *, struct rx_securityClass **,
                                    afs_int32 *);
@@ -232,6 +248,9 @@ extern void *ubik_CheckRXSecurityRock;
 #define TRSETLOCK           8  /*!< SetLock is using trans */
 #define TRSTALE             16 /*!< udisk_end during getLock */
 #endif /* UBIK_PAUSE */
+#define TRCACHELOCKED       32  /*!< this trans has locked dbase->cache_lock
+                                 *   (meaning, this trans has called
+                                 *   ubik_CheckCache at some point */
 /*\}*/
 
 /*! \name ubik_lock flags */
@@ -494,7 +513,9 @@ extern int ubik_WaitVersion(register struct ubik_dbase *adatabase,
                            register struct ubik_version *aversion);
 extern int ubik_GetVersion(register struct ubik_trans *atrans,
                           register struct ubik_version *avers);
-extern int ubik_CacheUpdate(register struct ubik_trans *atrans);
+extern int ubik_CheckCache(struct ubik_trans *atrans,
+                           ubik_updatecache_func check,
+                           void *rock);
 /*\}*/
 
 /*! \name ubikclient.c */