Index: openafs/src/ntbuild.bat
diff -c openafs/src/ntbuild.bat:1.18 openafs/src/ntbuild.bat:1.18.4.1
*** openafs/src/ntbuild.bat:1.18 Wed Jul 6 10:11:28 2005
--- openafs/src/ntbuild.bat Mon Apr 21 12:03:56 2008
***************
*** 39,45 ****
REM "1300" for VC7 (.NET)
REM "1310" for .NET 2003
REM "1400" for VC8
! set AFSVER_CL=1310
REM Location of Microsoft Visual C++ development folder (8.3 short name)
set MSVCDIR=c:\progra~1\micros~2\vc98
--- 39,45 ----
REM "1300" for VC7 (.NET)
REM "1310" for .NET 2003
REM "1400" for VC8
! set AFSVER_CL=1400
REM Location of Microsoft Visual C++ development folder (8.3 short name)
set MSVCDIR=c:\progra~1\micros~2\vc98
***************
*** 47,58 ****
REM Location of Microsoft Platform SDK (8.3 short name)
set MSSDKDIR=c:\progra~1\micros~4
! REM Location of npapi.h (from DDK or Platform SDK samples - 8.3 short name)
set NTDDKDIR=c:\progra~1\micros~5
- REM Location of netmpr.h/netspi.h (from Windows 95/98 DDK - 8.3 short name)
- SET W9XDDKDIR=c:\progra~1\micros~6
-
REM ########################################################################
REM NTMakefile optional definitions:
REM
--- 47,55 ----
REM Location of Microsoft Platform SDK (8.3 short name)
set MSSDKDIR=c:\progra~1\micros~4
! REM Location of WDK/DDK (8.3 short name)
set NTDDKDIR=c:\progra~1\micros~5
REM ########################################################################
REM NTMakefile optional definitions:
REM
Index: openafs/src/WINNT/afsd/afskfw.c
diff -c openafs/src/WINNT/afsd/afskfw.c:1.28.4.16 openafs/src/WINNT/afsd/afskfw.c:1.28.4.18
*** openafs/src/WINNT/afsd/afskfw.c:1.28.4.16 Mon Feb 18 09:17:11 2008
--- openafs/src/WINNT/afsd/afskfw.c Sun Mar 30 10:13:17 2008
***************
*** 667,677 ****
{
if (cache && *cache != NULL) {
pkrb5_cc_close(*ctx, *cache);
! *cache = NULL;
! }
pkrb5_free_context(*ctx);
! *ctx = NULL;
}
}
--- 667,677 ----
{
if (cache && *cache != NULL) {
pkrb5_cc_close(*ctx, *cache);
! *cache = NULL;
! }
pkrb5_free_context(*ctx);
! *ctx = NULL;
}
}
***************
*** 2734,2739 ****
--- 2734,2758 ----
}
+ static void
+ copy_realm_of_ticket(krb5_context context, char * dest, size_t destlen, krb5_creds *v5cred) {
+ krb5_error_code code;
+ krb5_ticket *ticket;
+ size_t len;
+
+ code = pkrb5_decode_ticket(&v5cred->ticket, &ticket);
+ if (code == 0) {
+ len = krb5_princ_realm(context, ticket->server)->length;
+ if (len > destlen - 1)
+ len = destlen - 1;
+
+ strncpy(dest, krb5_princ_realm(context, ticket->server)->data, len);
+ dest[len] = '\0';
+
+ pkrb5_free_ticket(context, ticket);
+ }
+ }
+
int
KFW_AFS_klog(
krb5_context alt_ctx,
***************
*** 2881,2886 ****
--- 2900,2906 ----
else
strcpy(CellName, cell);
+ /* This is for Kerberos v4 only */
if (strlen(realm) == 0)
strcpy(RealmName, realm_of_cell);
else
***************
*** 2890,2945 ****
if ( try_krb5 ) {
int len;
- /* First try service/cell@REALM */
- if (code = pkrb5_build_principal(ctx, &increds.server,
- (int)strlen(RealmName),
- RealmName,
- ServiceName,
- CellName,
- 0))
- {
- goto cleanup;
- }
increds.client = client_principal;
increds.times.endtime = 0;
/* Ask for DES since that is what V4 understands */
increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC;
!
! if ( IsDebuggerPresent() ) {
! char * cname, *sname;
! pkrb5_unparse_name(ctx, increds.client, &cname);
! pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("Getting tickets for \"");
! OutputDebugString(cname);
! OutputDebugString("\" and service \"");
! OutputDebugString(sname);
! OutputDebugString("\"\n");
! pkrb5_free_unparsed_name(ctx,cname);
! pkrb5_free_unparsed_name(ctx,sname);
! }
!
! code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
! if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
! code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) {
! /* Or service@REALM */
! pkrb5_free_principal(ctx,increds.server);
increds.server = 0;
code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(RealmName),
! RealmName,
! ServiceName,
! 0);
!
if ( IsDebuggerPresent() ) {
char * cname, *sname;
pkrb5_unparse_name(ctx, increds.client, &cname);
pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n");
! OutputDebugString("Trying again: getting tickets for \"");
OutputDebugString(cname);
OutputDebugString("\" and service \"");
OutputDebugString(sname);
--- 2910,2940 ----
if ( try_krb5 ) {
int len;
+ code = KRB5KRB_ERR_GENERIC;
increds.client = client_principal;
increds.times.endtime = 0;
/* Ask for DES since that is what V4 understands */
increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC;
! /* If there was a specific realm we are supposed to try
! * then use it
! */
! if (strlen(realm) != 0) {
! /* service/cell@REALM */
increds.server = 0;
code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(realm),
! realm,
! ServiceName,
! CellName,
! 0);
if ( IsDebuggerPresent() ) {
char * cname, *sname;
pkrb5_unparse_name(ctx, increds.client, &cname);
pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("Getting tickets for \"");
OutputDebugString(cname);
OutputDebugString("\" and service \"");
OutputDebugString(sname);
***************
*** 2950,2978 ****
if (!code)
code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
- }
! if ((code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
! code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) &&
! strcmp(RealmName, realm_of_cell)) {
! /* Or service/cell@REALM_OF_CELL */
! strcpy(RealmName, realm_of_cell);
! pkrb5_free_principal(ctx,increds.server);
! increds.server = 0;
! code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(RealmName),
! RealmName,
! ServiceName,
! CellName,
! 0);
if ( IsDebuggerPresent() ) {
char * cname, *sname;
pkrb5_unparse_name(ctx, increds.client, &cname);
pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n");
! OutputDebugString("Trying again: getting tickets for \"");
OutputDebugString(cname);
OutputDebugString("\" and service \"");
OutputDebugString(sname);
--- 2945,3003 ----
if (!code)
code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
! if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
! code == KRB5_ERR_HOST_REALM_UNKNOWN ||
! code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) {
! /* Or service@REALM */
! pkrb5_free_principal(ctx,increds.server);
! increds.server = 0;
! code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(realm),
! realm,
! ServiceName,
! 0);
!
! if ( IsDebuggerPresent() ) {
! char * cname, *sname;
! pkrb5_unparse_name(ctx, increds.client, &cname);
! pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n");
! OutputDebugString("Trying again: getting tickets for \"");
! OutputDebugString(cname);
! OutputDebugString("\" and service \"");
! OutputDebugString(sname);
! OutputDebugString("\"\n");
! pkrb5_free_unparsed_name(ctx,cname);
! pkrb5_free_unparsed_name(ctx,sname);
! }
!
! if (!code)
! code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
! }
!
! if (code == 0) {
! /* we have a local realm for the cell */
! strcpy(realm_of_cell, realm);
! }
! } else {
! /* Otherwise, first try service/cell@CLIENT_REALM */
! if (code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(realm_of_user),
! realm_of_user,
! ServiceName,
! CellName,
! 0))
! {
! goto cleanup;
! }
if ( IsDebuggerPresent() ) {
char * cname, *sname;
pkrb5_unparse_name(ctx, increds.client, &cname);
pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("Getting tickets for \"");
OutputDebugString(cname);
OutputDebugString("\" and service \"");
OutputDebugString(sname);
***************
*** 2981,2999 ****
pkrb5_free_unparsed_name(ctx,sname);
}
! if (!code)
! code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
!
! if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) {
! /* Or service@REALM_OF_CELL */
pkrb5_free_principal(ctx,increds.server);
increds.server = 0;
code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(RealmName),
! RealmName,
ServiceName,
0);
--- 3006,3065 ----
pkrb5_free_unparsed_name(ctx,sname);
}
! code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
! if (code == 0) {
! /* The client's realm is a local realm for the cell.
! * Save it so that later the pts registration will not
! * be performed.
! */
! strcpy(realm_of_cell, realm_of_user);
! }
! if ((code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
! code == KRB5_ERR_HOST_REALM_UNKNOWN ||
code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) &&
! strcmp(realm_of_user, realm_of_cell)) {
! /* Then service/cell@CELL_REALM */
! pkrb5_free_principal(ctx,increds.server);
! increds.server = 0;
! code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(realm_of_cell),
! realm_of_cell,
! ServiceName,
! CellName,
! 0);
! if ( IsDebuggerPresent() ) {
! char * cname, *sname;
! pkrb5_unparse_name(ctx, increds.client, &cname);
! pkrb5_unparse_name(ctx, increds.server, &sname);
! OutputDebugString("krb5_get_credentials() returned Service Principal Unknown\n");
! OutputDebugString("Trying again: getting tickets for \"");
! OutputDebugString(cname);
! OutputDebugString("\" and service \"");
! OutputDebugString(sname);
! OutputDebugString("\"\n");
! pkrb5_free_unparsed_name(ctx,cname);
! pkrb5_free_unparsed_name(ctx,sname);
! }
!
! if (!code)
! code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
!
! if (!code && !strlen(realm_of_cell))
! copy_realm_of_ticket(ctx, realm_of_cell, sizeof(realm_of_cell), k5creds);
! }
!
! if (code == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN ||
! code == KRB5_ERR_HOST_REALM_UNKNOWN ||
! code == KRB5KRB_ERR_GENERIC /* heimdal */ ||
! code == KRB5KRB_AP_ERR_MSG_TYPE) {
! /* Finally service@CELL_REALM */
pkrb5_free_principal(ctx,increds.server);
increds.server = 0;
code = pkrb5_build_principal(ctx, &increds.server,
! (int)strlen(realm_of_cell),
! realm_of_cell,
ServiceName,
0);
***************
*** 3013,3018 ****
--- 3079,3086 ----
if (!code)
code = pkrb5_get_credentials(ctx, 0, cc, &increds, &k5creds);
+ if (!code && !strlen(realm_of_cell))
+ copy_realm_of_ticket(ctx, realm_of_cell, sizeof(realm_of_cell), k5creds);
}
}
Index: openafs/src/WINNT/afsd/cm.h
diff -c openafs/src/WINNT/afsd/cm.h:1.17.2.13 openafs/src/WINNT/afsd/cm.h:1.17.2.14
*** openafs/src/WINNT/afsd/cm.h:1.17.2.13 Thu Mar 13 00:39:17 2008
--- openafs/src/WINNT/afsd/cm.h Mon Apr 14 18:44:03 2008
***************
*** 94,99 ****
--- 94,100 ----
#define CM_ERROR_LOCK_NOT_GRANTED (CM_ERROR_BASE+59)
/* Used by cm_FollowMountPoint and cm_FindVolumeByName */
+ /* And as an index in cm_volume_t */
#define RWVOL 0
#define ROVOL 1
#define BACKVOL 2
Index: openafs/src/WINNT/afsd/cm_callback.c
diff -c openafs/src/WINNT/afsd/cm_callback.c:1.41.4.41 openafs/src/WINNT/afsd/cm_callback.c:1.41.4.43
*** openafs/src/WINNT/afsd/cm_callback.c:1.41.4.41 Wed Mar 19 09:59:30 2008
--- openafs/src/WINNT/afsd/cm_callback.c Mon Apr 14 18:44:03 2008
***************
*** 1466,1477 ****
if (cm_freelanceEnabled &&
scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) {
- /* if it's something on /afs */
- if (!(scp->fid.vnode==0x1 && scp->fid.unique==0x1)) {
- /* if it's not root.afs */
- return 1;
- }
-
lock_ObtainMutex(&cm_Freelance_Lock);
fdc = cm_fakeDirCallback;
fgc = cm_fakeGettingCallback;
--- 1466,1471 ----
***************
*** 1813,1825 ****
if (!volp)
return 1;
! if (volp->rw.ID == volID) {
! statep = &volp->rw;
! } else if (volp->ro.ID == volID) {
! statep = &volp->ro;
! } else if (volp->bk.ID == volID) {
! statep = &volp->bk;
! }
cm_PutVolume(volp);
if (statep->state == vl_online)
return 1;
--- 1807,1813 ----
if (!volp)
return 1;
! statep = cm_VolumeStateByID(volp, volID);
cm_PutVolume(volp);
if (statep->state == vl_online)
return 1;
Index: openafs/src/WINNT/afsd/cm_config.c
diff -c openafs/src/WINNT/afsd/cm_config.c:1.26.4.3 openafs/src/WINNT/afsd/cm_config.c:1.26.4.4
*** openafs/src/WINNT/afsd/cm_config.c:1.26.4.3 Fri Feb 1 21:48:13 2008
--- openafs/src/WINNT/afsd/cm_config.c Mon Apr 7 10:20:19 2008
***************
*** 192,199 ****
/* now see if this is the right cell */
if (stricmp(lineBuffer+1, cellNamep) == 0) {
/* found the cell we're looking for */
! if (newCellNamep)
strcpy(newCellNamep, lineBuffer+1);
inRightCell = 1;
tracking = 0;
#ifdef CELLSERV_DEBUG
--- 192,201 ----
/* now see if this is the right cell */
if (stricmp(lineBuffer+1, cellNamep) == 0) {
/* found the cell we're looking for */
! if (newCellNamep) {
strcpy(newCellNamep, lineBuffer+1);
+ strlwr(newCellNamep);
+ }
inRightCell = 1;
tracking = 0;
#ifdef CELLSERV_DEBUG
***************
*** 209,216 ****
fclose(bestp);
return -5;
}
! if (newCellNamep)
strcpy(newCellNamep, lineBuffer+1);
inRightCell = 0;
tracking = 0;
partial = 1;
--- 211,220 ----
fclose(bestp);
return -5;
}
! if (newCellNamep) {
strcpy(newCellNamep, lineBuffer+1);
+ strlwr(newCellNamep);
+ }
inRightCell = 0;
tracking = 0;
partial = 1;
***************
*** 302,313 ****
for (i = 0; i < numServers; i++) {
memcpy(&vlSockAddr.sin_addr.s_addr, &cellHostAddrs[i],
sizeof(long));
! vlSockAddr.sin_family = AF_INET;
! /* sin_port supplied by connection code */
! if (procp)
! (*procp)(rockp, &vlSockAddr, cellHostNames[i]);
! if(newCellNamep)
! strcpy(newCellNamep,cellNamep);
}
return 0; /* found cell */
}
--- 306,319 ----
for (i = 0; i < numServers; i++) {
memcpy(&vlSockAddr.sin_addr.s_addr, &cellHostAddrs[i],
sizeof(long));
! vlSockAddr.sin_family = AF_INET;
! /* sin_port supplied by connection code */
! if (procp)
! (*procp)(rockp, &vlSockAddr, cellHostNames[i]);
! if (newCellNamep) {
! strcpy(newCellNamep,cellNamep);
! strlwr(newCellNamep);
! }
}
return 0; /* found cell */
}
Index: openafs/src/WINNT/afsd/cm_conn.c
diff -c openafs/src/WINNT/afsd/cm_conn.c:1.49.2.39 openafs/src/WINNT/afsd/cm_conn.c:1.49.2.41
*** openafs/src/WINNT/afsd/cm_conn.c:1.49.2.39 Thu Mar 13 00:39:17 2008
--- openafs/src/WINNT/afsd/cm_conn.c Fri Apr 18 12:46:07 2008
***************
*** 133,139 ****
--- 133,141 ----
*serversppp = cm_GetVolServers(volp, fidp->volume);
+ lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
return 0;
}
***************
*** 272,278 ****
else if (errorCode == CM_ERROR_ALLDOWN) {
osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLDOWN.");
/* Servers marked DOWN will be restored by the background daemon
! * thread as they become available.
*/
}
--- 274,281 ----
else if (errorCode == CM_ERROR_ALLDOWN) {
osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLDOWN.");
/* Servers marked DOWN will be restored by the background daemon
! * thread as they become available. The volume status is
! * updated as the server state changes.
*/
}
***************
*** 281,335 ****
/* Volume instances marked offline will be restored by the
* background daemon thread as they become available
*/
! if (timeLeft > 7 && fidp) {
! thrd_Sleep(5000);
!
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
! CM_GETVOL_FLAG_NO_LRU_UPDATE,
! &volp);
if (code == 0) {
! if (fidp->volume == volp->rw.ID)
! statep = &volp->rw;
! else if (fidp->volume == volp->ro.ID)
! statep = &volp->ro;
! else if (fidp->volume == volp->bk.ID)
! statep = &volp->bk;
! if (statep->state != vl_offline && statep->state != vl_unknown) {
! retry = 1;
! } else {
! if (cm_CheckOfflineVolume(volp, statep->ID))
retry = 1;
}
!
cm_PutVolume(volp);
}
! }
}
else if (errorCode == CM_ERROR_ALLBUSY) {
/* Volumes that are busy cannot be determined to be non-busy
* without actually attempting to access them.
*/
osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLBUSY.");
- if (timeLeft > 7) {
-
- thrd_Sleep(5000);
-
- if (fidp) { /* File Server query */
- code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
- CM_GETVOL_FLAG_NO_LRU_UPDATE,
- &volp);
- if (code == 0) {
- if (fidp->volume == volp->rw.ID)
- statep = &volp->rw;
- else if (fidp->volume == volp->ro.ID)
- statep = &volp->ro;
- else if (fidp->volume == volp->bk.ID)
- statep = &volp->bk;
if (statep->state != vl_offline &&
! statep->state != vl_busy &&
! statep->state != vl_unknown) {
retry = 1;
} else {
if (!serversp) {
--- 284,328 ----
/* Volume instances marked offline will be restored by the
* background daemon thread as they become available
*/
! if (fidp) {
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
! CM_GETVOL_FLAG_NO_LRU_UPDATE,
! &volp);
if (code == 0) {
! if (timeLeft > 7) {
! thrd_Sleep(5000);
! /* cm_CheckOfflineVolume() resets the serverRef state */
! if (cm_CheckOfflineVolume(volp, fidp->volume))
retry = 1;
+ } else {
+ cm_UpdateVolumeStatus(volp, fidp->volume);
}
! lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
+ volp = NULL;
}
! }
}
else if (errorCode == CM_ERROR_ALLBUSY) {
/* Volumes that are busy cannot be determined to be non-busy
* without actually attempting to access them.
*/
osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLBUSY.");
+ if (fidp) { /* File Server query */
+ code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
+ CM_GETVOL_FLAG_NO_LRU_UPDATE,
+ &volp);
+ if (code == 0) {
+ if (timeLeft > 7) {
+ thrd_Sleep(5000);
+
+ statep = cm_VolumeStateByID(volp, fidp->volume);
if (statep->state != vl_offline &&
! statep->state != vl_busy &&
! statep->state != vl_unknown) {
retry = 1;
} else {
if (!serversp) {
***************
*** 343,349 ****
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->status == srv_busy) {
tsrp->status = srv_not_busy;
! }
}
lock_ReleaseWrite(&cm_serverLock);
if (free_svr_list) {
--- 336,342 ----
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->status == srv_busy) {
tsrp->status = srv_not_busy;
! }
}
lock_ReleaseWrite(&cm_serverLock);
if (free_svr_list) {
***************
*** 351,363 ****
*serverspp = serversp;
}
! cm_UpdateVolumeStatus(volp, statep->ID);
retry = 1;
}
!
! cm_PutVolume(volp);
}
! } else { /* VL Server query */
if (serversp) {
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
--- 344,365 ----
*serverspp = serversp;
}
! cm_UpdateVolumeStatus(volp, fidp->volume);
retry = 1;
}
! } else {
! cm_UpdateVolumeStatus(volp, fidp->volume);
}
!
! lock_ObtainRead(&cm_volumeLock);
! cm_PutVolume(volp);
! lock_ReleaseRead(&cm_volumeLock);
! volp = NULL;
! }
! } else { /* VL Server query */
! if (timeLeft > 7) {
! thrd_Sleep(5000);
!
if (serversp) {
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
***************
*** 389,402 ****
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
CM_GETVOL_FLAG_NO_LRU_UPDATE,
&volp);
! if (code == 0) {
! if (fidp->volume == volp->rw.ID)
! statep = &volp->rw;
! else if (fidp->volume == volp->ro.ID)
! statep = &volp->ro;
! else if (fidp->volume == volp->bk.ID)
! statep = &volp->bk;
! }
}
break;
}
--- 391,398 ----
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
CM_GETVOL_FLAG_NO_LRU_UPDATE,
&volp);
! if (code == 0)
! statep = cm_VolumeStateByID(volp, fidp->volume);
}
break;
}
***************
*** 405,411 ****
--- 401,410 ----
if (statep) {
cm_UpdateVolumeStatus(volp, statep->ID);
+ lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
+ volp = NULL;
}
if (free_svr_list) {
***************
*** 500,513 ****
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
CM_GETVOL_FLAG_NO_LRU_UPDATE,
&volp);
! if (code == 0) {
! if (fidp->volume == volp->rw.ID)
! statep = &volp->rw;
! else if (fidp->volume == volp->ro.ID)
! statep = &volp->ro;
! else if (fidp->volume == volp->bk.ID)
! statep = &volp->bk;
! }
}
}
}
--- 499,506 ----
code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
CM_GETVOL_FLAG_NO_LRU_UPDATE,
&volp);
! if (code == 0)
! cm_VolumeStateByID(volp, fidp->volume);
}
}
}
***************
*** 518,524 ****
--- 511,520 ----
if (statep) {
cm_UpdateVolumeStatus(volp, statep->ID);
+ lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
+ volp = NULL;
}
if (free_svr_list) {
***************
*** 540,546 ****
if (scp->fileType != CM_SCACHETYPE_DIRECTORY)
pscp = cm_FindSCacheParent(scp);
-
lock_ObtainWrite(&scp->rw);
lock_ObtainWrite(&cm_scacheLock);
cm_RemoveSCacheFromHashTable(scp);
--- 536,541 ----
Index: openafs/src/WINNT/afsd/cm_freelance.c
diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.9 openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.11
*** openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.9 Sun Mar 2 23:25:40 2008
--- openafs/src/WINNT/afsd/cm_freelance.c Fri Apr 11 13:46:24 2008
***************
*** 153,162 ****
lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock");
- // make sure we sync the data version to the cached root scache_t
- if (cm_data.rootSCachep && cm_data.rootSCachep->fid.cell == AFS_FAKE_ROOT_CELL_ID)
- cm_data.fakeDirVersion = cm_data.rootSCachep->dataVersion;
-
// yj: first we make a call to cm_initLocalMountPoints
// to read all the local mount points from the registry
cm_InitLocalMountPoints();
--- 153,158 ----
***************
*** 271,277 ****
curChunk = 13;
// stick the first 2 entries "." and ".." in
- fakeEntry.fid.unique = htonl(1);
fakeEntry.fid.vnode = htonl(1);
strcpy(fakeEntry.name, ".");
currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE;
--- 267,272 ----
***************
*** 400,417 ****
osi_Log0(afsd_logp,"Invalidating local mount point scp... ");
! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 2);
lock_ObtainWrite(&cm_scacheLock);
lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */
for (i=0; inextp) {
! if (scp->fid.volume == aFid.volume &&
! scp->fid.vnode == aFid.vnode &&
! scp->fid.unique == aFid.unique
! ) {
!
// mark the scp to be reused
cm_HoldSCacheNoLock(scp);
lock_ReleaseWrite(&cm_scacheLock);
--- 395,408 ----
osi_Log0(afsd_logp,"Invalidating local mount point scp... ");
! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 1);
lock_ObtainWrite(&cm_scacheLock);
lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */
for (i=0; inextp) {
! if (scp != cm_data.rootSCachep && cm_FidCmp(&scp->fid, &aFid) == 0) {
// mark the scp to be reused
cm_HoldSCacheNoLock(scp);
lock_ReleaseWrite(&cm_scacheLock);
***************
*** 436,442 ****
}
}
}
! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 2);
}
lock_ReleaseWrite(&cm_scacheLock);
osi_Log0(afsd_logp,"\tall old scp cleared!");
--- 427,433 ----
}
}
}
! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 1);
}
lock_ReleaseWrite(&cm_scacheLock);
osi_Log0(afsd_logp,"\tall old scp cleared!");
***************
*** 1104,1110 ****
/* cm_reInitLocalMountPoints(); */
if (fidp)
! cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1);
cm_noteLocalMountPointChange();
return 0;
}
--- 1095,1101 ----
/* cm_reInitLocalMountPoints(); */
if (fidp)
! cm_SetFid(fidp, fidp->cell, fidp->volume, ++cm_noLocalMountPoints, 1);
cm_noteLocalMountPointChange();
return 0;
}
***************
*** 1163,1168 ****
--- 1154,1160 ----
if (!strcmp(shortname, toremove)) {
RegDeleteValue( hkFreelance, szValueName );
+ found = 1;
break;
}
}
***************
*** 1205,1220 ****
fclose(fp1);
fclose(fp2);
! if (!found)
! return CM_ERROR_NOSUCHFILE;
!
! unlink(hfile);
! rename(hfile2, hfile);
}
lock_ReleaseMutex(&cm_Freelance_Lock);
! cm_noteLocalMountPointChange();
! return 0;
}
long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp)
--- 1197,1214 ----
fclose(fp1);
fclose(fp2);
! if (found) {
! unlink(hfile);
! rename(hfile2, hfile);
! }
}
lock_ReleaseMutex(&cm_Freelance_Lock);
! if (found) {
! cm_noteLocalMountPointChange();
! return 0;
! } else
! return CM_ERROR_NOSUCHFILE;
}
long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp)
***************
*** 1318,1324 ****
/* cm_reInitLocalMountPoints(); */
if (fidp)
! cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1);
cm_noteLocalMountPointChange();
return 0;
}
--- 1312,1318 ----
/* cm_reInitLocalMountPoints(); */
if (fidp)
! cm_SetFid(fidp, fidp->cell, fidp->volume, ++cm_noLocalMountPoints, 1);
cm_noteLocalMountPointChange();
return 0;
}
***************
*** 1372,1377 ****
--- 1366,1372 ----
if (!strcmp(shortname, toremove)) {
RegDeleteValue( hkFreelanceSymlinks, szValueName );
+ found = 1;
break;
}
}
***************
*** 1380,1386 ****
#endif
lock_ReleaseMutex(&cm_Freelance_Lock);
! cm_noteLocalMountPointChange();
! return 0;
}
#endif /* AFS_FREELANCE_CLIENT */
--- 1375,1384 ----
#endif
lock_ReleaseMutex(&cm_Freelance_Lock);
! if (found) {
! cm_noteLocalMountPointChange();
! return 0;
! } else
! return CM_ERROR_NOSUCHFILE;
}
#endif /* AFS_FREELANCE_CLIENT */
Index: openafs/src/WINNT/afsd/cm_ioctl.c
diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.40 openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.44
*** openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.40 Wed Mar 19 09:59:30 2008
--- openafs/src/WINNT/afsd/cm_ioctl.c Mon Apr 14 18:44:03 2008
***************
*** 587,593 ****
AFSFetchStatus fileStatus;
AFSVolSync volSync;
long code;
! AFSFid fid;
int tlen;
cm_req_t req;
struct rx_connection * callp;
--- 587,593 ----
AFSFetchStatus fileStatus;
AFSVolSync volSync;
long code;
! AFSFid afid;
int tlen;
cm_req_t req;
struct rx_connection * callp;
***************
*** 601,609 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
!
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 601,611 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 618,626 ****
} else
#endif
{
! fid.Volume = scp->fid.volume;
! fid.Vnode = scp->fid.vnode;
! fid.Unique = scp->fid.unique;
do {
acl.AFSOpaque_val = ioctlp->outDatap;
acl.AFSOpaque_len = 0;
--- 620,628 ----
} else
#endif
{
! afid.Volume = scp->fid.volume;
! afid.Vnode = scp->fid.vnode;
! afid.Unique = scp->fid.unique;
do {
acl.AFSOpaque_val = ioctlp->outDatap;
acl.AFSOpaque_len = 0;
***************
*** 628,634 ****
if (code) continue;
callp = cm_GetRxConn(connp);
! code = RXAFS_FetchACL(callp, &fid, &acl, &fileStatus, &volSync);
rx_PutConnection(callp);
} while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code));
--- 630,636 ----
if (code) continue;
callp = cm_GetRxConn(connp);
! code = RXAFS_FetchACL(callp, &afid, &acl, &fileStatus, &volSync);
rx_PutConnection(callp);
} while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code));
***************
*** 661,668 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 663,673 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 791,798 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 796,806 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 829,836 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 837,847 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 976,983 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 987,997 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 1089,1096 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 1103,1113 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 1127,1134 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 1144,1154 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 1171,1178 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 1191,1201 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 1217,1223 ****
cp = ioctlp->outDatap;
- lock_ObtainMutex(&tvp->mx);
tsrpp = cm_GetVolServers(tvp, volume);
lock_ObtainRead(&cm_serverLock);
for (current = *tsrpp; current; current = current->next) {
--- 1240,1245 ----
***************
*** 1227,1233 ****
}
lock_ReleaseRead(&cm_serverLock);
cm_FreeServerList(tsrpp, 0);
- lock_ReleaseMutex(&tvp->mx);
/* still room for terminating NULL, add it on */
volume = 0; /* reuse vbl */
--- 1249,1254 ----
***************
*** 1299,1342 ****
code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp);
/* if something went wrong, bail out now */
! if (code) {
! goto done2;
! }
lock_ObtainWrite(&scp->rw);
code = cm_SyncOp(scp, NULL, userp, &req, 0,
CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
! if (code) {
! lock_ReleaseWrite(&scp->rw);
! cm_ReleaseSCache(scp);
goto done2;
- }
/* now check that this is a real mount point */
if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
- lock_ReleaseWrite(&scp->rw);
- cm_ReleaseSCache(scp);
code = CM_ERROR_INVAL;
goto done1;
}
/* time to make the RPC, so drop the lock */
lock_ReleaseWrite(&scp->rw);
- cm_ReleaseSCache(scp);
! /* easier to do it this way */
! code = cm_Unlink(dscp, cp, userp, &req);
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_REMOVED,
FILE_NOTIFY_CHANGE_DIR_NAME,
dscp, cp, NULL, TRUE);
- done1:
lock_ObtainWrite(&scp->rw);
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- lock_ReleaseWrite(&scp->rw);
done2:
cm_ReleaseSCache(dscp);
return code;
}
--- 1320,1370 ----
code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp);
/* if something went wrong, bail out now */
! if (code)
! goto done3;
lock_ObtainWrite(&scp->rw);
code = cm_SyncOp(scp, NULL, userp, &req, 0,
CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
! if (code)
goto done2;
/* now check that this is a real mount point */
if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
code = CM_ERROR_INVAL;
goto done1;
}
/* time to make the RPC, so drop the lock */
lock_ReleaseWrite(&scp->rw);
! #ifdef AFS_FREELANCE_CLIENT
! if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
! /* we are adding the mount point to the root dir., so call
! * the freelance code to do the add. */
! osi_Log0(afsd_logp,"IoctlDeleteMountPoint from Freelance root dir");
! code = cm_FreelanceRemoveMount(cp);
! } else
! #endif
! {
! /* easier to do it this way */
! code = cm_Unlink(dscp, cp, userp, &req);
! }
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_REMOVED,
FILE_NOTIFY_CHANGE_DIR_NAME,
dscp, cp, NULL, TRUE);
lock_ObtainWrite(&scp->rw);
+ done1:
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
done2:
+ cm_DiscardSCache(scp);
+ lock_ReleaseWrite(&scp->rw);
+ cm_ReleaseSCache(scp);
+
+ done3:
cm_ReleaseSCache(dscp);
return code;
}
***************
*** 1966,1983 ****
osi_Log0(afsd_logp,"IoctlCreateMountPoint within Freelance root dir");
code = cm_FreelanceAddMount(leaf, fullCell, volume,
*ioctlp->inDatap == '%', NULL);
! cm_ReleaseSCache(dscp);
! return code;
! }
#endif
! /* create the symlink with mode 644. The lack of X bits tells
! * us that it is a mount point.
! */
! tattr.mask = CM_ATTRMASK_UNIXMODEBITS | CM_ATTRMASK_CLIENTMODTIME;
! tattr.unixModeBits = 0644;
! tattr.clientModTime = time(NULL);
! code = cm_SymLink(dscp, leaf, mpInfo, 0, &tattr, userp, &req);
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_ADDED,
FILE_NOTIFY_CHANGE_DIR_NAME,
--- 1994,2012 ----
osi_Log0(afsd_logp,"IoctlCreateMountPoint within Freelance root dir");
code = cm_FreelanceAddMount(leaf, fullCell, volume,
*ioctlp->inDatap == '%', NULL);
! } else
#endif
! {
! /* create the symlink with mode 644. The lack of X bits tells
! * us that it is a mount point.
! */
! tattr.mask = CM_ATTRMASK_UNIXMODEBITS | CM_ATTRMASK_CLIENTMODTIME;
! tattr.unixModeBits = 0644;
! tattr.clientModTime = time(NULL);
! code = cm_SymLink(dscp, leaf, mpInfo, 0, &tattr, userp, &req);
! }
!
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_ADDED,
FILE_NOTIFY_CHANGE_DIR_NAME,
***************
*** 2025,2040 ****
}
osi_Log0(afsd_logp,"IoctlCreateSymlink within Freelance root dir");
code = cm_FreelanceAddSymlink(leaf, cp, NULL);
! cm_ReleaseSCache(dscp);
! return code;
! }
#endif
! /* Create symlink with mode 0755. */
! tattr.mask = CM_ATTRMASK_UNIXMODEBITS;
! tattr.unixModeBits = 0755;
- code = cm_SymLink(dscp, leaf, cp, 0, &tattr, userp, &req);
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_ADDED,
FILE_NOTIFY_CHANGE_FILE_NAME
--- 2054,2069 ----
}
osi_Log0(afsd_logp,"IoctlCreateSymlink within Freelance root dir");
code = cm_FreelanceAddSymlink(leaf, cp, NULL);
! } else
#endif
+ {
+ /* Create symlink with mode 0755. */
+ tattr.mask = CM_ATTRMASK_UNIXMODEBITS;
+ tattr.unixModeBits = 0755;
! code = cm_SymLink(dscp, leaf, cp, 0, &tattr, userp, &req);
! }
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_ADDED,
FILE_NOTIFY_CHANGE_FILE_NAME
***************
*** 2151,2167 ****
cp = ioctlp->inDatap;
- #ifdef AFS_FREELANCE_CLIENT
- if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
- /* we are adding the mount point to the root dir., so call
- * the freelance code to do the add. */
- osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir");
- code = cm_FreelanceRemoveSymlink(cp);
- cm_ReleaseSCache(dscp);
- return code;
- }
- #endif
-
code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp);
/* if something went wrong, bail out now */
--- 2180,2185 ----
***************
*** 2185,2192 ****
/* time to make the RPC, so drop the lock */
lock_ReleaseWrite(&scp->rw);
! /* easier to do it this way */
! code = cm_Unlink(dscp, cp, userp, &req);
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_REMOVED,
FILE_NOTIFY_CHANGE_FILE_NAME
--- 2203,2220 ----
/* time to make the RPC, so drop the lock */
lock_ReleaseWrite(&scp->rw);
! #ifdef AFS_FREELANCE_CLIENT
! if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) {
! /* we are adding the mount point to the root dir., so call
! * the freelance code to do the add. */
! osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir");
! code = cm_FreelanceRemoveSymlink(cp);
! } else
! #endif
! {
! /* easier to do it this way */
! code = cm_Unlink(dscp, cp, userp, &req);
! }
if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH))
smb_NotifyChange(FILE_ACTION_REMOVED,
FILE_NOTIFY_CHANGE_FILE_NAME
***************
*** 2198,2203 ****
--- 2226,2232 ----
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
done2:
+ cm_DiscardSCache(scp);
lock_ReleaseWrite(&scp->rw);
cm_ReleaseSCache(scp);
***************
*** 3112,3119 ****
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
cm_SkipIoctlPath(ioctlp);
! code = cm_GetSCache(&optionsp->fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
--- 3141,3151 ----
flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+ cm_fid_t fid;
cm_SkipIoctlPath(ioctlp);
! cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
! optionsp->fid.vnode, optionsp->fid.unique);
! code = cm_GetSCache(&fid, &scp, userp, &req);
} else {
code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp, flags);
}
***************
*** 3140,3152 ****
if (code)
return code;
! if (volume == tvp->rw.ID)
! statep = &tvp->rw;
! else if (volume == tvp->ro.ID)
! statep = &tvp->ro;
! else
! statep = &tvp->bk;
!
switch (statep->state) {
case vl_online:
case vl_unknown:
--- 3172,3178 ----
if (code)
return code;
! statep = cm_VolumeStateByID(tvp, volume);
switch (statep->state) {
case vl_online:
case vl_unknown:
***************
*** 3241,3263 ****
if (code)
return code;
! if (testp->fid.volume) {
! if (testp->fid.volume == volp->rw.ID)
! statep = &volp->rw;
! else if (testp->fid.volume == volp->ro.ID)
! statep = &volp->ro;
! else
! statep = &volp->bk;
! } else {
! len = strlen(testp->volname);
!
! if (stricmp(".readonly", &testp->volname[len-9]) == 0)
! statep = &volp->ro;
! else if (stricmp(".backup", &testp->volname[len-7]) == 0)
! statep = &volp->bk;
! else
! statep = &volp->rw;
! }
if (statep) {
statep->state = testp->state;
--- 3267,3276 ----
if (code)
return code;
! if (testp->fid.volume)
! statep = cm_VolumeStateByID(volp, testp->fid.volume);
! else
! statep = cm_VolumeStateByName(volp, testp->volname);
if (statep) {
statep->state = testp->state;
Index: openafs/src/WINNT/afsd/cm_memmap.h
diff -c openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.10 openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.11
*** openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.10 Wed Mar 19 20:01:59 2008
--- openafs/src/WINNT/afsd/cm_memmap.h Mon Apr 21 11:36:49 2008
***************
*** 10,16 ****
#ifndef CM_MEMMAP_H
#define CM_MEMMAP_H 1
! #define CM_CONFIG_DATA_VERSION 2
#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
typedef struct cm_config_data {
--- 10,16 ----
#ifndef CM_MEMMAP_H
#define CM_MEMMAP_H 1
! #define CM_CONFIG_DATA_VERSION 3
#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
typedef struct cm_config_data {
Index: openafs/src/WINNT/afsd/cm_performance.c
diff -c openafs/src/WINNT/afsd/cm_performance.c:1.1.2.4 openafs/src/WINNT/afsd/cm_performance.c:1.1.2.5
*** openafs/src/WINNT/afsd/cm_performance.c:1.1.2.4 Thu Mar 13 00:39:17 2008
--- openafs/src/WINNT/afsd/cm_performance.c Mon Apr 14 18:44:03 2008
***************
*** 171,178 ****
lock_ObtainRead(&cm_volumeLock);
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! if (volp->rw.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->rw.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 171,178 ----
lock_ObtainRead(&cm_volumeLock);
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! if (volp->vol[RWVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[RWVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
***************
*** 189,196 ****
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->ro.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 189,196 ----
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->vol[ROVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[ROVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
***************
*** 207,214 ****
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->bk.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->bk.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 207,214 ----
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->vol[BACKVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[BACKVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
***************
*** 311,318 ****
lock_ObtainRead(&cm_volumeLock);
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! if (volp->rw.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->rw.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 311,318 ----
lock_ObtainRead(&cm_volumeLock);
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! if (volp->vol[RWVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[RWVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
***************
*** 329,336 ****
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->ro.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 329,336 ----
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->vol[ROVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[ROVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
***************
*** 347,354 ****
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->bk.ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->bk.ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
--- 347,354 ----
cm_PerformanceInsertToHashTable(statp);
}
}
! if (volp->vol[BACKVOL].ID) {
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[BACKVOL].ID, 1, 1);
hash = fid.hash % fidStatsHashTableSize;
for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
Index: openafs/src/WINNT/afsd/cm_scache.c
diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.70 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.74
*** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.70 Wed Mar 19 16:18:37 2008
--- openafs/src/WINNT/afsd/cm_scache.c Mon Apr 14 18:44:03 2008
***************
*** 639,645 ****
#endif
{
long hash;
! cm_scache_t *scp;
long code;
cm_volume_t *volp = NULL;
cm_cell_t *cellp;
--- 639,645 ----
#endif
{
long hash;
! cm_scache_t *scp = NULL;
long code;
cm_volume_t *volp = NULL;
cm_cell_t *cellp;
***************
*** 651,662 ****
osi_assertx(fidp->cell != 0, "unassigned cell value");
! if (fidp->cell== cm_data.rootFid.cell &&
! fidp->volume==cm_data.rootFid.volume &&
! fidp->vnode==0x0 && fidp->unique==0x0)
! {
! osi_Log0(afsd_logp,"cm_GetSCache called with root cell/volume and vnode=0 and unique=0");
! }
// yj: check if we have the scp, if so, we don't need
// to do anything else
--- 651,664 ----
osi_assertx(fidp->cell != 0, "unassigned cell value");
! #ifdef AFS_FREELANCE_CLIENT
! special = (fidp->cell==AFS_FAKE_ROOT_CELL_ID &&
! fidp->volume==AFS_FAKE_ROOT_VOL_ID &&
! !(fidp->vnode==0x1 && fidp->unique==0x1));
! isRoot = (fidp->cell==AFS_FAKE_ROOT_CELL_ID &&
! fidp->volume==AFS_FAKE_ROOT_VOL_ID &&
! fidp->vnode==0x1 && fidp->unique==0x1);
! #endif
// yj: check if we have the scp, if so, we don't need
// to do anything else
***************
*** 667,672 ****
--- 669,679 ----
afsi_log("%s:%d cm_GetSCache (1) outScpp 0x%p ref %d", file, line, scp, scp->refCount);
osi_Log1(afsd_logp,"cm_GetSCache (1) outScpp 0x%p", scp);
#endif
+ #ifdef AFS_FREELANCE_CLIENT
+ if (cm_freelanceEnabled && special &&
+ cm_data.fakeDirVersion != scp->dataVersion)
+ break;
+ #endif
cm_HoldSCacheNoLock(scp);
*outScpp = scp;
cm_AdjustScacheLRU(scp);
***************
*** 684,695 ****
// because we have to fill in the status stuff 'coz we
// don't want trybulkstat to fill it in for us
#ifdef AFS_FREELANCE_CLIENT
- special = (fidp->cell==AFS_FAKE_ROOT_CELL_ID &&
- fidp->volume==AFS_FAKE_ROOT_VOL_ID &&
- !(fidp->vnode==0x1 && fidp->unique==0x1));
- isRoot = (fidp->cell==AFS_FAKE_ROOT_CELL_ID &&
- fidp->volume==AFS_FAKE_ROOT_VOL_ID &&
- fidp->vnode==0x1 && fidp->unique==0x1);
if (cm_freelanceEnabled && isRoot) {
osi_Log0(afsd_logp,"cm_GetSCache Freelance and isRoot");
/* freelance: if we are trying to get the root scp for the first
--- 691,696 ----
***************
*** 703,708 ****
--- 704,717 ----
afs_uint32 fileType;
osi_Log0(afsd_logp,"cm_GetSCache Freelance and special");
+
+ if (cm_getLocalMountPointChange()) { // check for changes
+ cm_clearLocalMountPointChange(); // clear the changefile
+ lock_ReleaseWrite(&cm_scacheLock);
+ cm_reInitLocalMountPoints(); // start reinit
+ lock_ObtainWrite(&cm_scacheLock);
+ }
+
lock_ObtainMutex(&cm_Freelance_Lock);
if (fidp->vnode >= 2 && fidp->vnode - 2 < cm_noLocalMountPoints) {
strncpy(mp,(cm_localMountPoints+fidp->vnode-2)->mountPointStringp, MOUNTPOINTLEN);
***************
*** 717,723 ****
}
lock_ReleaseMutex(&cm_Freelance_Lock);
! scp = cm_GetNewSCache();
if (scp == NULL) {
osi_Log0(afsd_logp,"cm_GetSCache unable to obtain *new* scache entry");
lock_ReleaseWrite(&cm_scacheLock);
--- 726,733 ----
}
lock_ReleaseMutex(&cm_Freelance_Lock);
! if (scp == NULL)
! scp = cm_GetNewSCache();
if (scp == NULL) {
osi_Log0(afsd_logp,"cm_GetSCache unable to obtain *new* scache entry");
lock_ReleaseWrite(&cm_scacheLock);
***************
*** 740,748 ****
scp->dotdotFid.unique=1;
scp->dotdotFid.vnode=1;
scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
! scp->nextp=cm_data.scacheHashTablep[hash];
! cm_data.scacheHashTablep[hash]=scp;
! scp->flags |= CM_SCACHEFLAG_INHASH;
scp->refCount = 1;
osi_Log1(afsd_logp,"cm_GetSCache (freelance) sets refCount to 1 scp 0x%x", scp);
scp->fileType = fileType;
--- 750,760 ----
scp->dotdotFid.unique=1;
scp->dotdotFid.vnode=1;
scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
! if (!(scp->flags & CM_SCACHEFLAG_INHASH)) {
! scp->nextp=cm_data.scacheHashTablep[hash];
! cm_data.scacheHashTablep[hash]=scp;
! scp->flags |= CM_SCACHEFLAG_INHASH;
! }
scp->refCount = 1;
osi_Log1(afsd_logp,"cm_GetSCache (freelance) sets refCount to 1 scp 0x%x", scp);
scp->fileType = fileType;
***************
*** 834,850 ****
* to copy the dotdotFipd from the volume structure where the
* "master" copy is stored (defect 11489)
*/
! if (volp->ro.ID == fidp->volume) {
scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = volp->ro.dotdotFid;
! } else if (volp->bk.ID == fidp->volume) {
scp->flags |= CM_SCACHEFLAG_RO;
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = volp->bk.dotdotFid;
} else {
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = volp->rw.dotdotFid;
}
}
if (volp)
--- 846,862 ----
* to copy the dotdotFipd from the volume structure where the
* "master" copy is stored (defect 11489)
*/
! if (volp->vol[ROVOL].ID == fidp->volume) {
scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = cm_VolumeStateByType(volp, ROVOL)->dotdotFid;
! } else if (volp->vol[BACKVOL].ID == fidp->volume) {
scp->flags |= CM_SCACHEFLAG_RO;
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = cm_VolumeStateByType(volp, BACKVOL)->dotdotFid;
} else {
if (scp->fid.vnode == 1 && scp->fid.unique == 1)
! scp->dotdotFid = cm_VolumeStateByType(volp, RWVOL)->dotdotFid;
}
}
if (volp)
***************
*** 906,915 ****
{
cm_scache_waiter_t * w;
- /* Do not use the queue for asynchronous store operations */
- if (flags == CM_SCACHESYNC_ASYNCSTORE)
- return;
-
lock_ObtainWrite(&cm_scacheLock);
if (cm_allFreeWaiters == NULL) {
w = malloc(sizeof(*w));
--- 918,923 ----
***************
*** 936,945 ****
cm_scache_waiter_t * w;
int this_is_me;
- /* Do not use the queue for asynchronous store operations */
- if (flags == CM_SCACHESYNC_ASYNCSTORE)
- return 1;
-
osi_Log0(afsd_logp, "cm_SyncOpCheckContinue checking for continuation");
lock_ObtainRead(&cm_scacheLock);
--- 944,949 ----
Index: openafs/src/WINNT/afsd/cm_vnodeops.c
diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.72 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.74
*** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.72 Wed Mar 19 16:18:37 2008
--- openafs/src/WINNT/afsd/cm_vnodeops.c Mon Apr 14 18:44:04 2008
***************
*** 901,908 ****
sp->ExactFound = 1;
if (!sp->caseFold || matchName == shortName) {
! sp->fid.vnode = ntohl(dep->fid.vnode);
! sp->fid.unique = ntohl(dep->fid.unique);
return CM_ERROR_STOPNOW;
}
--- 901,907 ----
sp->ExactFound = 1;
if (!sp->caseFold || matchName == shortName) {
! cm_SetFid(&sp->fid, sp->fid.cell, sp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique));
return CM_ERROR_STOPNOW;
}
***************
*** 917,924 ****
match = strcmp(matchName, sp->searchNamep);
if (match == 0) {
sp->ExactFound = 1;
! sp->fid.vnode = ntohl(dep->fid.vnode);
! sp->fid.unique = ntohl(dep->fid.unique);
return CM_ERROR_STOPNOW;
}
--- 916,922 ----
match = strcmp(matchName, sp->searchNamep);
if (match == 0) {
sp->ExactFound = 1;
! cm_SetFid(&sp->fid, sp->fid.cell, sp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique));
return CM_ERROR_STOPNOW;
}
***************
*** 944,951 ****
sp->NCfound = 1;
inexact:
! sp->fid.vnode = ntohl(dep->fid.vnode);
! sp->fid.unique = ntohl(dep->fid.unique);
return 0;
}
--- 942,948 ----
sp->NCfound = 1;
inexact:
! cm_SetFid(&sp->fid, sp->fid.cell, sp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique));
return 0;
}
***************
*** 1110,1115 ****
--- 1107,1113 ----
if (code == 0) {
afs_uint32 cell, volume;
+ cm_vol_state_t *statep;
cell = cellp->cellID;
***************
*** 1119,1127 ****
* instead of the read-write.
*/
if (cm_followBackupPath &&
! volp->bk.ID != 0 &&
(dscp->flags & (CM_SCACHEFLAG_RO|CM_SCACHEFLAG_PURERO)) == CM_SCACHEFLAG_RO &&
! (targetType == RWVOL || targetType == ROVOL && volp->ro.ID == 0)
) {
targetType = BACKVOL;
}
--- 1117,1125 ----
* instead of the read-write.
*/
if (cm_followBackupPath &&
! volp->vol[BACKVOL].ID != 0 &&
(dscp->flags & (CM_SCACHEFLAG_RO|CM_SCACHEFLAG_PURERO)) == CM_SCACHEFLAG_RO &&
! (targetType == RWVOL || targetType == ROVOL && volp->vol[ROVOL].ID == 0)
) {
targetType = BACKVOL;
}
***************
*** 1132,1156 ****
*/
else if (mtType == '#' && targetType == RWVOL &&
(scp->flags & CM_SCACHEFLAG_PURERO) &&
! volp->ro.ID != 0) {
targetType = ROVOL;
}
! if (targetType == ROVOL) {
! volume = volp->ro.ID;
! lock_ObtainMutex(&volp->mx);
! volp->ro.dotdotFid = dscp->fid;
! lock_ReleaseMutex(&volp->mx);
! } else if (targetType == BACKVOL) {
! volume = volp->bk.ID;
! lock_ObtainMutex(&volp->mx);
! volp->bk.dotdotFid = dscp->fid;
! lock_ReleaseMutex(&volp->mx);
! } else {
! volume = volp->rw.ID;
! lock_ObtainMutex(&volp->mx);
! volp->rw.dotdotFid = dscp->fid;
! lock_ReleaseMutex(&volp->mx);
! }
/* the rest of the fid is a magic number */
cm_SetFid(&scp->mountRootFid, cell, volume, 1, 1);
--- 1130,1144 ----
*/
else if (mtType == '#' && targetType == RWVOL &&
(scp->flags & CM_SCACHEFLAG_PURERO) &&
! volp->vol[ROVOL].ID != 0) {
targetType = ROVOL;
}
!
! lock_ObtainWrite(&volp->rw);
! statep = cm_VolumeStateByType(volp, targetType);
! volume = statep->ID;
! statep->dotdotFid = dscp->fid;
! lock_ReleaseWrite(&volp->rw);
/* the rest of the fid is a magic number */
cm_SetFid(&scp->mountRootFid, cell, volume, 1, 1);
***************
*** 1273,1279 ****
}
else if (!strchr(namep, '#') && !strchr(namep, '%') &&
strcmp(namep, "srvsvc") && strcmp(namep, "wkssvc") &&
! strcmp(namep, "ipc$")) {
/* nonexistent dir on freelance root, so add it */
char fullname[200] = ".";
int found = 0;
--- 1261,1268 ----
}
else if (!strchr(namep, '#') && !strchr(namep, '%') &&
strcmp(namep, "srvsvc") && strcmp(namep, "wkssvc") &&
! strcmp(namep, "ipc$"))
! {
/* nonexistent dir on freelance root, so add it */
char fullname[200] = ".";
int found = 0;
***************
*** 1317,1329 ****
return CM_ERROR_NOSUCHFILE;
}
tscp = NULL; /* to force call of cm_GetSCache */
}
}
haveFid:
if ( !tscp ) /* we did not find it in the dnlc */
{
! dnlcHit = 0;
code = cm_GetSCache(&rock.fid, &tscp, userp, reqp);
if (code)
return code;
--- 1306,1323 ----
return CM_ERROR_NOSUCHFILE;
}
tscp = NULL; /* to force call of cm_GetSCache */
+ } else {
+ if (flags & CM_FLAG_CHECKPATH)
+ return CM_ERROR_NOSUCHPATH;
+ else
+ return CM_ERROR_NOSUCHFILE;
}
}
haveFid:
if ( !tscp ) /* we did not find it in the dnlc */
{
! dnlcHit = 0;
code = cm_GetSCache(&rock.fid, &tscp, userp, reqp);
if (code)
return code;
***************
*** 1486,1497 ****
goto _exit_cleanup;
if (volType == BACKVOL)
! volume = volp->bk.ID;
else if (volType == ROVOL ||
! (volType == RWVOL && mountType == ROVOL && volp->ro.ID != 0))
! volume = volp->ro.ID;
else
! volume = volp->rw.ID;
cm_SetFid(&fid, cellp->cellID, volume, 1, 1);
--- 1480,1491 ----
goto _exit_cleanup;
if (volType == BACKVOL)
! volume = volp->vol[BACKVOL].ID;
else if (volType == ROVOL ||
! (volType == RWVOL && mountType == ROVOL && volp->vol[ROVOL].ID != 0))
! volume = volp->vol[ROVOL].ID;
else
! volume = volp->vol[RWVOL].ID;
cm_SetFid(&fid, cellp->cellID, volume, 1, 1);
***************
*** 4877,4887 ****
osi_Log1(afsd_logp, "cm_LockMarkSCacheLost scp 0x%x", scp);
- #ifdef DEBUG
- /* With the current code, we can't lose a lock on a RO scp */
- osi_assertx(!(scp->flags & CM_SCACHEFLAG_RO), "CM_SCACHEFLAG_RO unexpected");
- #endif
-
/* cm_scacheLock needed because we are modifying fileLock->flags */
lock_ObtainWrite(&cm_scacheLock);
--- 4871,4876 ----
Index: openafs/src/WINNT/afsd/cm_volume.c
diff -c openafs/src/WINNT/afsd/cm_volume.c:1.14.4.36 openafs/src/WINNT/afsd/cm_volume.c:1.14.4.38
*** openafs/src/WINNT/afsd/cm_volume.c:1.14.4.36 Wed Mar 19 16:18:37 2008
--- openafs/src/WINNT/afsd/cm_volume.c Fri Apr 18 12:46:07 2008
***************
*** 70,84 ****
cm_volume_t * volp;
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
!
! if (volp->rw.ID)
! cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_alldown);
! if (volp->ro.ID)
! cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
! if (volp->bk.ID)
! cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
volp->cbExpiresRO = 0;
! lock_FinalizeMutex(&volp->mx);
}
return 0;
--- 70,82 ----
cm_volume_t * volp;
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! afs_uint32 volType;
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! if (volp->vol[volType].ID)
! cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown);
! }
volp->cbExpiresRO = 0;
! lock_FinalizeRWLock(&volp->rw);
}
return 0;
***************
*** 104,123 ****
cm_volume_t * volp;
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! lock_InitializeMutex(&volp->mx, "cm_volume_t mutex");
volp->flags |= CM_VOLUMEFLAG_RESET;
! volp->rw.state = vl_unknown;
! volp->rw.serversp = NULL;
! volp->ro.state = vl_unknown;
! volp->ro.serversp = NULL;
! volp->bk.state = vl_unknown;
! volp->bk.serversp = NULL;
! if (volp->rw.ID)
! cm_VolumeStatusNotification(volp, volp->rw.ID, vl_alldown, volp->rw.state);
! if (volp->ro.ID)
! cm_VolumeStatusNotification(volp, volp->ro.ID, vl_alldown, volp->ro.state);
! if (volp->bk.ID)
! cm_VolumeStatusNotification(volp, volp->bk.ID, vl_alldown, volp->bk.state);
volp->cbExpiresRO = 0;
}
}
--- 102,117 ----
cm_volume_t * volp;
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! afs_uint32 volType;
!
! lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock");
volp->flags |= CM_VOLUMEFLAG_RESET;
! for (volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! volp->vol[volType].state = vl_unknown;
! volp->vol[volType].serversp = NULL;
! if (volp->vol[volType].ID)
! cm_VolumeStatusNotification(volp, volp->vol[volType].ID, vl_alldown, volp->vol[volType].state);
! }
volp->cbExpiresRO = 0;
}
}
***************
*** 142,148 ****
/*
! * Update a volume. Caller holds volume's lock (volp->mx).
*
*
* shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:38 (JHutz)
--- 136,142 ----
/*
! * Update a volume. Caller holds a write lock on the volume (volp->rw).
*
*
* shadow / openafs / jhutz@CS.CMU.EDU {ANDREW.CMU.EDU} 01:38 (JHutz)
***************
*** 168,174 ****
* RXGEN_OPCODE.
*/
#define MULTIHOMED 1
! long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
cm_volume_t *volp)
{
cm_conn_t *connp;
--- 162,168 ----
* RXGEN_OPCODE.
*/
#define MULTIHOMED 1
! long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
cm_volume_t *volp)
{
cm_conn_t *connp;
***************
*** 192,208 ****
#ifdef AFS_FREELANCE_CLIENT
int freelance = 0;
#endif
/* clear out old bindings */
! if (volp->rw.serversp)
! cm_FreeServerList(&volp->rw.serversp, CM_FREESERVERLIST_DELETE);
! if (volp->ro.serversp)
! cm_FreeServerList(&volp->ro.serversp, CM_FREESERVERLIST_DELETE);
! if (volp->bk.serversp)
! cm_FreeServerList(&volp->bk.serversp, CM_FREESERVERLIST_DELETE);
#ifdef AFS_FREELANCE_CLIENT
! if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && volp->rw.ID == AFS_FAKE_ROOT_VOL_ID )
{
freelance = 1;
memset(&vldbEntry, 0, sizeof(vldbEntry));
--- 186,201 ----
#ifdef AFS_FREELANCE_CLIENT
int freelance = 0;
#endif
+ afs_uint32 volType;
/* clear out old bindings */
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! if (volp->vol[volType].serversp)
! cm_FreeServerList(&volp->vol[volType].serversp, CM_FREESERVERLIST_DELETE);
! }
#ifdef AFS_FREELANCE_CLIENT
! if ( cellp->cellID == AFS_FAKE_ROOT_CELL_ID && volp->vol[RWVOL].ID == AFS_FAKE_ROOT_VOL_ID )
{
freelance = 1;
memset(&vldbEntry, 0, sizeof(vldbEntry));
***************
*** 213,218 ****
--- 206,222 ----
} else
#endif
{
+ while (volp->flags & CM_VOLUMEFLAG_UPDATING_VL) {
+ osi_SleepW((LONG_PTR) &volp->flags, &volp->rw);
+ lock_ObtainWrite(&volp->rw);
+
+ if (!(volp->flags & CM_VOLUMEFLAG_RESET))
+ return 0;
+ }
+
+ volp->flags |= CM_VOLUMEFLAG_UPDATING_VL;
+ lock_ReleaseWrite(&volp->rw);
+
if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID)
cm_UpdateCell(cellp, 0);
***************
*** 250,256 ****
* doesn't exist we will not care about the .backup that might be left behind
* since there should be no method to access it.
*/
! if (code == CM_ERROR_NOSUCHVOLUME && volp->rw.ID == 0 && strlen(volp->namep) < (VL_MAXNAMELEN - 9)) {
char name[VL_MAXNAMELEN];
snprintf(name, VL_MAXNAMELEN, "%s.readonly", volp->namep);
--- 254,260 ----
* doesn't exist we will not care about the .backup that might be left behind
* since there should be no method to access it.
*/
! if (code == CM_ERROR_NOSUCHVOLUME && volp->vol[RWVOL].ID == 0 && strlen(volp->namep) < (VL_MAXNAMELEN - 9)) {
char name[VL_MAXNAMELEN];
snprintf(name, VL_MAXNAMELEN, "%s.readonly", volp->namep);
***************
*** 284,290 ****
osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS",
volp->cellp->name, osi_LogSaveString(afsd_logp,name));
}
!
if (code == 0) {
afs_int32 flags;
afs_int32 nServers;
--- 288,295 ----
osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS",
volp->cellp->name, osi_LogSaveString(afsd_logp,name));
}
!
! lock_ObtainWrite(&volp->rw);
if (code == 0) {
afs_int32 flags;
afs_int32 nServers;
***************
*** 408,447 ****
}
if (flags & VLF_RWEXISTS) {
! if (volp->rw.ID != rwID) {
! if (volp->rw.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
! volp->rw.ID = rwID;
cm_AddVolumeToIDHashTable(volp, RWVOL);
}
} else {
! if (volp->rw.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
! volp->rw.ID = 0;
}
if (flags & VLF_ROEXISTS) {
! if (volp->ro.ID != roID) {
! if (volp->ro.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
! volp->ro.ID = roID;
cm_AddVolumeToIDHashTable(volp, ROVOL);
}
} else {
! if (volp->ro.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
! volp->ro.ID = 0;
}
if (flags & VLF_BACKEXISTS) {
! if (volp->bk.ID != bkID) {
! if (volp->bk.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
! volp->bk.ID = bkID;
cm_AddVolumeToIDHashTable(volp, BACKVOL);
}
} else {
! if (volp->bk.flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
! volp->bk.ID = 0;
}
lock_ReleaseWrite(&cm_volumeLock);
for (i=0; ivol[RWVOL].ID != rwID) {
! if (volp->vol[RWVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
! volp->vol[RWVOL].ID = rwID;
cm_AddVolumeToIDHashTable(volp, RWVOL);
}
} else {
! if (volp->vol[RWVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
! volp->vol[RWVOL].ID = 0;
}
if (flags & VLF_ROEXISTS) {
! if (volp->vol[ROVOL].ID != roID) {
! if (volp->vol[ROVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
! volp->vol[ROVOL].ID = roID;
cm_AddVolumeToIDHashTable(volp, ROVOL);
}
} else {
! if (volp->vol[ROVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
! volp->vol[ROVOL].ID = 0;
}
if (flags & VLF_BACKEXISTS) {
! if (volp->vol[BACKVOL].ID != bkID) {
! if (volp->vol[BACKVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
! volp->vol[BACKVOL].ID = bkID;
cm_AddVolumeToIDHashTable(volp, BACKVOL);
}
} else {
! if (volp->vol[BACKVOL].flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
! volp->vol[BACKVOL].ID = 0;
}
lock_ReleaseWrite(&cm_volumeLock);
for (i=0; irw.serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
--- 477,483 ----
*/
if ((tflags & VLSF_RWVOL) && (flags & VLF_RWEXISTS)) {
tsrp = cm_NewServerRef(tsp, rwID);
! cm_InsertServerList(&volp->vol[RWVOL].serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
***************
*** 483,489 ****
}
if ((tflags & VLSF_ROVOL) && (flags & VLF_ROEXISTS)) {
tsrp = cm_NewServerRef(tsp, roID);
! cm_InsertServerList(&volp->ro.serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
lock_ReleaseWrite(&cm_serverLock);
--- 488,494 ----
}
if ((tflags & VLSF_ROVOL) && (flags & VLF_ROEXISTS)) {
tsrp = cm_NewServerRef(tsp, roID);
! cm_InsertServerList(&volp->vol[ROVOL].serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
lock_ReleaseWrite(&cm_serverLock);
***************
*** 499,505 ****
*/
if ((tflags & VLSF_RWVOL) && (flags & VLF_BACKEXISTS)) {
tsrp = cm_NewServerRef(tsp, bkID);
! cm_InsertServerList(&volp->bk.serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
lock_ReleaseWrite(&cm_serverLock);
--- 504,510 ----
*/
if ((tflags & VLSF_RWVOL) && (flags & VLF_BACKEXISTS)) {
tsrp = cm_NewServerRef(tsp, bkID);
! cm_InsertServerList(&volp->vol[BACKVOL].serversp, tsrp);
lock_ObtainWrite(&cm_serverLock);
tsrp->refCount--; /* drop allocation reference */
lock_ReleaseWrite(&cm_serverLock);
***************
*** 522,528 ****
* lists are length 1.
*/
if (ROcount > 1) {
! cm_RandomizeServer(&volp->ro.serversp);
}
rwNewstate = rwServers_alldown ? vl_alldown : vl_online;
--- 527,533 ----
* lists are length 1.
*/
if (ROcount > 1) {
! cm_RandomizeServer(&volp->vol[ROVOL].serversp);
}
rwNewstate = rwServers_alldown ? vl_alldown : vl_online;
***************
*** 532,579 ****
/* this volume does not exist - we should discard it */
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromNameHashTable(volp);
! if (volp->rw.flags & CM_VOLUMEFLAG_IN_HASH)
! cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
! if (volp->ro.flags & CM_VOLUMEFLAG_IN_HASH)
! cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
! if (volp->bk.flags & CM_VOLUMEFLAG_IN_HASH)
! cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
/* Move to the end so it will be recycled first */
cm_MoveVolumeToLRULast(volp);
- if (volp->rw.ID)
- cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_alldown);
- if (volp->ro.ID)
- cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
- if (volp->bk.ID)
- cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
-
- volp->rw.ID = volp->ro.ID = volp->bk.ID = 0;
- cm_SetFid(&volp->rw.dotdotFid, 0, 0, 0, 0);
- cm_SetFid(&volp->ro.dotdotFid, 0, 0, 0, 0);
- cm_SetFid(&volp->bk.dotdotFid, 0, 0, 0, 0);
volp->namep[0] ='\0';
} else {
rwNewstate = roNewstate = bkNewstate = vl_alldown;
}
! if (volp->rw.state != rwNewstate) {
! if (volp->rw.ID)
! cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, rwNewstate);
! volp->rw.state = rwNewstate;
! }
! if (volp->ro.state != roNewstate) {
! if (volp->ro.ID)
! cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, roNewstate);
! volp->ro.state = roNewstate;
! }
! if (volp->bk.state != bkNewstate) {
! if (volp->bk.ID)
! cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, bkNewstate);
! volp->bk.state = bkNewstate;
}
return code;
}
--- 537,579 ----
/* this volume does not exist - we should discard it */
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromNameHashTable(volp);
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! if (volp->vol[volType].flags & CM_VOLUMEFLAG_IN_HASH)
! cm_RemoveVolumeFromIDHashTable(volp, volType);
! if (volp->vol[volType].ID) {
! cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown);
! volp->vol[volType].ID = 0;
! }
! cm_SetFid(&volp->vol[volType].dotdotFid, 0, 0, 0, 0);
! }
/* Move to the end so it will be recycled first */
cm_MoveVolumeToLRULast(volp);
volp->namep[0] ='\0';
} else {
rwNewstate = roNewstate = bkNewstate = vl_alldown;
}
! if (volp->vol[RWVOL].state != rwNewstate) {
! if (volp->vol[RWVOL].ID)
! cm_VolumeStatusNotification(volp, volp->vol[RWVOL].ID, volp->vol[RWVOL].state, rwNewstate);
! volp->vol[RWVOL].state = rwNewstate;
! }
! if (volp->vol[ROVOL].state != roNewstate) {
! if (volp->vol[ROVOL].ID)
! cm_VolumeStatusNotification(volp, volp->vol[ROVOL].ID, volp->vol[ROVOL].state, roNewstate);
! volp->vol[ROVOL].state = roNewstate;
! }
! if (volp->vol[BACKVOL].state != bkNewstate) {
! if (volp->vol[BACKVOL].ID)
! cm_VolumeStatusNotification(volp, volp->vol[BACKVOL].ID, volp->vol[BACKVOL].state, bkNewstate);
! volp->vol[BACKVOL].state = bkNewstate;
}
+ volp->flags &= ~CM_VOLUMEFLAG_UPDATING_VL;
+ osi_Wakeup((LONG_PTR) &volp->flags);
+
return code;
}
***************
*** 594,614 ****
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->ro.nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->ro.ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->rw.nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->rw.ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->bk.nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->bk.ID )
break;
}
}
--- 594,614 ----
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->vol[ROVOL].nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->vol[ROVOL].ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->vol[RWVOL].nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->vol[RWVOL].ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->vol[BACKVOL].nextp) {
! if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->vol[BACKVOL].ID )
break;
}
}
***************
*** 636,644 ****
#ifdef SEARCH_ALL_VOLUMES
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if (cellp == volp->cellp &&
! ((unsigned) volumeID == volp->rw.ID ||
! (unsigned) volumeID == volp->ro.ID ||
! (unsigned) volumeID == volp->bk.ID))
break;
}
--- 636,644 ----
#ifdef SEARCH_ALL_VOLUMES
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if (cellp == volp->cellp &&
! ((unsigned) volumeID == volp->vol[RWVOL].ID ||
! (unsigned) volumeID == volp->vol[ROVOL].ID ||
! (unsigned) volumeID == volp->vol[BACKVOL].ID))
break;
}
***************
*** 650,670 ****
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->ro.nextp) {
! if ( cellp == volp->cellp && volumeID == volp->ro.ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->rw.nextp) {
! if ( cellp == volp->cellp && volumeID == volp->rw.ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->bk.nextp) {
! if ( cellp == volp->cellp && volumeID == volp->bk.ID )
break;
}
}
--- 650,670 ----
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->vol[ROVOL].nextp) {
! if ( cellp == volp->cellp && volumeID == volp->vol[ROVOL].ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->vol[RWVOL].nextp) {
! if ( cellp == volp->cellp && volumeID == volp->vol[RWVOL].ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->vol[BACKVOL].nextp) {
! if ( cellp == volp->cellp && volumeID == volp->vol[BACKVOL].ID )
break;
}
}
***************
*** 681,695 ****
/* return it held */
if (volp) {
! lock_ObtainMutex(&volp->mx);
code = 0;
if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
! code = cm_UpdateVolume(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! lock_ReleaseMutex(&volp->mx);
if (code == 0) {
*outVolpp = volp;
--- 681,695 ----
/* return it held */
if (volp) {
! lock_ObtainWrite(&volp->rw);
code = 0;
if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
! code = cm_UpdateVolumeLocation(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! lock_ReleaseWrite(&volp->rw);
if (code == 0) {
*outVolpp = volp;
***************
*** 698,706 ****
cm_AdjustVolumeLRU(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
! } else
cm_PutVolume(volp);
!
return code;
}
--- 698,708 ----
cm_AdjustVolumeLRU(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
! } else {
! lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
! lock_ReleaseRead(&cm_volumeLock);
! }
return code;
}
***************
*** 761,770 ****
#endif
if (!volp && (flags & CM_GETVOL_FLAG_CREATE)) {
/* otherwise, get from VLDB */
if ( cm_data.currentVolumes >= cm_data.maxVolumes ) {
-
#ifdef RECYCLE_FROM_ALL_VOLUMES_LIST
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if ( volp->refCount == 0 ) {
--- 763,772 ----
#endif
if (!volp && (flags & CM_GETVOL_FLAG_CREATE)) {
+ afs_uint32 volType;
/* otherwise, get from VLDB */
if ( cm_data.currentVolumes >= cm_data.maxVolumes ) {
#ifdef RECYCLE_FROM_ALL_VOLUMES_LIST
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if ( volp->refCount == 0 ) {
***************
*** 787,793 ****
osi_panic("Exceeded Max Volumes", __FILE__, __LINE__);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainMutex(&volp->mx);
lock_ObtainWrite(&cm_volumeLock);
osi_Log2(afsd_logp, "Recycling Volume %s:%s",
--- 789,795 ----
osi_panic("Exceeded Max Volumes", __FILE__, __LINE__);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainWrite(&volp->rw);
lock_ObtainWrite(&cm_volumeLock);
osi_Log2(afsd_logp, "Recycling Volume %s:%s",
***************
*** 797,829 ****
cm_RemoveVolumeFromLRU(volp);
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromNameHashTable(volp);
- if (volp->rw.flags & CM_VOLUMEFLAG_IN_HASH)
- cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
- if (volp->ro.flags & CM_VOLUMEFLAG_IN_HASH)
- cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
- if (volp->bk.flags & CM_VOLUMEFLAG_IN_HASH)
- cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
! if (volp->rw.ID)
! cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_unknown);
! if (volp->ro.ID)
! cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_unknown);
! if (volp->bk.ID)
! cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_unknown);
!
! volp->rw.ID = volp->ro.ID = volp->bk.ID = 0;
! cm_SetFid(&volp->rw.dotdotFid, 0, 0, 0, 0);
! cm_SetFid(&volp->ro.dotdotFid, 0, 0, 0, 0);
! cm_SetFid(&volp->bk.dotdotFid, 0, 0, 0, 0);
} else {
volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++];
memset(volp, 0, sizeof(cm_volume_t));
volp->magic = CM_VOLUME_MAGIC;
volp->allNextp = cm_data.allVolumesp;
cm_data.allVolumesp = volp;
! lock_InitializeMutex(&volp->mx, "cm_volume_t mutex");
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainMutex(&volp->mx);
lock_ObtainWrite(&cm_volumeLock);
}
volp->cellp = cellp;
--- 799,822 ----
cm_RemoveVolumeFromLRU(volp);
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromNameHashTable(volp);
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! if (volp->vol[volType].flags & CM_VOLUMEFLAG_IN_HASH)
! cm_RemoveVolumeFromIDHashTable(volp, volType);
! if (volp->vol[volType].ID)
! cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_unknown);
! volp->vol[volType].ID = 0;
! cm_SetFid(&volp->vol[volType].dotdotFid, 0, 0, 0, 0);
! }
} else {
volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++];
memset(volp, 0, sizeof(cm_volume_t));
volp->magic = CM_VOLUME_MAGIC;
volp->allNextp = cm_data.allVolumesp;
cm_data.allVolumesp = volp;
! lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock");
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainWrite(&volp->rw);
lock_ObtainWrite(&cm_volumeLock);
}
volp->cellp = cellp;
***************
*** 831,839 ****
volp->namep[VL_MAXNAMELEN-1] = '\0';
volp->refCount = 1; /* starts off held */
volp->flags = CM_VOLUMEFLAG_RESET;
! volp->rw.state = volp->ro.state = volp->bk.state = vl_unknown;
! volp->rw.nextp = volp->ro.nextp = volp->bk.nextp = NULL;
! volp->rw.flags = volp->ro.flags = volp->bk.flags = 0;
volp->cbExpiresRO = 0;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
--- 824,835 ----
volp->namep[VL_MAXNAMELEN-1] = '\0';
volp->refCount = 1; /* starts off held */
volp->flags = CM_VOLUMEFLAG_RESET;
!
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! volp->vol[volType].state = vl_unknown;
! volp->vol[volType].nextp = NULL;
! volp->vol[volType].flags = 0;
! }
volp->cbExpiresRO = 0;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
***************
*** 846,864 ****
if (!volp)
return CM_ERROR_NOSUCHVOLUME;
! lock_ObtainMutex(&volp->mx);
}
/* if we get here we are holding the mutex */
if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
! code = cm_UpdateVolume(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! lock_ReleaseMutex(&volp->mx);
! if (code == 0 && (type == BACKVOL && volp->bk.ID == 0 ||
! type == ROVOL && volp->ro.ID == 0))
code = CM_ERROR_NOSUCHVOLUME;
if (code == 0) {
--- 842,860 ----
if (!volp)
return CM_ERROR_NOSUCHVOLUME;
! lock_ObtainWrite(&volp->rw);
}
/* if we get here we are holding the mutex */
if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
! code = cm_UpdateVolumeLocation(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! lock_ReleaseWrite(&volp->rw);
! if (code == 0 && (type == BACKVOL && volp->vol[BACKVOL].ID == 0 ||
! type == ROVOL && volp->vol[ROVOL].ID == 0))
code = CM_ERROR_NOSUCHVOLUME;
if (code == 0) {
***************
*** 869,877 ****
cm_AdjustVolumeLRU(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
! } else
cm_PutVolume(volp);
!
return code;
}
--- 865,875 ----
cm_AdjustVolumeLRU(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
! } else {
! lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
! lock_ReleaseRead(&cm_volumeLock);
! }
return code;
}
***************
*** 894,902 ****
#ifdef SEARCH_ALL_VOLUMES
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if (cellp == volp->cellp &&
! (fidp->volume == volp->rw.ID ||
! fidp->volume == volp->ro.ID ||
! fidp->volume == volp->bk.ID))
break;
}
#endif /* SEARCH_ALL_VOLUMES */
--- 892,900 ----
#ifdef SEARCH_ALL_VOLUMES
for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if (cellp == volp->cellp &&
! (fidp->volume == volp->vol[RWVOL].ID ||
! fidp->volume == volp->vol[ROVOL].ID ||
! fidp->volume == volp->vol[BACKVOL].ID))
break;
}
#endif /* SEARCH_ALL_VOLUMES */
***************
*** 906,926 ****
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->ro.nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->ro.ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->rw.nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->rw.ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->bk.nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->bk.ID )
break;
}
}
--- 904,924 ----
* search the hash table for all three types until we find it.
* We will search in the order of RO, RW, BK.
*/
! for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->vol[ROVOL].nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->vol[ROVOL].ID )
break;
}
if (!volp) {
/* try RW volumes */
! for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->vol[RWVOL].nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->vol[RWVOL].ID )
break;
}
}
if (!volp) {
/* try BK volumes */
! for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->vol[BACKVOL].nextp) {
! if ( cellp == volp->cellp && fidp->volume == volp->vol[BACKVOL].ID )
break;
}
}
***************
*** 934,942 ****
lock_ReleaseRead(&cm_volumeLock);
/* update it */
cm_data.mountRootGen = time(NULL);
! lock_ObtainMutex(&volp->mx);
volp->flags |= CM_VOLUMEFLAG_RESET;
#ifdef COMMENT
/* Mark the volume to be updated but don't update it now.
--- 932,943 ----
lock_ReleaseRead(&cm_volumeLock);
+ if (!volp)
+ return;
+
/* update it */
cm_data.mountRootGen = time(NULL);
! lock_ObtainWrite(&volp->rw);
volp->flags |= CM_VOLUMEFLAG_RESET;
#ifdef COMMENT
/* Mark the volume to be updated but don't update it now.
***************
*** 949,961 ****
* accessed by Name or ID the UpdateVolume call will
* occur.
*/
! code = cm_UpdateVolume(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
#endif
! lock_ReleaseMutex(&volp->mx);
cm_PutVolume(volp);
}
/* find the appropriate servers from a volume */
--- 950,964 ----
* accessed by Name or ID the UpdateVolume call will
* occur.
*/
! code = cm_UpdateVolumeLocation(cellp, userp, reqp, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
#endif
! lock_ReleaseWrite(&volp->rw);
+ lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
}
/* find the appropriate servers from a volume */
***************
*** 966,977 ****
lock_ObtainWrite(&cm_serverLock);
! if (volume == volp->rw.ID)
! serverspp = &volp->rw.serversp;
! else if (volume == volp->ro.ID)
! serverspp = &volp->ro.serversp;
! else if (volume == volp->bk.ID)
! serverspp = &volp->bk.serversp;
else
osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__);
--- 969,980 ----
lock_ObtainWrite(&cm_serverLock);
! if (volume == volp->vol[RWVOL].ID)
! serverspp = &volp->vol[RWVOL].serversp;
! else if (volume == volp->vol[ROVOL].ID)
! serverspp = &volp->vol[ROVOL].serversp;
! else if (volume == volp->vol[BACKVOL].ID)
! serverspp = &volp->vol[BACKVOL].serversp;
else
osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__);
***************
*** 996,1007 ****
{
long id;
! lock_ObtainMutex(&volp->mx);
! if (volp->ro.ID && volp->ro.serversp)
! id = volp->ro.ID;
else
! id = volp->rw.ID;
! lock_ReleaseMutex(&volp->mx);
return id;
}
--- 999,1010 ----
{
long id;
! lock_ObtainRead(&volp->rw);
! if (volp->vol[ROVOL].ID && volp->vol[ROVOL].serversp)
! id = volp->vol[ROVOL].ID;
else
! id = volp->vol[RWVOL].ID;
! lock_ReleaseRead(&volp->rw);
return id;
}
***************
*** 1020,1028 ****
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainMutex(&volp->mx);
volp->flags |= CM_VOLUMEFLAG_RESET;
! lock_ReleaseMutex(&volp->mx);
lock_ObtainRead(&cm_volumeLock);
refCount = InterlockedDecrement(&volp->refCount);
--- 1023,1031 ----
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainWrite(&volp->rw);
volp->flags |= CM_VOLUMEFLAG_RESET;
! lock_ReleaseWrite(&volp->rw);
lock_ObtainRead(&cm_volumeLock);
refCount = InterlockedDecrement(&volp->refCount);
***************
*** 1075,1198 ****
OfflineMsg = offLineMsg;
MOTD = motd;
! lock_ObtainMutex(&volp->mx);
if (volp->flags & CM_VOLUMEFLAG_RESET) {
cm_InitReq(&req);
! code = cm_UpdateVolume(volp->cellp, cm_rootUserp, &req, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! if (volp->rw.ID != 0 && (!volID || volID == volp->rw.ID) &&
! volp->rw.serversp &&
! (volp->rw.state == vl_busy || volp->rw.state == vl_offline || volp->rw.state == vl_unknown)) {
! cm_InitReq(&req);
!
! for (serversp = volp->rw.serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline)
serversp->status = srv_not_busy;
}
! lock_ReleaseMutex(&volp->mx);
! do {
! code = cm_ConnFromVolume(volp, volp->rw.ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->rw.ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainMutex(&volp->mx);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_online);
! volp->rw.state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_unknown);
! volp->rw.state = vl_unknown;
! online = 1;
}
}
! if (volp->ro.ID != 0 && (!volID || volID == volp->ro.ID) &&
! volp->ro.serversp &&
! (volp->ro.state == vl_busy || volp->ro.state == vl_offline || volp->ro.state == vl_unknown)) {
! cm_InitReq(&req);
! for (serversp = volp->ro.serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline)
serversp->status = srv_not_busy;
}
! lock_ReleaseMutex(&volp->mx);
! do {
! code = cm_ConnFromVolume(volp, volp->ro.ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->ro.ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainMutex(&volp->mx);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_online);
! volp->ro.state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_unknown);
! volp->ro.state = vl_unknown;
! online = 1;
}
}
! if (volp->bk.ID != 0 && (!volID || volID == volp->bk.ID) &&
! volp->bk.serversp &&
! (volp->bk.state == vl_busy || volp->bk.state == vl_offline || volp->bk.state == vl_unknown)) {
! cm_InitReq(&req);
!
! for (serversp = volp->bk.serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline)
serversp->status = srv_not_busy;
}
! lock_ReleaseMutex(&volp->mx);
! do {
! code = cm_ConnFromVolume(volp, volp->bk.ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->bk.ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainMutex(&volp->mx);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_online);
! volp->bk.state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_unknown);
! volp->bk.state = vl_unknown;
! online = 1;
}
}
! lock_ReleaseMutex(&volp->mx);
return online;
}
--- 1078,1213 ----
OfflineMsg = offLineMsg;
MOTD = motd;
! lock_ObtainWrite(&volp->rw);
if (volp->flags & CM_VOLUMEFLAG_RESET) {
cm_InitReq(&req);
! code = cm_UpdateVolumeLocation(volp->cellp, cm_rootUserp, &req, volp);
if (code == 0)
volp->flags &= ~CM_VOLUMEFLAG_RESET;
}
! if (volp->vol[RWVOL].ID != 0 && (!volID || volID == volp->vol[RWVOL].ID) &&
! volp->vol[RWVOL].serversp) {
!
! for (serversp = volp->vol[RWVOL].serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline) {
serversp->status = srv_not_busy;
+ online = 1;
+ }
}
! if (volp->vol[RWVOL].state == vl_busy || volp->vol[RWVOL].state == vl_offline || volp->vol[RWVOL].state == vl_unknown) {
! cm_InitReq(&req);
! lock_ReleaseWrite(&volp->rw);
! do {
! code = cm_ConnFromVolume(volp, volp->vol[RWVOL].ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
!
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->vol[RWVOL].ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainWrite(&volp->rw);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->vol[RWVOL].ID, volp->vol[RWVOL].state, vl_online);
! volp->vol[RWVOL].state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->vol[RWVOL].ID, volp->vol[RWVOL].state, vl_unknown);
! volp->vol[RWVOL].state = vl_unknown;
! online = 1;
! }
}
}
! if (volp->vol[ROVOL].ID != 0 && (!volID || volID == volp->vol[ROVOL].ID) &&
! volp->vol[ROVOL].serversp) {
! for (serversp = volp->vol[ROVOL].serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline) {
serversp->status = srv_not_busy;
+ online = 1;
+ }
}
! if (volp->vol[ROVOL].state == vl_busy || volp->vol[ROVOL].state == vl_offline || volp->vol[ROVOL].state == vl_unknown) {
! cm_InitReq(&req);
! lock_ReleaseWrite(&volp->rw);
! do {
! code = cm_ConnFromVolume(volp, volp->vol[ROVOL].ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
!
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->vol[ROVOL].ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainWrite(&volp->rw);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->vol[ROVOL].ID, volp->vol[ROVOL].state, vl_online);
! volp->vol[ROVOL].state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->vol[ROVOL].ID, volp->vol[ROVOL].state, vl_unknown);
! volp->vol[ROVOL].state = vl_unknown;
! online = 1;
! }
}
}
! if (volp->vol[BACKVOL].ID != 0 && (!volID || volID == volp->vol[BACKVOL].ID) &&
! volp->vol[BACKVOL].serversp) {
!
! for (serversp = volp->vol[BACKVOL].serversp; serversp; serversp = serversp->next) {
! if (serversp->status == srv_busy || serversp->status == srv_offline) {
serversp->status = srv_not_busy;
+ online = 1;
+ }
}
! if (volp->vol[BACKVOL].state == vl_busy || volp->vol[BACKVOL].state == vl_offline || volp->vol[BACKVOL].state == vl_unknown) {
! cm_InitReq(&req);
! lock_ReleaseWrite(&volp->rw);
! do {
! code = cm_ConnFromVolume(volp, volp->vol[BACKVOL].ID, cm_rootUserp, &req, &connp);
! if (code)
! continue;
!
! callp = cm_GetRxConn(connp);
! code = RXAFS_GetVolumeStatus(callp, volp->vol[BACKVOL].ID,
! &volStat, &Name, &OfflineMsg, &MOTD);
! rx_PutConnection(callp);
!
! } while (cm_Analyze(connp, cm_rootUserp, &req, NULL, NULL, NULL, NULL, code));
! code = cm_MapRPCError(code, &req);
!
! lock_ObtainWrite(&volp->rw);
! if (code == 0 && volStat.Online) {
! cm_VolumeStatusNotification(volp, volp->vol[BACKVOL].ID, volp->vol[BACKVOL].state, vl_online);
! volp->vol[BACKVOL].state = vl_online;
! online = 1;
! } else if (code == CM_ERROR_NOACCESS) {
! cm_VolumeStatusNotification(volp, volp->vol[BACKVOL].ID, volp->vol[BACKVOL].state, vl_unknown);
! volp->vol[BACKVOL].state = vl_unknown;
! online = 1;
! }
}
}
! lock_ReleaseWrite(&volp->rw);
return online;
}
***************
*** 1273,1284 ****
cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID)
{
! if (volp->rw.ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->rw);
! } else if (volp->ro.ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->ro);
! } else if (volp->bk.ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->bk);
} else {
/*
* If we are called with volID == 0 then something has gone wrong.
--- 1288,1299 ----
cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID)
{
! if (volp->vol[RWVOL].ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->vol[RWVOL]);
! } else if (volp->vol[ROVOL].ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->vol[ROVOL]);
! } else if (volp->vol[BACKVOL].ID == volID) {
! cm_UpdateVolumeStatusInt(volp, &volp->vol[BACKVOL]);
} else {
/*
* If we are called with volID == 0 then something has gone wrong.
***************
*** 1287,1298 ****
* just update all of them that are known to exist. Better to be
* correct than fast.
*/
! if (volp->rw.ID != 0)
! cm_UpdateVolumeStatusInt(volp, &volp->rw);
! if (volp->ro.ID != 0)
! cm_UpdateVolumeStatusInt(volp, &volp->ro);
! if (volp->bk.ID != 0)
! cm_UpdateVolumeStatusInt(volp, &volp->bk);
}
}
--- 1302,1312 ----
* just update all of them that are known to exist. Better to be
* correct than fast.
*/
! afs_uint32 volType;
! for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
! if (volp->vol[volType].ID != 0)
! cm_UpdateVolumeStatusInt(volp, &volp->vol[volType]);
! }
}
}
***************
*** 1313,1328 ****
code = 1 ; /* assume that list is unchanged */
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainMutex(&volp->mx);
! if ((tsp->cellp==volp->cellp) && (volp->ro.serversp))
! code =cm_ChangeRankServer(&volp->ro.serversp, tsp);
/* this volume list was changed */
if ( !code )
! cm_RandomizeServer(&volp->ro.serversp);
! lock_ReleaseMutex(&volp->mx);
lock_ObtainRead(&cm_volumeLock);
refCount = InterlockedDecrement(&volp->refCount);
osi_assertx(refCount >= 0, "cm_volume_t refCount underflow");
--- 1327,1342 ----
code = 1 ; /* assume that list is unchanged */
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
! lock_ObtainWrite(&volp->rw);
! if ((tsp->cellp==volp->cellp) && (volp->vol[ROVOL].serversp))
! code =cm_ChangeRankServer(&volp->vol[ROVOL].serversp, tsp);
/* this volume list was changed */
if ( !code )
! cm_RandomizeServer(&volp->vol[ROVOL].serversp);
! lock_ReleaseWrite(&volp->rw);
lock_ObtainRead(&cm_volumeLock);
refCount = InterlockedDecrement(&volp->refCount);
osi_assertx(refCount >= 0, "cm_volume_t refCount underflow");
***************
*** 1351,1357 ****
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
{
sprintf(output, "%s - volp=0x%p cell=%s name=%s rwID=%u roID=%u bkID=%u flags=0x%x refCount=%u\r\n",
! cookie, volp, volp->cellp->name, volp->namep, volp->rw.ID, volp->ro.ID, volp->bk.ID, volp->flags,
volp->refCount);
WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
}
--- 1365,1371 ----
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
{
sprintf(output, "%s - volp=0x%p cell=%s name=%s rwID=%u roID=%u bkID=%u flags=0x%x refCount=%u\r\n",
! cookie, volp, volp->cellp->name, volp->namep, volp->vol[RWVOL].ID, volp->vol[ROVOL].ID, volp->vol[BACKVOL].ID, volp->flags,
volp->refCount);
WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
}
***************
*** 1431,1449 ****
int i;
struct cm_vol_state * statep;
! switch (volType) {
! case RWVOL:
! statep = &volp->rw;
! break;
! case ROVOL:
! statep = &volp->ro;
! break;
! case BACKVOL:
! statep = &volp->bk;
! break;
! default:
! return;
! }
if (statep->flags & CM_VOLUMEFLAG_IN_HASH)
return;
--- 1445,1451 ----
int i;
struct cm_vol_state * statep;
! statep = cm_VolumeStateByType(volp, volType);
if (statep->flags & CM_VOLUMEFLAG_IN_HASH)
return;
***************
*** 1476,1494 ****
struct cm_vol_state * statep;
int i;
! switch (volType) {
! case RWVOL:
! statep = &volp->rw;
! break;
! case ROVOL:
! statep = &volp->ro;
! break;
! case BACKVOL:
! statep = &volp->bk;
! break;
! default:
! return;
! }
if (statep->flags & CM_VOLUMEFLAG_IN_HASH) {
/* hash it out first */
--- 1478,1484 ----
struct cm_vol_state * statep;
int i;
! statep = cm_VolumeStateByType(volp, volType);
if (statep->flags & CM_VOLUMEFLAG_IN_HASH) {
/* hash it out first */
***************
*** 1507,1512 ****
--- 1497,1504 ----
lvolpp = &cm_data.volumeBKIDHashTablep[i];
tvolp = cm_data.volumeBKIDHashTablep[i];
break;
+ default:
+ osi_assertx(0, "invalid volume type");
}
do {
if (tvolp == volp) {
***************
*** 1516,1535 ****
break;
}
! switch (volType) {
! case RWVOL:
! lvolpp = &tvolp->rw.nextp;
! tvolp = tvolp->rw.nextp;
! break;
! case ROVOL:
! lvolpp = &tvolp->ro.nextp;
! tvolp = tvolp->ro.nextp;
! break;
! case BACKVOL:
! lvolpp = &tvolp->bk.nextp;
! tvolp = tvolp->bk.nextp;
! break;
! }
} while(tvolp);
}
}
--- 1508,1515 ----
break;
}
! lvolpp = &tvolp->vol[volType].nextp;
! tvolp = tvolp->vol[volType].nextp;
} while(tvolp);
}
}
***************
*** 1595,1605 ****
char volstr[CELL_MAXNAMELEN + VL_MAXNAMELEN]="";
char *ext = "";
! if (volID == volp->rw.ID)
ext = "";
! else if (volID == volp->ro.ID)
ext = ".readonly";
! else if (volID == volp->bk.ID)
ext = ".backup";
else
ext = ".nomatch";
--- 1575,1585 ----
char volstr[CELL_MAXNAMELEN + VL_MAXNAMELEN]="";
char *ext = "";
! if (volID == volp->vol[RWVOL].ID)
ext = "";
! else if (volID == volp->vol[ROVOL].ID)
ext = ".readonly";
! else if (volID == volp->vol[BACKVOL].ID)
ext = ".backup";
else
ext = ".nomatch";
***************
*** 1613,1627 ****
enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID)
{
! if (volp->rw.ID == volID) {
! return volp->rw.state;
! } else if (volp->ro.ID == volID) {
! return volp->ro.state;
! } else if (volp->bk.ID == volID) {
! return volp->bk.state;
! } else {
return vl_unknown;
- }
}
/* Renew .readonly volume callbacks that are more than
--- 1593,1603 ----
enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID)
{
! cm_vol_state_t * statep = cm_VolumeStateByID(volp, volID);
! if (statep)
! return statep->state;
! else
return vl_unknown;
}
/* Renew .readonly volume callbacks that are more than
***************
*** 1640,1646 ****
cm_fid_t fid;
cm_scache_t * scp;
! cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1);
cm_InitReq(&req);
--- 1616,1622 ----
cm_fid_t fid;
cm_scache_t * scp;
! cm_SetFid(&fid, volp->cellp->cellID, volp->vol[ROVOL].ID, 1, 1);
cm_InitReq(&req);
***************
*** 1656,1658 ****
--- 1632,1672 ----
}
lock_ReleaseRead(&cm_volumeLock);
}
+
+ cm_vol_state_t *
+ cm_VolumeStateByType(cm_volume_t *volp, afs_uint32 volType)
+ {
+ return &volp->vol[volType];
+ }
+
+ cm_vol_state_t *
+ cm_VolumeStateByID(cm_volume_t *volp, afs_uint32 id)
+ {
+ cm_vol_state_t * statep = NULL;
+
+ if (id == volp->vol[RWVOL].ID)
+ statep = &volp->vol[RWVOL];
+ else if (id == volp->vol[ROVOL].ID)
+ statep = &volp->vol[ROVOL];
+ else if (id == volp->vol[BACKVOL].ID)
+ statep = &volp->vol[BACKVOL];
+
+ return(statep);
+ }
+
+ cm_vol_state_t *
+ cm_VolumeStateByName(cm_volume_t *volp, char *volname)
+ {
+ size_t len = strlen(volname);
+ cm_vol_state_t *statep;
+
+ if (stricmp(".readonly", &volname[len-9]) == 0)
+ statep = &volp->vol[ROVOL];
+ else if (stricmp(".backup", &volname[len-7]) == 0)
+ statep = &volp->vol[BACKVOL];
+ else
+ statep = &volp->vol[RWVOL];
+
+ return statep;
+ }
+
Index: openafs/src/WINNT/afsd/cm_volume.h
diff -c openafs/src/WINNT/afsd/cm_volume.h:1.5.6.12 openafs/src/WINNT/afsd/cm_volume.h:1.5.6.13
*** openafs/src/WINNT/afsd/cm_volume.h:1.5.6.12 Wed Mar 19 16:18:37 2008
--- openafs/src/WINNT/afsd/cm_volume.h Mon Apr 14 18:44:04 2008
***************
*** 14,28 ****
#define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
typedef struct cm_vol_state {
struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */
! afs_uint32 ID; /* by mx */
struct cm_fid dotdotFid; /* parent of volume root */
! cm_serverRef_t *serversp; /* by mx */
! enum volstatus state; /* by mx */
! afs_uint32 flags; /* by mx */
} cm_vol_state_t;
typedef struct cm_volume {
osi_queue_t q; /* LRU queue; cm_volumeLock */
afs_uint32 magic;
--- 14,35 ----
#define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
+ /*
+ *
+ */
+
typedef struct cm_vol_state {
struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */
! afs_uint32 ID; /* by rw */
struct cm_fid dotdotFid; /* parent of volume root */
! cm_serverRef_t *serversp; /* by cm_serverLock */
! enum volstatus state; /* by rw */
! afs_uint32 flags; /* by rw */
} cm_vol_state_t;
+ /* RWVOL, ROVOL, BACKVOL are defined in cm.h */
+ #define NUM_VOL_TYPES 3
+
typedef struct cm_volume {
osi_queue_t q; /* LRU queue; cm_volumeLock */
afs_uint32 magic;
***************
*** 31,41 ****
cm_cell_t *cellp; /* never changes */
char namep[VL_MAXNAMELEN]; /* name of the normal volume - assigned during allocation; */
/* by cm_volumeLock */
! struct cm_vol_state rw; /* by cm_volumeLock */
! struct cm_vol_state ro; /* by cm_volumeLock */
! struct cm_vol_state bk; /* by cm_volumeLock */
! osi_mutex_t mx;
! afs_uint32 flags; /* by mx */
afs_int32 refCount; /* by Interlocked operations */
time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;
--- 38,46 ----
cm_cell_t *cellp; /* never changes */
char namep[VL_MAXNAMELEN]; /* name of the normal volume - assigned during allocation; */
/* by cm_volumeLock */
! struct cm_vol_state vol[NUM_VOL_TYPES]; /* by cm_volumeLock */
! osi_rwlock_t rw;
! afs_uint32 flags; /* by rw */
afs_int32 refCount; /* by Interlocked operations */
time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;
***************
*** 43,48 ****
--- 48,54 ----
#define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */
#define CM_VOLUMEFLAG_IN_HASH 2
#define CM_VOLUMEFLAG_IN_LRU_QUEUE 4
+ #define CM_VOLUMEFLAG_UPDATING_VL 8
typedef struct cm_volumeRef {
***************
*** 126,130 ****
--- 132,142 ----
extern void cm_VolumeRenewROCallbacks(void);
+ extern cm_vol_state_t * cm_VolumeStateByType(cm_volume_t *volp, afs_uint32 type);
+
+ extern cm_vol_state_t * cm_VolumeStateByID(cm_volume_t *volp, afs_uint32 id);
+
+ extern cm_vol_state_t * cm_VolumeStateByName(cm_volume_t *volp, char *volname);
+
extern osi_rwlock_t cm_volumeLock;
#endif /* __CM_VOLUME_H_ENV__ */
Index: openafs/src/WINNT/aklog/aklog.c
diff -c openafs/src/WINNT/aklog/aklog.c:1.14.4.10 openafs/src/WINNT/aklog/aklog.c:1.14.4.13
*** openafs/src/WINNT/aklog/aklog.c:1.14.4.10 Fri Mar 21 20:20:24 2008
--- openafs/src/WINNT/aklog/aklog.c Sun Mar 30 12:21:07 2008
***************
*** 14,20 ****
*/
/*
! * Copyright (c) 2007 Secure Endpoints Inc.
*
* All rights reserved.
*
--- 14,20 ----
*/
/*
! * Copyright (c) 2007-2008 Secure Endpoints Inc.
*
* All rights reserved.
*
***************
*** 195,201 ****
static int usev5 = TRUE; /* use kerberos 5? */
static int use524 = FALSE; /* use krb524? */
static krb5_context context = 0;
! static krb5_ccache _krb425_ccache;
void akexit(int exit_code)
{
--- 195,201 ----
static int usev5 = TRUE; /* use kerberos 5? */
static int use524 = FALSE; /* use krb524? */
static krb5_context context = 0;
! static krb5_ccache _krb425_ccache = 0;
void akexit(int exit_code)
{
***************
*** 239,247 ****
static char confname[512] = { 0 };
char username_copy[BUFSIZ];
afs_int32 viceId; /* AFS uid of user */
- #ifdef ALLOW_REGISTER
- afs_int32 id;
- #endif /* ALLOW_REGISTER */
if (confname[0] == '\0') {
strncpy(confname, AFSDIR_CLIENT_ETC_DIRPATH, sizeof(confname));
--- 239,244 ----
***************
*** 297,303 ****
printf("doing first-time registration of %s "
"at %s\n", username, cell_to_use);
}
- id = 0;
strncpy(aclient->name, username, MAXKTCNAMELEN - 1);
aclient->name[MAXKTCNAMELEN - 1] = '\0';
strcpy(aclient->instance, "");
--- 294,299 ----
***************
*** 331,337 ****
/* copy the name because pr_CreateUser lowercases the realm */
strncpy(username_copy, username, BUFSIZ);
! *status = pr_CreateUser(username, &id);
/* and restore the name to the original state */
strncpy(username, username_copy, BUFSIZ);
--- 327,333 ----
/* copy the name because pr_CreateUser lowercases the realm */
strncpy(username_copy, username, BUFSIZ);
! *status = pr_CreateUser(username, &viceId);
/* and restore the name to the original state */
strncpy(username, username_copy, BUFSIZ);
***************
*** 611,623 ****
static int get_v5_user_realm(krb5_context context,char *realm)
{
static krb5_principal client_principal = 0;
int i;
! if (!_krb425_ccache)
! krb5_cc_default(context, &_krb425_ccache);
! if (!client_principal)
! krb5_cc_get_principal(context, _krb425_ccache, &client_principal);
!
i = krb5_princ_realm(context, client_principal)->length;
if (i < REALM_SZ-1) i = REALM_SZ-1;
strncpy(realm,krb5_princ_realm(context, client_principal)->data,i);
--- 607,625 ----
static int get_v5_user_realm(krb5_context context,char *realm)
{
static krb5_principal client_principal = 0;
+ krb5_error_code code;
int i;
! if (!_krb425_ccache) {
! code = krb5_cc_default(context, &_krb425_ccache);
! if (code)
! return(code);
! }
! if (!client_principal) {
! code = krb5_cc_get_principal(context, _krb425_ccache, &client_principal);
! if (code)
! return(code);
! }
i = krb5_princ_realm(context, client_principal)->length;
if (i < REALM_SZ-1) i = REALM_SZ-1;
strncpy(realm,krb5_princ_realm(context, client_principal)->data,i);
***************
*** 625,630 ****
--- 627,651 ----
return(KSUCCESS);
}
+ static void
+ copy_realm_of_ticket(krb5_context context, char * dest, size_t destlen, krb5_creds *v5cred) {
+ krb5_error_code code;
+ krb5_ticket *ticket;
+ size_t len;
+
+ code = krb5_decode_ticket(&v5cred->ticket, &ticket);
+ if (code == 0) {
+ len = krb5_princ_realm(context, ticket->server)->length;
+ if (len > destlen - 1)
+ len = destlen - 1;
+
+ strncpy(dest, krb5_princ_realm(context, ticket->server)->data, len);
+ dest[len] = '\0';
+
+ krb5_free_ticket(context, ticket);
+ }
+ }
+
/*
* Log to a cell. If the cell has already been logged to, return without
* doing anything. Otherwise, log to it and mark that it has been logged
***************
*** 702,707 ****
--- 723,734 ----
int retry = 1;
int realm_fallback = 0;
+ if ((status = get_v5_user_realm(context, realm_of_user)) != KSUCCESS) {
+ fprintf(stderr, "%s: Couldn't determine realm of user: %d\n",
+ progname, status);
+ return(AKLOG_KERBEROS);
+ }
+
if ( strchr(name,'.') != NULL ) {
fprintf(stderr, "%s: Can't support principal names including a dot.\n",
progname);
***************
*** 709,759 ****
}
try_v5:
! if (realm && realm[0])
! strcpy(realm_of_cell, realm);
! else
! strcpy(realm_of_cell,
! afs_realm_of_cell5(context, &ak_cellconfig, realm_fallback));
!
! if (dflag)
! printf("Getting v5 tickets: %s/%s@%s\n", name, instance, realm_of_cell);
! status = get_v5cred(context, name, instance, realm_of_cell,
#ifdef HAVE_KRB4
use524 ? &c : NULL,
#else
NULL,
#endif
&v5cred);
! if (status == 0 && strcmp(realm_of_cell, "") == 0) {
! krb5_error_code code;
! krb5_ticket *ticket;
!
! code = krb5_decode_ticket(&v5cred->ticket, &ticket);
!
! if (code != 0) {
! fprintf(stderr,
! "%s: Couldn't decode ticket to determine realm for "
! "cell %s.\n",
! progname, cell_to_use);
! } else {
! int len = krb5_princ_realm(context, ticket->server)->length;
! /* This really shouldn't happen. */
! if (len > REALM_SZ-1)
! len = REALM_SZ-1;
!
! strncpy(realm_of_cell, krb5_princ_realm(context, ticket->server)->data, len);
! realm_of_cell[len] = 0;
! krb5_free_ticket(context, ticket);
}
}
! if (status == KRB5_ERR_HOST_REALM_UNKNOWN) {
realm_fallback = 1;
goto try_v5;
} else if (status == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN) {
! if (!realm_of_cell[0]) {
realm_fallback = 1;
goto try_v5;
}
--- 736,796 ----
}
try_v5:
! if (realm && realm[0]) {
! if (dflag)
! printf("Getting v5 tickets: %s/%s@%s\n", name, instance, realm);
! status = get_v5cred(context, name, instance, realm,
#ifdef HAVE_KRB4
use524 ? &c : NULL,
#else
NULL,
#endif
&v5cred);
+ strcpy(realm_of_cell, realm);
+ } else {
+ strcpy(realm_of_cell,
+ afs_realm_of_cell5(context, &ak_cellconfig, realm_fallback));
! if (retry == 1 && realm_fallback == 0) {
! /* Only try the realm_of_user once */
! status = -1;
! if (dflag)
! printf("Getting v5 tickets: %s/%s@%s\n", name, instance, realm_of_user);
! status = get_v5cred(context, name, instance, realm_of_user,
! #ifdef HAVE_KRB4
! use524 ? &c : NULL,
! #else
! NULL,
! #endif
! &v5cred);
! if (status == 0) {
! /* we have determined that the client realm
! * is a valid cell realm
! */
! strcpy(realm_of_cell, realm_of_user);
! }
! }
! if (status != 0 && (!retry || retry && strcmp(realm_of_user,realm_of_cell))) {
! if (dflag)
! printf("Getting v5 tickets: %s/%s@%s\n", name, instance, realm_of_cell);
! status = get_v5cred(context, name, instance, realm_of_cell,
! #ifdef HAVE_KRB4
! use524 ? &c : NULL,
! #else
! NULL,
! #endif
! &v5cred);
! if (!status && !strlen(realm_of_cell))
! copy_realm_of_ticket(context, realm_of_cell, sizeof(realm_of_cell), v5cred);
}
}
! if (!realm_fallback && status == KRB5_ERR_HOST_REALM_UNKNOWN) {
realm_fallback = 1;
goto try_v5;
} else if (status == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN) {
! if (!realm_fallback && !realm_of_cell[0]) {
realm_fallback = 1;
goto try_v5;
}
***************
*** 766,772 ****
--- 803,812 ----
NULL,
#endif
&v5cred);
+ if (!status && !strlen(realm_of_cell))
+ copy_realm_of_ticket(context, realm_of_cell, sizeof(realm_of_cell), v5cred);
}
+
if ( status == KRB5KRB_AP_ERR_MSG_TYPE && retry ) {
retry = 0;
realm_fallback = 0;
***************
*** 890,902 ****
}
else
{
! if (usev5) {
! if((status = get_v5_user_realm(context, realm_of_user)) != KSUCCESS) {
! fprintf(stderr, "%s: Couldn't determine realm of user: %d\n",
! progname, status);
! return(AKLOG_KERBEROS);
! }
! } else {
#ifdef HAVE_KRB4
if ((status = krb_get_tf_realm(TKT_FILE, realm_of_user)) != KSUCCESS)
{
--- 930,936 ----
}
else
{
! if (!usev5) {
#ifdef HAVE_KRB4
if ((status = krb_get_tf_realm(TKT_FILE, realm_of_user)) != KSUCCESS)
{
***************
*** 909,920 ****
#endif
}
! /* For Khimaira we want to always append the realm to the name */
! if (1 /* strcmp(realm_of_user, realm_of_cell) */)
! {
! strcat(username, "@");
! strcat(username, realm_of_user);
! }
ViceIDToUsername(username, realm_of_user, realm_of_cell, cell_to_use,
#ifdef HAVE_KRB4
--- 943,951 ----
#endif
}
! /* For Network Identity Manager append the realm to the name */
! strcat(username, "@");
! strcat(username, realm_of_user);
ViceIDToUsername(username, realm_of_user, realm_of_cell, cell_to_use,
#ifdef HAVE_KRB4
***************
*** 1437,1449 ****
}
}
! if (usev5)
validate_krb5_availability();
! else
validate_krb4_availability();
- if(usev5)
- krb5_init_context(&context);
/* If nothing was given, log to the local cell. */
if ((cells.nelements + paths.nelements) == 0)
--- 1468,1480 ----
}
}
! if (usev5) {
validate_krb5_availability();
! if (krb5_init_context(&context))
! return(AKLOG_KERBEROS);
! } else
validate_krb4_availability();
/* If nothing was given, log to the local cell. */
if ((cells.nelements + paths.nelements) == 0)
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.29 openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.30
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.29 Sat Mar 8 20:09:30 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm Mon Apr 21 11:44:06 2008
***************
*** 57,63 ****
OpenAFS for Windows
! Version 1.5.34
--- 57,63 ----
OpenAFS for Windows
! Version 1.5.35
***************
*** 80,86 ****
·
OpenAFS for Windows 1.5.34
Release Notes
--- 80,86 ----
·
OpenAFS for Windows 1.5.35
Release Notes
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.29 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.30
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.29 Sat Mar 8 20:09:47 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm Mon Apr 21 11:44:11 2008
***************
*** 18,24 ****
.shape {behavior:url(#default#VML);}
!
OpenAFS for Windows 1.5.34 Release Notes
! OpenAFS for Windows 1.5.35 Release Notes
! OpenAFS for Windows 1.5.34 Release Notes
! OpenAFS for Windows 1.5.35 Release Notes
! OpenAFS for Windows 1.5.34
Release Notes
The Andrew File System (AFS) is a location-independent
--- 1282,1288 ----
!
OpenAFS for Windows 1.5.35
Release Notes
The Andrew File System (AFS) is a location-independent
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.30 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.31
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.30 Sat Mar 8 20:09:50 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm Mon Apr 21 11:44:12 2008
***************
*** 11,17 ****
!
OpenAFS for Windows 1.5.34 Table of Contents