| [848] | 1 | Index: osi_vnodeops.c | 
|---|
|  | 2 | =================================================================== | 
|---|
|  | 3 | RCS file: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v | 
|---|
|  | 4 | retrieving revision 1.81.2.68 | 
|---|
|  | 5 | diff -u -r1.81.2.68 osi_vnodeops.c | 
|---|
|  | 6 | --- src/afs/LINUX/osi_vnodeops.c        7 Oct 2008 03:41:15 -0000       1.81.2.68 | 
|---|
|  | 7 | +++ src/afs/LINUX/osi_vnodeops.c        7 Oct 2008 16:51:47 -0000 | 
|---|
|  | 8 | @@ -789,11 +789,13 @@ | 
|---|
|  | 9 | cred_t *credp = NULL; | 
|---|
|  | 10 | struct vcache *vcp, *pvcp, *tvc = NULL; | 
|---|
|  | 11 | int valid; | 
|---|
|  | 12 | +    struct afs_fakestat_state fakestate; | 
|---|
|  | 13 |  | 
|---|
|  | 14 | #ifdef AFS_LINUX24_ENV | 
|---|
|  | 15 | lock_kernel(); | 
|---|
|  | 16 | #endif | 
|---|
|  | 17 | AFS_GLOCK(); | 
|---|
|  | 18 | +    afs_InitFakeStat(&fakestate); | 
|---|
|  | 19 |  | 
|---|
|  | 20 | if (dp->d_inode) { | 
|---|
|  | 21 |  | 
|---|
|  | 22 | @@ -805,8 +807,28 @@ | 
|---|
|  | 23 |  | 
|---|
|  | 24 | if (vcp->mvstat == 1) {         /* mount point */ | 
|---|
|  | 25 | if (vcp->mvid && (vcp->states & CMValid)) { | 
|---|
|  | 26 | -               /* a mount point, not yet replaced by its directory */ | 
|---|
|  | 27 | -               goto bad_dentry; | 
|---|
|  | 28 | +               int tryEvalOnly = 0; | 
|---|
|  | 29 | +               int code = 0; | 
|---|
|  | 30 | +               struct vrequest treq; | 
|---|
|  | 31 | + | 
|---|
|  | 32 | +               credp = crref(); | 
|---|
|  | 33 | +               code = afs_InitReq(&treq, credp); | 
|---|
|  | 34 | +               if ( | 
|---|
|  | 35 | +#ifdef AFS_DARWIN_ENV | 
|---|
|  | 36 | +                   (strcmp(dp->d_name.name, ".DS_Store") == 0) || | 
|---|
|  | 37 | +                   (strcmp(dp->d_name.name, "Contents") == 0) || | 
|---|
|  | 38 | +#endif | 
|---|
|  | 39 | +                   (strcmp(dp->d_name.name, ".directory") == 0)) { | 
|---|
|  | 40 | +                   tryEvalOnly = 1; | 
|---|
|  | 41 | +               } | 
|---|
|  | 42 | +               if (tryEvalOnly) | 
|---|
|  | 43 | +                   code = afs_TryEvalFakeStat(&vcp, &fakestate, &treq); | 
|---|
|  | 44 | +               else | 
|---|
|  | 45 | +                   code = afs_EvalFakeStat(&vcp, &fakestate, &treq); | 
|---|
|  | 46 | +               if ((tryEvalOnly && vcp->mvstat == 1) || code) { | 
|---|
|  | 47 | +                   /* a mount point, not yet replaced by its directory */ | 
|---|
|  | 48 | +                   goto bad_dentry; | 
|---|
|  | 49 | +               } | 
|---|
|  | 50 | } | 
|---|
|  | 51 | } else | 
|---|
|  | 52 | if (*dp->d_name.name != '/' && vcp->mvstat == 2) /* root vnode */ | 
|---|
|  | 53 | @@ -870,6 +892,7 @@ | 
|---|
|  | 54 | /* Clean up */ | 
|---|
|  | 55 | if (tvc) | 
|---|
|  | 56 | afs_PutVCache(tvc); | 
|---|
|  | 57 | +    afs_PutFakeStat(&fakestate); | 
|---|
|  | 58 | AFS_GUNLOCK(); | 
|---|
|  | 59 | if (credp) | 
|---|
|  | 60 | crfree(credp); | 
|---|
|  | 61 | @@ -884,7 +907,10 @@ | 
|---|
|  | 62 | return valid; | 
|---|
|  | 63 |  | 
|---|
|  | 64 | bad_dentry: | 
|---|
|  | 65 | -    valid = 0; | 
|---|
|  | 66 | +    if (have_submounts(dp)) | 
|---|
|  | 67 | +       valid = 1; | 
|---|
|  | 68 | +    else | 
|---|
|  | 69 | +       valid = 0; | 
|---|
|  | 70 | goto done; | 
|---|
|  | 71 | } | 
|---|
|  | 72 |  | 
|---|