]> arthur.barton.de Git - netatalk.git/blobdiff - etc/cnid_dbd/cmd_dbd_scanvol.c
Merge 2-1
[netatalk.git] / etc / cnid_dbd / cmd_dbd_scanvol.c
index 49938af36e8a7e6e04d9b6700b92a718fcb64c71..a91f43716dd196c8a11ba56c8678c501dd8f2c97 100644 (file)
@@ -862,6 +862,11 @@ static int dbd_readdir(int volroot, cnid_t did)
     struct dirent *ep;
     static struct stat st;      /* Save some stack space */
 
+    /* keep trying to get the lock */
+    if (!db_locked)
+        if ((db_locked = get_lock(1, NULL)) == -1)
+            return -1;
+
     /* Check again for .AppleDouble folder, check_adfile also checks/creates it */
     if ((addir_ok = check_addir(volroot)) != 0)
         if ( ! (dbd_flags & DBD_FLAGS_SCAN))
@@ -1207,15 +1212,16 @@ int cmd_dbd_scanvol(DBD *dbd_ref, struct volinfo *vi, dbd_flags_t flags)
         return -1;
     }
 
-    /* temporary rebuild db, used with -re rebuild to delete unused CNIDs, not used with -f */
-    if (! nocniddb && !(flags & DBD_FLAGS_FORCE)) {
-        /* Get volume stamp */
-        dbd_getstamp(dbd, &rqst, &rply);
-        if (rply.result != CNID_DBD_RES_OK)
-            goto exit;
-        memcpy(stamp, rply.name, CNID_DEV_LEN);
+    /* Get volume stamp */
+    dbd_getstamp(dbd, &rqst, &rply);
+    if (rply.result != CNID_DBD_RES_OK) {
+        ret = -1;
+        goto exit;
+    }
+    memcpy(stamp, rply.name, CNID_DEV_LEN);
 
-        /* open/create rebuild dbd, copy rootinfo key */
+    /* temporary rebuild db, used with -re rebuild to delete unused CNIDs, not used with -f */
+    if (! nocniddb && (flags & DBD_FLAGS_EXCL) && !(flags & DBD_FLAGS_FORCE)) {
         tmpdb_path = get_tmpdb_path();
         if (NULL == (dbd_rebuild = dbif_init(tmpdb_path, "cnid2.db"))) {
             ret = -1;
@@ -1253,10 +1259,10 @@ int cmd_dbd_scanvol(DBD *dbd_ref, struct volinfo *vi, dbd_flags_t flags)
 
 exit:
     if (! nocniddb) {
-        if (dbif_txn_close(dbd, 2) != 0)
+        if (dbif_txn_close(dbd, ret == 0 ? 1 : 0) != 0)
             ret = -1;
         if (dbd_rebuild)
-            if (dbif_txn_close(dbd_rebuild, 2) != 0)
+            if (dbif_txn_close(dbd_rebuild, ret == 0 ? 1 : 0) != 0)
                 ret = -1;
         if ((ret == 0) && dbd_rebuild && (flags & DBD_FLAGS_EXCL) && !(flags & DBD_FLAGS_FORCE))
             /* We can only do this in exclusive mode, otherwise we might delete CNIDs added from