]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-freelance-pioctl-20071010
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 10 Oct 2007 16:22:14 +0000 (16:22 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 10 Oct 2007 16:22:14 +0000 (16:22 +0000)
pioctl commands were failing with CM_ERROR_NOSUCHCELL because the
Freelance cell object was not being added to the Cell Name and ID
hash tables.

ParseIoctlPath was not consistently returning the FID of the specified
symlink or mount point object.  The was still one more case in which
CM_FLAG_FOLLOW was being specified left over from
windows-parse-ioctl-path-20070629.  Changed the use of CM_FLAG_FOLLOW
into a 'follow' variable to ease testing and permit easy migration to
adding a 'follow' parameter to the function.

RXAFS_GetVolumeStatus is always going to fail for Freelance volumes.
Fake the response data.

UpdateVolume() was performing the wrong test for Freelance volumes.
Freelance volumes should not be marked offline even though they have
no servers.

(cherry picked from commit fae48bb39bbcb2366bc4087d7a67126c9d21c525)

src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_volume.c

index 1d93af048bcdc62716b6c6b8eec97aefe7866dde..b22a07d4b5a77b634a24d94d9d056fd950866208 100644 (file)
@@ -359,6 +359,9 @@ void cm_InitCell(int newFile, long maxCells)
             cellp->cellID = AFS_FAKE_ROOT_CELL_ID;
             cellp->vlServersp = NULL;
             cellp->flags = CM_CELLFLAG_FREELANCE;
+
+           cm_AddCellToNameHashTable(cellp);
+           cm_AddCellToIDHashTable(cellp);           
 #endif  
         } else {
             for (cellp = cm_data.allCellsp; cellp; cellp=cellp->allNextp) {
index 7ad6ffd23e16c5ead1427322d3434ad3950d6ba6..84ddf408482d223919ced481901529695de8a5a1 100644 (file)
@@ -219,6 +219,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
     cm_scache_t *substRootp = NULL;
 #endif
     char * relativePath = ioctlp->inDatap;
+    afs_uint32 follow = 0;
 
     osi_Log1(afsd_logp, "cm_ParseIoctlPath %s", osi_LogSaveString(afsd_logp,relativePath));
 
@@ -237,7 +238,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
        and it returns the correct (full) path.  therefore, there is
        no drive letter, and the path is absolute. */
     code = cm_NameI(cm_data.rootSCachep, relativePath,
-                     CM_FLAG_CASEFOLD,
+                     CM_FLAG_CASEFOLD | follow,
                      userp, "", reqp, scpp);
 
     if (code) {
@@ -281,7 +282,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
                 return code;
            }
 
-            code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
+            code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | follow,
                              userp, NULL, reqp, scpp);
            cm_ReleaseSCache(substRootp);
             if (code) {
@@ -314,7 +315,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
                 return code;
            }
 
-            code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
+            code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | follow,
                             userp, NULL, reqp, scpp);
             if (code) {
                cm_ReleaseSCache(substRootp);
@@ -332,7 +333,7 @@ long cm_ParseIoctlPath(smb_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
        }
         
         code = cm_NameI(substRootp, relativePath, 
-                         CM_FLAG_CASEFOLD,
+                         CM_FLAG_CASEFOLD | follow,
                          userp, NULL, reqp, scpp);
         if (code) {
            cm_ReleaseSCache(substRootp);
@@ -827,20 +828,35 @@ long cm_IoctlGetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp)
     code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp);
     if (code) return code;
 
-    Name = volName;
-    OfflineMsg = offLineMsg;
-    MOTD = motd;
-    do {
-        code = cm_ConnFromFID(&scp->fid, userp, &req, &connp);
-        if (code) continue;
+#ifdef AFS_FREELANCE_CLIENT
+    if ( scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID ) {
+       code = 0;
+       strncpy(volName, "Freelance.Local.Root", sizeof(volName));
+       offLineMsg[0] = '\0';
+       strncpy(motd, "Freelance mode in use.", sizeof(motd));
+       volStat.Vid = scp->fid.volume;
+       volStat.MaxQuota = 0;
+       volStat.BlocksInUse = 100;
+       volStat.PartBlocksAvail = 0;
+       volStat.PartMaxBlocks = 100;
+    } else
+#endif
+    {
+       Name = volName;
+       OfflineMsg = offLineMsg;
+       MOTD = motd;
+       do {
+           code = cm_ConnFromFID(&scp->fid, userp, &req, &connp);
+           if (code) continue;
 
-        callp = cm_GetRxConn(connp);
-        code = RXAFS_GetVolumeStatus(callp, scp->fid.volume,
-                                      &volStat, &Name, &OfflineMsg, &MOTD);
-        rx_PutConnection(callp);
+           callp = cm_GetRxConn(connp);
+           code = RXAFS_GetVolumeStatus(callp, scp->fid.volume,
+                                        &volStat, &Name, &OfflineMsg, &MOTD);
+           rx_PutConnection(callp);
 
-    } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, NULL, NULL, code));
-    code = cm_MapRPCError(code, &req);
+       } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, NULL, NULL, code));
+       code = cm_MapRPCError(code, &req);
+    }
 
     cm_ReleaseSCache(scp);
     if (code) return code;
index 847510cc72912a7ba8273aec7916d6be4c842f7b..4fb4d2f6322a9cb8d5d7653c13b73d0f58dafa4c 100644 (file)
@@ -188,6 +188,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
     enum volstatus rwNewstate = vl_online;
     enum volstatus roNewstate = vl_online;
     enum volstatus bkNewstate = vl_online;
+#ifdef AFS_FREELANCE_CLIENT
+    int freelance = 0;
+#endif
 
     /* clear out old bindings */
     if (volp->rw.serversp)
@@ -198,8 +201,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
         cm_FreeServerList(&volp->bk.serversp, CM_FREESERVERLIST_DELETE);
 
 #ifdef AFS_FREELANCE_CLIENT
-    if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && atoi(volp->namep)==AFS_FAKE_ROOT_VOL_ID ) 
+    if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && volp->rw.ID == AFS_FAKE_ROOT_VOL_ID ) 
     {
+       freelance = 1;
         memset(&vldbEntry, 0, sizeof(vldbEntry));
         vldbEntry.flags |= VLF_RWEXISTS;
         vldbEntry.volumeId[0] = AFS_FAKE_ROOT_VOL_ID;
@@ -289,6 +293,11 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
         afs_int32 bkServers_alldown = 1;
         char      name[VL_MAXNAMELEN];
 
+#ifdef AFS_FREELANCE_CLIENT
+       if (freelance)
+           rwServers_alldown = 0;
+#endif
+
         switch ( method ) {
         case 0:
             flags = vldbEntry.flags;
@@ -631,7 +640,7 @@ long cm_GetVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp,
     /* otherwise, we didn't find it so consult the VLDB */
     sprintf(volNameString, "%u", volumeID);
     code = cm_GetVolumeByName(cellp, volNameString, userp, reqp,
-                              flags, outVolpp);
+                             flags, outVolpp);
     return code;
 }