From: Jeffrey Altman Date: Wed, 10 Oct 2007 16:22:14 +0000 (+0000) Subject: DEVEL15-windows-freelance-pioctl-20071010 X-Git-Tag: openafs-devel-1_5_26~45 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=6ee3abb1bc0310bdbf93f0fd6148082331b87522;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-freelance-pioctl-20071010 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) --- diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 1d93af048..b22a07d4b 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -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) { diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 7ad6ffd23..84ddf4084 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -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; diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 847510cc7..4fb4d2f63 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -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; }