vos: move convertROtoRW core logic to vsprocs
[openafs.git] / src / volser / vos.c
index 4e1a743..b6cb029 100644 (file)
@@ -290,17 +290,16 @@ SendFile(usd_handle_t ufd, struct rx_call *call, long blksize)
     }
 
     while (!error) {
-#ifndef AFS_NT40_ENV           /* NT csn't select on non-socket fd's */
+#if !defined(AFS_NT40_ENV) && !defined(AFS_PTHREAD_ENV)
+       /* Only for this for non-NT, non-pthread. For NT, we can't select on
+        * non-socket FDs. For pthread environments, we don't need to select at
+        * all, since the following read() will block. */
        fd_set in;
        FD_ZERO(&in);
        FD_SET((intptr_t)(ufd->handle), &in);
        /* don't timeout if read blocks */
-#if defined(AFS_PTHREAD_ENV)
-       select(((intptr_t)(ufd->handle)) + 1, &in, 0, 0, 0);
-#else
        IOMGR_Select(((intptr_t)(ufd->handle)) + 1, &in, 0, 0, 0);
 #endif
-#endif
        error = USD_READ(ufd, buffer, blksize, &nbytes);
        if (error) {
            fprintf(STDERR, "File system read failed: %s\n",
@@ -401,17 +400,16 @@ ReceiveFile(usd_handle_t ufd, struct rx_call *call, long blksize)
 
     while ((bytesread = rx_Read(call, buffer, blksize)) > 0) {
        for (bytesleft = bytesread; bytesleft; bytesleft -= w) {
-#ifndef AFS_NT40_ENV           /* NT csn't select on non-socket fd's */
+#if !defined(AFS_NT40_ENV) && !defined(AFS_PTHREAD_ENV)
+           /* Only for this for non-NT, non-pthread. For NT, we can't select
+            * on non-socket FDs. For pthread environments, we don't need to
+            * select at all, since the following write() will block. */
            fd_set out;
            FD_ZERO(&out);
            FD_SET((intptr_t)(ufd->handle), &out);
            /* don't timeout if write blocks */
-#if defined(AFS_PTHREAD_ENV)
-           select(((intptr_t)(ufd->handle)) + 1, &out, 0, 0, 0);
-#else
            IOMGR_Select(((intptr_t)(ufd->handle)) + 1, 0, &out, 0, 0);
 #endif
-#endif
            error =
                USD_WRITE(ufd, &buffer[bytesread - bytesleft], bytesleft, &w);
            if (error) {
@@ -5506,16 +5504,13 @@ ConvertRO(struct cmd_syndesc *as, void *arock)
     afs_uint32 volid;
     afs_uint32 server;
     afs_int32 code, i, same;
-    struct nvldbentry entry, checkEntry, storeEntry;
+    struct nvldbentry entry;
     afs_int32 vcode;
-    afs_int32 rwindex = 0;
     afs_uint32 rwserver = 0;
     afs_int32 rwpartition = 0;
-    afs_int32 roindex = 0;
     afs_uint32 roserver = 0;
     afs_int32 ropartition = 0;
     int force = 0;
-    struct rx_connection *aconn;
     int c, dc;
 
     server = GetServer(as->parms[0].items->data);
@@ -5568,7 +5563,6 @@ ConvertRO(struct cmd_syndesc *as, void *arock)
     MapHostToNetwork(&entry);
     for (i = 0; i < entry.nServers; i++) {
        if (entry.serverFlags[i] & ITSRWVOL) {
-           rwindex = i;
            rwserver = entry.serverNumber[i];
            rwpartition = entry.serverPartition[i];
            if (roserver)
@@ -5582,7 +5576,6 @@ ConvertRO(struct cmd_syndesc *as, void *arock)
                return ENOENT;
            }
            if (same) {
-               roindex = i;
                roserver = entry.serverNumber[i];
                ropartition = entry.serverPartition[i];
                if (rwserver)
@@ -5616,110 +5609,8 @@ ConvertRO(struct cmd_syndesc *as, void *arock)
        }
     }
 
-    vcode =
-       ubik_VL_SetLock(cstruct, 0, entry.volumeId[RWVOL], RWVOL,
-                 VLOP_MOVE);
-    if (vcode) {
-       fprintf(STDERR,
-               "Unable to lock volume %lu, code %d\n",
-               (unsigned long)entry.volumeId[RWVOL],vcode);
-       PrintError("", vcode);
-       return -1;
-    }
-
-    /* make sure the VLDB entry hasn't changed since we started */
-    memset(&checkEntry, 0, sizeof(checkEntry));
-    vcode = VLDB_GetEntryByID(volid, -1, &checkEntry);
-    if (vcode) {
-       fprintf(STDERR,
-                "Could not fetch the entry for volume %lu from VLDB\n",
-                (unsigned long)volid);
-       PrintError("convertROtoRW ", vcode);
-       code = vcode;
-       goto error_exit;
-    }
-
-    MapHostToNetwork(&checkEntry);
-    entry.flags &= ~VLOP_ALLOPERS;  /* clear any stale lock operation flags */
-    entry.flags |= VLOP_MOVE;        /* set to match SetLock operation above */
-    if (memcmp(&entry, &checkEntry, sizeof(entry)) != 0) {
-        fprintf(STDERR,
-                "VLDB entry for volume %lu has changed; please reissue the command.\n",
-                (unsigned long)volid);
-        code = -1;
-        goto error_exit;
-    }
-
-    aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
-    code = AFSVolConvertROtoRWvolume(aconn, partition, volid);
-    if (code) {
-       fprintf(STDERR,
-               "Converting RO volume %lu to RW volume failed with code %d\n",
-               (unsigned long)volid, code);
-       PrintError("convertROtoRW ", code);
-       goto error_exit;
-    }
-    /* Update the VLDB to match what we did on disk as much as possible.  */
-    /* If the converted RO was in the VLDB, make it look like the new RW. */
-    if (roserver) {
-       entry.serverFlags[roindex] = ITSRWVOL;
-    } else {
-       /* Add a new site entry for the newly created RW.  It's possible
-        * (but unlikely) that we are already at MAXNSERVERS and that this
-        * new site will invalidate the whole VLDB entry;  however,
-        * VLDB_ReplaceEntry will detect this and return VL_BADSERVER,
-        * so we need no extra guard logic here.
-        */
-       afs_int32 newrwindex = entry.nServers;
-       (entry.nServers)++;
-       entry.serverNumber[newrwindex] = server;
-       entry.serverPartition[newrwindex] = partition;
-       entry.serverFlags[newrwindex] = ITSRWVOL;
-    }
-    entry.flags |= RW_EXISTS;
-    entry.flags &= ~BACK_EXISTS;
-
-    /* if the old RW was in the VLDB, remove it by decrementing the number */
-    /* of servers, replacing the RW entry with the last entry, and zeroing */
-    /* out the last entry. */
-    if (rwserver) {
-       (entry.nServers)--;
-       if (rwindex != entry.nServers) {
-           entry.serverNumber[rwindex] = entry.serverNumber[entry.nServers];
-           entry.serverPartition[rwindex] =
-               entry.serverPartition[entry.nServers];
-           entry.serverFlags[rwindex] = entry.serverFlags[entry.nServers];
-           entry.serverNumber[entry.nServers] = 0;
-           entry.serverPartition[entry.nServers] = 0;
-           entry.serverFlags[entry.nServers] = 0;
-       }
-    }
-    entry.flags &= ~RO_EXISTS;
-    for (i = 0; i < entry.nServers; i++) {
-       if (entry.serverFlags[i] & ITSROVOL) {
-           if (!(entry.serverFlags[i] & (RO_DONTUSE | NEW_REPSITE)))
-               entry.flags |= RO_EXISTS;
-       }
-    }
-    MapNetworkToHost(&entry, &storeEntry);
-    code =
-       VLDB_ReplaceEntry(entry.volumeId[RWVOL], RWVOL, &storeEntry,
-                         (LOCKREL_OPCODE | LOCKREL_AFSID |
-                          LOCKREL_TIMESTAMP));
-    if (code) {
-       fprintf(STDERR,
-               "Warning: volume converted, but vldb update failed with code %d!\n",
-               code);
-    }
+    code = UV_ConvertRO(server, partition, volid, &entry);
 
-  error_exit:
-    vcode = UV_LockRelease(entry.volumeId[RWVOL]);
-    if (vcode) {
-       fprintf(STDERR,
-               "Unable to unlock volume %lu, code %d\n",
-               (unsigned long)entry.volumeId[RWVOL],vcode);
-       PrintError("", vcode);
-    }
     return code;
 }