(Illustration by Gaich Muramatsu)
>> 'The volume for "testserver.coda.cs.cmu.edu" cannot be found, insert
>> the volume for "testserver.coda.cs.cmu.edu" and wait for it to appear
>> on the desktop, then try again'
>>
>> Can anyone explain what happens behind the scene here, or give me a
>> pointer to some documents.
>
> See http://developer.apple.com/qa/qa2004/qa1351.html
That seems to be it. I have now a working version, but need to clean up it more before I know what was the real problem.
However, here are some initial diffs:
Index: coda_vnops.c
--- coda_vnops.c 13 Jun 2004 09:42:42 -0000 1.14
+++ coda_vnops.c 3 Aug 2004 14:23:22 -0000
@@ -841,6 +841,7 @@
}
error = venus_getattr(vtomi(vp), &cp->c_fid, cred, THREAD2PROC,
vap);
if (!error) {
CODADEBUG(CODA_GETATTR, myprintf(("getattr miss %s vp=%p: result
%d\n",
Index: coda_vfsops.c
--- coda_vfsops.c 13 Jun 2004 07:10:55 -0000 1.10 +++ coda_vfsops.c 3 Aug 2004 14:21:14 -0000 @@ -104,10 +104,13 @@ return 0;
+static int coda_mount_type;
+
int
-coda_init(struct vfsconf * vfsconf)
+coda_init(struct vfsconf *vfsp)
{
ENTRY;
+ coda_mount_type = vfsp->vfc_typenum;
LEAVE;
return 0;
struct vnode *dvp;
struct cnode *cp;
dev_t dev;
struct coda_mntinfo *mi;
struct vnode *rootvp;
@@ -145,6 +150,12 @@
LEAVE;
return(EBUSY);
}
+
+ /* Get mount point name */
+ error = copyinstr(path, path_buf, MNAMELEN-1, &len);
+ if (error)
+ return(error);
/* Validate mount device. Similar to getmdev(). */
NDINIT(ndp, LOOKUP, FOLLOW, UIO_USERSPACE, data, td);
@@ -212,12 +222,11 @@
* to coda_root in case a server is down while venus is starting.
*/
cp = make_coda_node(&rootfid, vfsp, VDIR);
- if(cp==0)
LEAVE;
return ENOMEM;
}
- SET_CNODE_NAME("/coda");
+ SET_CNODE_NAME(path_buf);
rootvp = CTOV(cp);
rootvp->v_vflag |= VV_ROOT;
@@ -250,14 +259,15 @@
/* Checked UFS. iosize is set as 8192 */
vfsp->mnt_stat.f_iosize = 8192;
+ memcpy(vfsp->mnt_stat.f_mntonname, path_buf, MNAMELEN);
+ memcpy(vfsp->mnt_stat.f_mntfromname, "CODA", MNAMELEN);
+
/* error is currently guaranteed to be zero, but in case some
code changes... */
- CODADEBUG(1,
- myprintf(("coda_mount returned %d\n",error)););
+ CODADEBUG(1, myprintf(("coda_mount returned %d\n", error)););
if (error)
MARK_INT_FAIL(CODA_MOUNT_STATS);
MARK_INT_SAT(CODA_MOUNT_STATS);
coda_instances++;
}
@@ -478,7 +488,12 @@
return(EINVAL);
}
+#if 0
bzero(sbp, sizeof(struct statfs));
+#else
+ sbp->f_type = coda_mount_type;
/* XXX - what to do about f_flags, others? --bnoble */
/* Below This is what AFS does
#define NB_SFS_SIZ 0x895440
@@ -490,17 +505,16 @@
sbp->f_blocks = NB_SFS_SIZ;
sbp->f_bfree = NB_SFS_SIZ;
sbp->f_bavail = NB_SFS_SIZ;
- sbp->f_files = NB_SFS_SIZ;
- sbp->f_ffree = NB_SFS_SIZ;
- if (sbp != &vfsp->mnt_stat)
- {
- memcpy((caddr_t) & sbp->f_mntonname[0], (caddr_t)
vfsp->mnt_stat.f_mntonname, MNAMELEN);
- memcpy((caddr_t) & sbp->f_mntfromname[0], (caddr_t)
vfsp->mnt_stat.f_mntfromname, MNAMELEN);
- }
- else
- {
- snprintf(sbp->f_mntonname, sizeof(sbp->f_mntonname), "/coda");
- snprintf(sbp->f_mntfromname, sizeof(sbp->f_mntfromname), "CODA");
+ sbp->f_files = 0;
+ sbp->f_ffree = 0;
+ if (sbp != &vfsp->mnt_stat) {
+ memcpy(sbp->f_mntonname, vfsp->mnt_stat.f_mntonname, MNAMELEN);
+ memcpy(sbp->f_mntfromname, vfsp->mnt_stat.f_mntfromname,
MNAMELEN);
+ } else {
+#if 0
+ snprintf(sbp->f_mntonname, sizeof(sbp->f_mntonname),
"/Volumes/coda"); /* XXX */
+ snprintf(sbp->f_mntfromname, sizeof(sbp->f_mntfromname), "CODA");
+#endif
}
sbp->f_type = vfsp->mnt_vfc->vfc_typenum;
snprintf(sbp->f_fstypename, sizeof(sbp->f_fstypename), "coda");
_______________________________________________
Darwincoda mailing list