From bfb119fd6e37e14ee9c6ec3d897a3c1baf2d526a Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 19 Mar 2008 20:18:37 +0000 Subject: [PATCH] DEVEL15-windows-volume-dotdotFid-20080319 LICENSE MIT The volume dotdotFid field should have moved into the cm_volstate_t object as there can be different parents for rw, ro, and bk volumes. (cherry picked from commit d24b177765f2955a7c54ecdc33744ecee069f25e) --- src/WINNT/afsd/cm_memmap.h | 2 +- src/WINNT/afsd/cm_scache.c | 16 ++++++++++------ src/WINNT/afsd/cm_vnodeops.c | 26 +++++++++++++------------- src/WINNT/afsd/cm_volume.c | 19 +++++++------------ src/WINNT/afsd/cm_volume.h | 4 ++-- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/WINNT/afsd/cm_memmap.h b/src/WINNT/afsd/cm_memmap.h index ad357857d..ba0963d2d 100644 --- a/src/WINNT/afsd/cm_memmap.h +++ b/src/WINNT/afsd/cm_memmap.h @@ -10,7 +10,7 @@ #ifndef CM_MEMMAP_H #define CM_MEMMAP_H 1 -#define CM_CONFIG_DATA_VERSION 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 { diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 8014ffd25..9642c8a73 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -834,14 +834,18 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, * to copy the dotdotFipd from the volume structure where the * "master" copy is stored (defect 11489) */ - if (scp->fid.vnode == 1 && scp->fid.unique == 1) { - scp->dotdotFid = volp->dotdotFid; - } - - if (volp->ro.ID == fidp->volume) + if (volp->ro.ID == fidp->volume) { scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); - else if (volp->bk.ID == fidp->volume) + 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) cm_PutVolume(volp); diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index ccf320c37..6746c1c60 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1111,16 +1111,6 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, if (code == 0) { afs_uint32 cell, volume; - /* save the parent of the volume root for this is the - * place where the volume is mounted and we must remember - * this in the volume structure rather than just in the - * scache entry lest the scache entry gets recycled - * (defect 11489) - */ - lock_ObtainMutex(&volp->mx); - volp->dotdotFid = dscp->fid; - lock_ReleaseMutex(&volp->mx); - cell = cellp->cellID; /* if the mt pt originates in a .backup volume (not a .readonly) @@ -1145,12 +1135,22 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp, volp->ro.ID != 0) { targetType = ROVOL; } - if (targetType == ROVOL) + if (targetType == ROVOL) { volume = volp->ro.ID; - else if (targetType == BACKVOL) + lock_ObtainMutex(&volp->mx); + volp->ro.dotdotFid = dscp->fid; + lock_ReleaseMutex(&volp->mx); + } else if (targetType == BACKVOL) { volume = volp->bk.ID; - else + 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); diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 22ba9575b..7e30ec94c 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -550,11 +550,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown); volp->rw.ID = volp->ro.ID = volp->bk.ID = 0; - volp->dotdotFid.cell = 0; - volp->dotdotFid.volume = 0; - volp->dotdotFid.unique = 0; - volp->dotdotFid.vnode = 0; - volp->dotdotFid.hash = 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; @@ -814,11 +812,9 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep, cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_unknown); volp->rw.ID = volp->ro.ID = volp->bk.ID = 0; - volp->dotdotFid.cell = 0; - volp->dotdotFid.volume = 0; - volp->dotdotFid.unique = 0; - volp->dotdotFid.vnode = 0; - volp->dotdotFid.hash = 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)); @@ -1354,9 +1350,8 @@ int cm_DumpVolumes(FILE *outputFile, char *cookie, int lock) 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 dotdotFid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u\r\n", + 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->dotdotFid.cell, volp->dotdotFid.volume, volp->dotdotFid.vnode, volp->dotdotFid.unique, volp->refCount); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index 40a2e8e8c..cb8bdd670 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -15,8 +15,9 @@ #define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24) typedef struct cm_vol_state { - afs_uint32 ID; /* by mx */ struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */ + afs_uint32 ID; /* by mx */ + struct cm_fid dotdotFid; /* parent of volume root */ cm_serverRef_t *serversp; /* by mx */ enum volstatus state; /* by mx */ afs_uint32 flags; /* by mx */ @@ -33,7 +34,6 @@ typedef struct cm_volume { struct cm_vol_state rw; /* by cm_volumeLock */ struct cm_vol_state ro; /* by cm_volumeLock */ struct cm_vol_state bk; /* by cm_volumeLock */ - struct cm_fid dotdotFid; /* parent of volume root */ osi_mutex_t mx; afs_uint32 flags; /* by mx */ afs_int32 refCount; /* by Interlocked operations */ -- 2.39.5