chas williams - CONTRACTOR wrote:

it looks like ENODEV being returned from afs_lookup() is causing the grief.



the attached patch gets getcwd "working".  its not clear to me yet what
is happening but it looks like when you have a bad mount, lookuppnvp()--
used by getcwd()--gets an error from VOP_LOOKUP() and fails.

Yes that is what I am seeing EvalMountPoint is returning ENODEV.

I too have been working on a similiar patch today which appears to
fix this problem. "ls" still shows the entry, but now "ls -l" does not.
Before it showed ./badmp: nodev

Why did you change the afs_AccessOK to READ.


This really apears to be a Solaris bug, as Solaris 9 did not have a problem.



--- ,afs_vnop_lookup.c  Mon Jul 11 14:29:59 2005
+++ afs_vnop_lookup.c   Wed Aug  3 13:48:32 2005
@@ -1434,6 +1434,14 @@
                ReleaseWriteLock(&tvc->lock);

                if (code) {
+#if defined(AFS_SUN510_ENV)
+                       /* reset code and volumeError so afs_CheckCode will not 
change to ENODEV */
+                       /* Solaris 10 dogetcwd chokes on ENODEV, but not ENOENT 
*/
+                       if (code == ENODEV && treq.volumeError == VOLMISSING ) {
+                               treq.volumeError = 0;
+                               code = ENOENT;
+                       }
+#endif
                    afs_PutVCache(tvc);
                    if (tvolp)
                        afs_PutVolume(tvolp, WRITE_LOCK);




        /*
         * Perform a lookup in the current directory.
         */
        error = VOP_LOOKUP(vp, component, &tvp, pnp, lookup_flags,
                rootvp, cr);
        cvp = tvp;
        if (error) {
                cvp = NULL;
                /*
                 * On error, return hard error if
                 * (a) we're not at the end of the pathname yet, or
                 * (b) the caller didn't want the parent directory, or
                 * (c) we failed for some reason other than a missing entry.
                 */
                if (pn_pathleft(pnp) || dirvpp == NULL || error != ENOENT)
                        goto bad;

its seems that getcwd moved into the kernel in solaris10.  in earlier
versions getcwd seemed to be in a userspace library.

Index: src/afs/VNOPS/afs_vnop_lookup.c
===================================================================
RCS file: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v
retrieving revision 1.50.2.6
diff -u -u -r1.50.2.6 afs_vnop_lookup.c
--- src/afs/VNOPS/afs_vnop_lookup.c     31 Jan 2005 03:49:15 -0000      1.50.2.6
+++ src/afs/VNOPS/afs_vnop_lookup.c     3 Aug 2005 18:00:41 -0000
@@ -1198,7 +1198,7 @@
/* Check for read access as well. We need read access in order to
      * stat files, but not to stat subdirectories. */
-    if (!afs_AccessOK(adp, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS))
+    if (!afs_AccessOK(adp, PRSFS_READ, &treq, CHECK_MODE_BITS))
        no_read_access = 1;
/* special case lookup of ".". Can we check for it sooner in this code,
@@ -1578,5 +1578,9 @@
     }
afs_PutFakeStat(&fakestate);
+if (code == ENODEV) {
+       printf("afs_lookup() would have return ENODEV; returning ENOENT\n");
+       code = ENOENT;
+}
     return code;
 }




--

 Douglas E. Engert  <[EMAIL PROTECTED]>
 Argonne National Laboratory
 9700 South Cass Avenue
 Argonne, Illinois  60439
 (630) 252-5444
_______________________________________________
OpenAFS-info mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-info

Reply via email to