budb: Only have one build rule for budb_errs.c
[openafs.git] / src / budb / database.c
index 2445dd4..94045e2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -10,6 +10,7 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
+#include <roken.h>
 
 #ifdef AFS_NT40_ENV
 #include <winsock2.h>
@@ -45,7 +46,6 @@ InitDB(void)
     pollCount = 0;
 
     memset(&db, 0, sizeof(db));
-    Lock_Init(&db.lock);
     if ((code = InitDBalloc()) || (code = InitDBhash()))
        return code;
     return 0;
@@ -53,7 +53,7 @@ InitDB(void)
 
 /* package up seek and write into one procedure for ease of use */
 
-/* dbwrite 
+/* dbwrite
  *     write a portion of the database
  * entry:
  *     pos - offset into the database (disk address). If this is in the
@@ -114,8 +114,8 @@ dbread(struct ubik_trans *ut, afs_int32 pos, void *buff, afs_int32 len)
     }
     code = ubik_Read(ut, buff, len);
     if (code) {
-       LogError(code, "dbread: ubik_Read pos %d, buff %d, len %d\n", pos,
-                buff, len);
+       LogError(code, "dbread: ubik_Read pos %d, buff %"AFS_PTR_FMT
+                ", len %d\n", pos, buff, len);
        ERROR(code);
     }
 
@@ -149,8 +149,8 @@ cdbread(struct ubik_trans *ut, int type, afs_int32 pos, void *buff, afs_int32 le
     }
     code = ubik_Read(ut, buff, len);
     if (code) {
-       LogError(code, "cdbread: ubik_Read pos 0x%x, buff %d, len %d\n", pos,
-                buff, len);
+       LogError(code, "cdbread: ubik_Read pos 0x%x, buff %"AFS_PTR_FMT
+                ", len %d\n", pos, buff, len);
        ERROR(code);
     }
 
@@ -167,17 +167,22 @@ cdbread(struct ubik_trans *ut, int type, afs_int32 pos, void *buff, afs_int32 le
 /* check that the database has been initialized.  Be careful to fail in a safe
    manner, to avoid bogusly reinitializing the db.  */
 
-afs_int32
-CheckInit(struct ubik_trans *ut, 
-         int (*db_init) (struct ubik_trans *ut)) /* call if rebuilding DB */
+/**
+ * reads in db cache from ubik.
+ *
+ * @param[in] ut ubik transaction
+ * @param[in] rock  opaque pointer to an int (*) (struct ubik_trans *), which
+ *                  will be called on rebuilding the database (or NULL to not
+ *                  rebuild the db)
+ *
+ * @return operation status
+ *   @retval 0 success
+ */
+static afs_int32
+UpdateCache(struct ubik_trans *ut, void *rock)
 {
-    register afs_int32 code;
-
-    /* Don't read header if not necessary */
-    if (!ubik_CacheUpdate(ut))
-       return 0;
-
-    ObtainWriteLock(&db.lock);
+    int (*db_init) (struct ubik_trans *ut) = rock;
+    afs_int32 code;
 
     db.h.eofPtr = htonl(sizeof(db.h)); /* for sanity check in dbread */
     code = dbread(ut, 0, (char *)&db.h, sizeof(db.h));
@@ -202,7 +207,6 @@ CheckInit(struct ubik_trans *ut,
     ht_Reset(&db.dumpIden);
 
   error_exit:
-    ReleaseWriteLock(&db.lock);
     if (code) {
        if ((code == UEOF) || (code == BUDB_EMPTY)) {
            if (db_init) {
@@ -234,3 +238,10 @@ CheckInit(struct ubik_trans *ut,
     }
     return code;
 }
+
+afs_int32
+CheckInit(struct ubik_trans *ut,
+         int (*db_init) (struct ubik_trans *ut)) /* call if rebuilding DB */
+{
+    return ubik_CheckCache(ut, UpdateCache, db_init);
+}