]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
windows-freelance-pioctl-20071010
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 10 Oct 2007 16:20:29 +0000 (16:20 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 10 Oct 2007 16:20:29 +0000 (16:20 +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.

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

index 22a1bd613b83eac263d29f0b56e20893844f5af6..345fc1f5b2742d68be0868f4e7d6935bc9982cdd 100644 (file)
@@ -357,6 +357,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 88df41ab7ebbd6586659334c2bae0bda1104dbc1..2f8e759b0d15b2f8a544dd272cbeb9749dddec91 100644 (file)
@@ -201,6 +201,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));
 
@@ -219,7 +220,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) {
@@ -263,7 +264,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) {
@@ -296,7 +297,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);
@@ -314,7 +315,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);
@@ -809,20 +810,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 8e1e7168384c1de194086d9e01edb1921299b704..82bdf7994256871b6954ba60a9a64a01f20d5579 100644 (file)
@@ -184,6 +184,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)
@@ -194,8 +197,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;
@@ -285,6 +289,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;
@@ -627,7 +636,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;
 }