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;