Matt Fredette and myself of the BBN Technologies Internetwork Research
department have Coda 5.0.1 working with a FreeBSD/i386 2.2.6 server
and clients on FreeBSD/i386 2.2.6 and NetBSD/sparc 1.3.3.
Comments/kudos about the NetBSD/sparc issues should go to Matt.

I am attaching a patch file which

* adds NetBSD/sparc support to process.s
* fixes configure (I know this should be configure.in, sorry) to
  realize that NetBSD does not imply i386 
* fixes a few other NetBSD/sparc nits
* adds the case sensitivity stuff to the netbsd and freebsd kernel
  sources, and perhaps some other stuff from newer kernels (append bit?)
* makes venus not barf on the lack of version ioctl, since the
  provided sources for FreeBSD 2.2 and NetBSD 1.3 don't have this
  ioctl.  I suspect the ifdef tests the wrong thing, but I don't know
  the right answer.

With the below patches, things seem to mostly work fine.  Our only
problem is that a directory with lots of files (2400ish - a mirror of
RFCs) doesn't list correctly, even though the files are there.

fnord gdt 141 /coda/project/rfc/ftp.normos.org/ietf/rfc > ls|wc
     204     204    2396

Running a shell loop that runs 'md5' on rfc$i.txt for i=1 to 2400
seems to do the right thing.

Then:

fnord > cfs lc |grep ftp.normos.org/ietf/rfc|wc
    2005    2023   79533

So it appears that the venus->kernel path for directories is broken
somehow.
"Upgrading" to FreeBSD 3 is not an option.  Are there fixes for this
in the newer kernels we need to pull back?

I should point out that this is with a server with a few errors in its
log, whose server data files are from 4.6.5, but which is now running
5.0.1.

I had the same problem with a 4.7.4 venus and a 4.6.5 server, and
wrote it off to version incompatibility at the time.


        Greg Troxel <[EMAIL PROTECTED]>
diff -c coda/coda-src/venus/fso_cfscalls2.cc:1.1.1.3 
coda/coda-src/venus/fso_cfscalls2.cc:1.4
*** coda/coda-src/venus/fso_cfscalls2.cc:1.1.1.3        Thu Jan 28 18:23:01 1999
--- coda/coda-src/venus/fso_cfscalls2.cc        Thu Jan 28 18:43:51 1999
***************
*** 461,466 ****
--- 461,474 ----
  static char cputype [] = "arm32";
  static char systype [] = "arm32_nbsd1";
  #endif
+ #ifdef sparc
+ static char cputype [] = "sparc";
+ static char systype [] = "sparc_nbsd1";
+ #endif
+ #ifdef sun3
+ static char cputype [] = "sun3";
+ static char systype [] = "sun3_nbsd1";
+ #endif
  #endif /* __NetBSD__ */
  
  #ifdef __FreeBSD__
diff -c coda/coda-src/venus/worker.cc:1.1.1.3 coda/coda-src/venus/worker.cc:1.4
*** coda/coda-src/venus/worker.cc:1.1.1.3       Thu Jan 28 18:23:22 1999
--- coda/coda-src/venus/worker.cc       Wed Feb 10 16:48:23 1999
***************
*** 521,527 ****
          eprint("WorkerInit: worker::muxfd >= %d!", NFDS);
          exit(-1);
      }
! #ifdef  __BSD44__
      if (::ioctl(worker::muxfd, CIOC_KERNEL_VERSION, &kernel_version) < 0 ) {
          eprint("WorkerInit errno %d: Version IOCTL FAILED!  Get a newer Kernel!"
  , errno);
--- 521,527 ----
          eprint("WorkerInit: worker::muxfd >= %d!", NFDS);
          exit(-1);
      }
! #ifdef  notdef
      if (::ioctl(worker::muxfd, CIOC_KERNEL_VERSION, &kernel_version) < 0 ) {
          eprint("WorkerInit errno %d: Version IOCTL FAILED!  Get a newer Kernel!"
  , errno);
diff -c coda/configs/codaconf.m4:1.1.1.2 coda/configs/codaconf.m4:1.2
*** coda/configs/codaconf.m4:1.1.1.2    Thu Oct  8 11:20:05 1998
--- coda/configs/codaconf.m4    Thu Jan 28 16:32:56 1999
***************
*** 26,32 ****
  
        *-*-netbsd* )
                shortsys=nbsd
!               sys=i386_nbsd1
                vfsdir=bsd44
                os=`uname -r`
                initsuffix=../etc
--- 26,36 ----
  
        *-*-netbsd* )
                shortsys=nbsd
!               sys=nbsd
!               case ${host_cpu} in
!                       i*6 )   arch=i386 ;;
!                       sparc ) arch=sparc ;;
!               esac
                vfsdir=bsd44
                os=`uname -r`
                initsuffix=../etc
diff -c coda/configure:1.1.1.2 coda/configure:1.2
*** coda/configure:1.1.1.2      Thu Oct  8 11:19:31 1998
--- coda/configure      Thu Jan 28 16:31:21 1999
***************
*** 1356,1362 ****
  
        *-*-netbsd* )
                shortsys=nbsd
!               sys=i386_nbsd1
                vfsdir=bsd44
                os=`uname -r`
                initsuffix=../etc
--- 1356,1366 ----
  
        *-*-netbsd* )
                shortsys=nbsd
!               sys=nbsd
!               case ${host_cpu} in
!                       i*6 )   arch=i386 ;;
!                       sparc ) arch=sparc ;;
!               esac
                vfsdir=bsd44
                os=`uname -r`
                initsuffix=../etc
diff -c coda/kernel-src/vfs/freebsd/cfs/cfs_venus.c:1.1.1.2 
coda/kernel-src/vfs/freebsd/cfs/cfs_venus.c:1.2
*** coda/kernel-src/vfs/freebsd/cfs/cfs_venus.c:1.1.1.2 Tue Sep 15 13:25:47 1998
--- coda/kernel-src/vfs/freebsd/cfs/cfs_venus.c Thu Feb 11 08:04:04 1999
***************
*** 409,414 ****
--- 409,415 ----
      /* send the open to venus. */
      INIT_IN(&inp->ih, CFS_LOOKUP, cred, p);
      inp->VFid = *fid;
+     inp->flags = CLU_CASE_SENSITIVE;
  
      inp->name = Isize;
      STRCPY(name, nm, len);            /* increments Isize */
diff -c coda/kernel-src/vfs/freebsd/cfs/coda.h:1.1.1.2 
coda/kernel-src/vfs/freebsd/cfs/coda.h:1.2
*** coda/kernel-src/vfs/freebsd/cfs/coda.h:1.1.1.2      Tue Sep 15 13:25:48 1998
--- coda/kernel-src/vfs/freebsd/cfs/coda.h      Thu Feb 11 08:04:04 1999
***************
*** 78,89 ****
--- 78,91 ----
  #define       C_O_WRITE       0x002
  #define C_O_TRUNC       0x010
  #define C_O_EXCL      0x100
+ #define C_O_CREAT     0x200
  
  /* these are to find mode bits in Venus */ 
  #define C_M_READ  00400
  #define C_M_WRITE 00200
  
  /* for access Venus will use */
+ #define C_A_C_OK    8               /* Test for writing upon create.  */
  #define C_A_R_OK    4               /* Test for read permission.  */
  #define C_A_W_OK    2               /* Test for write permission.  */
  #define C_A_X_OK    1               /* Test for execute permission.  */
***************
*** 350,360 ****
--- 352,367 ----
      struct cfs_out_hdr out;
  };
  
+ /* lookup flags */
+ #define CLU_CASE_SENSITIVE    0x01
+ #define CLU_CASE_INSENSITIVE  0x02
+ 
  /* cfs_lookup: */
  struct  cfs_lookup_in {
      struct cfs_in_hdr ih;
      ViceFid   VFid;
      int         name;         /* Place holder for data. */
+     int               flags;
  };
  
  struct cfs_lookup_out {
diff -c coda/kernel-src/vfs/netbsd/cfs/cfs_venus.c:1.1.1.2 
coda/kernel-src/vfs/netbsd/cfs/cfs_venus.c:1.2
*** coda/kernel-src/vfs/netbsd/cfs/cfs_venus.c:1.1.1.2  Tue Sep 15 13:25:53 1998
--- coda/kernel-src/vfs/netbsd/cfs/cfs_venus.c  Wed Feb 10 17:24:50 1999
***************
*** 409,414 ****
--- 409,415 ----
      /* send the open to venus. */
      INIT_IN(&inp->ih, CFS_LOOKUP, cred, p);
      inp->VFid = *fid;
+     inp->flags = CLU_CASE_SENSITIVE;
  
      inp->name = Isize;
      STRCPY(name, nm, len);            /* increments Isize */
diff -c coda/kernel-src/vfs/netbsd/cfs/coda.h:1.1.1.2 
coda/kernel-src/vfs/netbsd/cfs/coda.h:1.2
*** coda/kernel-src/vfs/netbsd/cfs/coda.h:1.1.1.2       Tue Sep 15 13:25:53 1998
--- coda/kernel-src/vfs/netbsd/cfs/coda.h       Wed Feb 10 17:21:04 1999
***************
*** 78,89 ****
--- 78,91 ----
  #define       C_O_WRITE       0x002
  #define C_O_TRUNC       0x010
  #define C_O_EXCL      0x100
+ #define C_O_CREAT     0x200
  
  /* these are to find mode bits in Venus */ 
  #define C_M_READ  00400
  #define C_M_WRITE 00200
  
  /* for access Venus will use */
+ #define C_A_C_OK    8               /* Test for writing upon create.  */
  #define C_A_R_OK    4               /* Test for read permission.  */
  #define C_A_W_OK    2               /* Test for write permission.  */
  #define C_A_X_OK    1               /* Test for execute permission.  */
***************
*** 350,360 ****
--- 352,367 ----
      struct cfs_out_hdr out;
  };
  
+ /* lookup flags */
+ #define CLU_CASE_SENSITIVE    0x01
+ #define CLU_CASE_INSENSITIVE  0x02
+ 
  /* cfs_lookup: */
  struct  cfs_lookup_in {
      struct cfs_in_hdr ih;
      ViceFid   VFid;
      int         name;         /* Place holder for data. */
+     int               flags;
  };
  
  struct cfs_lookup_out {
diff -c coda/lib-src/mlwp/process.s:1.1.1.3 coda/lib-src/mlwp/process.s:1.4
*** coda/lib-src/mlwp/process.s:1.1.1.3 Thu Jan 28 18:25:17 1999
--- coda/lib-src/mlwp/process.s Thu Jan 28 18:44:02 1999
***************
*** 122,137 ****
  #endif sun3
  
  #if defined(sun4) || defined(sparc)
! #ifdef __linux__
  /* This info from Miguel de Icaza (and SunOS header files/libc) */
  #define STACK_ALIGN 8
  #define WINDOWSIZE (4*16)
  #define ARGPUSHSIZE (6*4)
  #define MINFRAME  (WINDOWSIZE+ARGPUSHSIZE+4) /* min frame */
  #define SA(X)     (((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))
  #define NAME(x) x
  #define ENTRY(x) .type x,@function; .global x; x:
  #include <asm/traps.h>
  #else
  #include <sun4/asm_linkage.h>
  #include <sun4/trap.h>
--- 122,144 ----
  #endif sun3
  
  #if defined(sun4) || defined(sparc)
! #if defined(__linux__) || defined(__NetBSD__)
  /* This info from Miguel de Icaza (and SunOS header files/libc) */
  #define STACK_ALIGN 8
  #define WINDOWSIZE (4*16)
  #define ARGPUSHSIZE (6*4)
  #define MINFRAME  (WINDOWSIZE+ARGPUSHSIZE+4) /* min frame */
  #define SA(X)     (((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))
+ #ifdef __linux__
  #define NAME(x) x
  #define ENTRY(x) .type x,@function; .global x; x:
  #include <asm/traps.h>
+ #else  /* __NetBSD__ */
+ #include <machine/asm.h>
+ #include <machine/trap.h>
+ #define NAME(x) _C_LABEL(x)
+ #define ST_FLUSH_WINDOWS T_FLUSHWIN
+ #endif /* __NetBSD__ */
  #else
  #include <sun4/asm_linkage.h>
  #include <sun4/trap.h>
***************
*** 157,164 ****
        tst     %i2
        be      1f
        st      %sp, [%i1]
!       and     %i2, -STACK_ALIGN, %sp
!       sub     %sp, SA(MINFRAME), %sp
  1:
        call    .ptr_call, 0
        mov     %i0, %g1
--- 164,171 ----
        tst     %i2
        be      1f
        st      %sp, [%i1]
!       and     %i2, -STACK_ALIGN, %o0
!       sub     %o0, SA(MINFRAME), %sp
  1:
        call    .ptr_call, 0
        mov     %i0, %g1
***************
*** 174,181 ****
--- 181,192 ----
        retl
        restore
  
+ #if defined(__linux__) || defined(__NetBSD__)
  #ifdef __linux__
  ENTRY(.ptr_call)
+ #else  /* __NetBSD__ */
+ ASENTRY(.ptr_call)
+ #endif /* __NetBSD__ */
        jmp %g1
        nop
  #endif

Reply via email to