[OpenAFS-port-freebsd] Making more progress....

Kenny Freeman kennyf@pchg.net
Thu, 9 Oct 2003 19:14:20 -0400


--Boundary-02=_Tveh/Hmdb4VvG5z
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Description: signed data
Content-Disposition: inline

I take it that this requires a current system. Seems to me that your patch=
=20
doesn't work on a 5.1-RELEASE p10 system. I get an error about src/config/
afsconfig.h not existing near the end of the ./configure run. I don't have=
=20
ssh access to that box yet so I can't post the configure output :/

=2DKenny

On October 8, 2003 01:40 am, Garrett Wollman wrote:
> Updated patch available at
> <http://lcs.mit.edu/~wollman/openafs-fbsd52.patch>.  Changes in this
> version:
>
> - Doesn't crash when doing heavy recycling (e.g., listing
> /afs/sipb.mit.edu/users with a small cache).
>
> - I've rebroken shutdown (will investigate when I am sufficiently
> awake again).
>
> - Redundant vop_lock family routines eliminated (the standard ones are
> just fine for our purposes).
>
> - Includes correct fix for vop_symlink.
>
> - Includes preliminary autoconf glue to test for POSIX regex(3),
> eliminating need for libcompat.  (Same change should be made for
> OpenBSD.)  Jim Rees, feel free to commit these parts.
>
> -GAWollman
>
> (Patch included below for ease of review/commentary....)
>
> Index: acinclude.m4
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/acinclude.m4,v
> retrieving revision 1.90
> diff -u -r1.90 acinclude.m4
> --- acinclude.m4	25 Sep 2003 16:26:10 -0000	1.90
> +++ acinclude.m4	8 Oct 2003 05:09:20 -0000
> @@ -806,7 +806,7 @@
>  AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h
> sys/fstyp.h) AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h)
>  AC_CHECK_HEADERS(windows.h malloc.h winsock2.h direct.h io.h)
> -AC_CHECK_HEADERS(security/pam_modules.h siad.h usersec.h ucontext.h)
> +AC_CHECK_HEADERS(security/pam_modules.h siad.h usersec.h ucontext.h
> regex.h)
>
>  if test "$ac_cv_header_security_pam_modules_h" =3D "yes"; then
>  	HAVE_PAM=3D"yes"
> @@ -817,6 +817,19 @@
>
>  AC_CHECK_FUNCS(utimes random srandom getdtablesize snprintf strlcat
> strlcpy re_comp re_exec) AC_CHECK_FUNCS(setprogname getprogname sigaction
> mkstemp vsnprintf strerror) +
> +AC_CHECK_FUNCS(regcomp regexec regerror)
> +AC_MSG_CHECKING([if you have the complete POSIX regex library])
> +if test "$ac_cv_header_regex_h" =3D "yes" && \
> +	test "$ac_cv_func_regcomp" =3D "yes" && \
> +	test "$ac_cv_func_regexec" =3D "yes" && \
> +	test "$ac_cv_func_regerror" =3D "yes"; then
> +    AC_DEFINE(HAVE_POSIX_REGEX)
> +    AC_MSG_RESULT(yes)
> +else
> +    AC_MSG_RESULT(no)
> +fi
> +
>  AC_CHECK_TYPE(ssize_t, int)
>  AC_SIZEOF_TYPE(long)
>
> Index: src/afs/afs.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs.h,v
> retrieving revision 1.42
> diff -u -r1.42 afs.h
> --- src/afs/afs.h	29 Aug 2003 22:00:04 -0000	1.42
> +++ src/afs/afs.h	8 Oct 2003 05:09:34 -0000
> @@ -545,15 +545,11 @@
>  #define VPageCleaning 0x2	/* Solaris - Cache Trunc Daemon sez keep out */
>
>  #define	CPSIZE	    2
> -#if defined(AFS_FBSD_ENV)
> -#define vrefCount   v.v_usecount
> -#else
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>  #define vrefCount   v->v_usecount
>  #else
>  #define vrefCount   v.v_count
> -#endif /* AFS_OBSD_ENV */
> -#endif /* AFS_FBSD_ENV */
> +#endif /* AFS_[OF]BSD_ENV */
>
>  #ifdef AFS_LINUX24_ENV
>  #define VREFCOUNT(v)		atomic_read(&((vnode_t *) v)->v_count)
> @@ -598,7 +594,7 @@
>  extern afs_uint32 afs_stampValue;	/* stamp for pair's usage */
>  #define	MakeStamp()	(++afs_stampValue)
>
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>  #define VTOAFS(v) ((struct vcache *)(v)->v_data)
>  #define AFSTOV(vc) ((vc)->v)
>  #else
> @@ -616,7 +612,7 @@
>   * !(avc->nextfree) && !avc->vlruq.next =3D> (FreeVCList =3D=3D avc->nex=
tfree)
>   */
>  struct vcache {
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>      struct vnode *v;
>  #else
>      struct vnode v;		/* Has reference count in v.v_count */
> Index: src/afs/afs_call.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_call.c,v
> retrieving revision 1.62
> diff -u -r1.62 afs_call.c
> --- src/afs/afs_call.c	8 Aug 2003 21:54:34 -0000	1.62
> +++ src/afs/afs_call.c	8 Oct 2003 05:09:36 -0000
> @@ -64,13 +64,12 @@
>  struct lock__bsd__ afs_global_lock;
>  #endif
>
> -#if defined(AFS_XBSD_ENV)
> +#if defined(AFS_XBSD_ENV) && !defined(AFS_FBSD50_ENV)
>  struct lock afs_global_lock;
> -#ifdef AFS_FBSD50_ENV
> -struct thread *afs_global_owner;
> -#else
>  struct proc *afs_global_owner;
>  #endif
> +#ifdef AFS_FBSD50_ENV
> +struct mtx afs_global_mtx;
>  #endif
>
>  #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV)
> Index: src/afs/afs_init.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_init.c,v
> retrieving revision 1.26
> diff -u -r1.26 afs_init.c
> --- src/afs/afs_init.c	15 Jul 2003 23:14:12 -0000	1.26
> +++ src/afs/afs_init.c	8 Oct 2003 05:09:37 -0000
> @@ -41,7 +41,7 @@
>  int afs_sysnamecount =3D 0;
>  struct volume *Initialafs_freeVolList;
>  int afs_memvolumes =3D 0;
> -#ifdef AFS_OBSD_ENV
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>  static struct vnode *volumeVnode;
>  #endif
>
> @@ -295,7 +295,7 @@
>      struct osi_file *tfile;
>
>      AFS_STATCNT(afs_InitVolumeInfo);
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>      /*
>       * On Open/NetBSD, we can get into big trouble if we don't hold the
> volume file * vnode.  SetupVolume holds afs_xvolume lock exclusive.
> @@ -428,19 +428,24 @@
>      cacheInode =3D filevp->i_ino;
>      afs_cacheSBp =3D filevp->i_sb;
>  #else
> -#ifdef AFS_OBSD_ENV
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>      cacheInode =3D VTOI(filevp)->i_number;
>      cacheDev.mp =3D filevp->v_mount;
>      cacheDev.held_vnode =3D filevp;
> +#ifdef AFS_OBSD_ENV
>      AFS_HOLD(filevp);		/* Make sure mount point stays busy. XXX */
>  #else
> +    vref(filevp);
> +    afs_cacheVfsp =3D filevp->v_vfsp;
> +#endif
> +#else
>  #if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS) ||
> defined(AFS_DARWIN_ENV) afs_InitDualFSCacheOps(filevp);
>  #endif
>      cacheInode =3D afs_vnodeToInumber(filevp);
>      cacheDev.dev =3D afs_vnodeToDev(filevp);
>      afs_cacheVfsp =3D filevp->v_vfsp;
> -#endif /* AFS_OBSD_ENV */
> +#endif /* !AFS_[FO]BSD_ENV */
>  #endif /* AFS_LINUX20_ENV */
>      AFS_RELE(filevp);
>  #endif /* AFS_LINUX22_ENV */
> @@ -494,10 +499,12 @@
>      RWLOCK_INIT(&afs_icl_lock, "afs_icl_lock");
>      RWLOCK_INIT(&afs_xinterface, "afs_xinterface");
>      LOCK_INIT(&afs_puttofileLock, "afs_puttofileLock");
> +#ifndef AFS_FBSD_ENV
>  #ifndef	AFS_AIX32_ENV
>      LOCK_INIT(&osi_fsplock, "osi_fsplock");
>  #endif
>      LOCK_INIT(&osi_flplock, "osi_flplock");
> +#endif
>      RWLOCK_INIT(&afs_xconn, "afs_xconn");
>
>      afs_CellInit();
> @@ -669,11 +676,19 @@
>  	afs_cacheFiles =3D afs_cacheBlocks =3D 0;
>  	pag_epoch =3D maxIHint =3D nihints =3D usedihint =3D 0;
>  	pagCounter =3D 0;
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>  #ifdef AFS_OBSD_ENV
>  	AFS_RELE(volumeVnode);	/* let it go, finally. */
> +#else
> +	vrele(volumeVnode);
> +#endif
>  	volumeVnode =3D NULL;
>  	if (cacheDev.held_vnode) {
> +#ifdef AFS_OBSD_ENV
>  	    AFS_RELE(cacheDev.held_vnode);
> +#else
> +	    vrele(cacheDev.held_vnode);
> +#endif
>  	    cacheDev.held_vnode =3D NULL;
>  	}
>  #endif
> Index: src/afs/afs_osi.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_osi.c,v
> retrieving revision 1.38
> diff -u -r1.38 afs_osi.c
> --- src/afs/afs_osi.c	27 Aug 2003 21:43:16 -0000	1.38
> +++ src/afs/afs_osi.c	8 Oct 2003 05:09:38 -0000
> @@ -57,6 +57,8 @@
>  #elif defined(AFS_OSF_ENV)
>      usimple_lock_init(&afs_global_lock);
>      afs_global_owner =3D (thread_t) 0;
> +#elif defined(AFS_FBSD50_ENV)
> +    mtx_init(&afs_global_mtx, "AFS global lock", NULL, MTX_DEF);
>  #elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
>      lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0);
>      afs_global_owner =3D 0;
> @@ -433,6 +435,8 @@
>      AFS_STATS(afs_stats_cmperf.OutStandingMemUsage +=3D x);
>  #ifdef AFS_LINUX20_ENV
>      return osi_linux_alloc(x, 1);
> +#elif defined(AFS_FBSD_ENV)
> +    return osi_fbsd_alloc(x, 1);
>  #else
>      size =3D x;
>      tm =3D (struct osimem *)AFS_KALLOC(size);
> @@ -479,6 +483,8 @@
>      AFS_STATS(afs_stats_cmperf.OutStandingMemUsage -=3D asize);
>  #if defined(AFS_LINUX20_ENV)
>      osi_linux_free(x);
> +#elif defined(AFS_FBSD_ENV)
> +    osi_fbsd_free(x);
>  #else
>      AFS_KFREE((struct osimem *)x, asize);
>  #endif
> Index: src/afs/afs_osi.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_osi.h,v
> retrieving revision 1.19
> diff -u -r1.19 afs_osi.h
> --- src/afs/afs_osi.h	29 Aug 2003 22:00:04 -0000	1.19
> +++ src/afs/afs_osi.h	8 Oct 2003 05:09:38 -0000
> @@ -13,6 +13,10 @@
>  #include "h/types.h"
>  #include "h/param.h"
>
> +#ifdef AFS_FBSD50_ENV
> +#include <sys/condvar.h>
> +#endif
> +
>  #ifdef AFS_LINUX20_ENV
>  #ifndef _LINUX_CODA_FS_I
>  #define _LINUX_CODA_FS_I
> @@ -68,11 +72,13 @@
>  };
>
>  struct osi_dev {
> -#ifdef AFS_OBSD_ENV
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>      struct mount *mp;
>      struct vnode *held_vnode;
> +/* see if we need this...
>  #elif defined(AFS_FBSD50_ENV)
>      struct cdev *dev;
> +*/
>  #elif defined(AFS_AIX42_ENV)
>      dev_t dev;
>  #else
> @@ -81,7 +87,12 @@
>  };
>
>  struct afs_osi_WaitHandle {
> +#ifdef AFS_FBSD50_ENV
> +    struct cv wh_condvar;
> +    int wh_inited;		/* XXX */
> +#else
>      caddr_t proc;		/* process waiting */
> +#endif
>  };
>
>  #define	osi_SetFileProc(x,p)	((x)->proc=3D(p))
> Index: src/afs/afs_osi_alloc.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_osi_alloc.c,v
> retrieving revision 1.9
> diff -u -r1.9 afs_osi_alloc.c
> --- src/afs/afs_osi_alloc.c	15 Jul 2003 23:14:12 -0000	1.9
> +++ src/afs/afs_osi_alloc.c	8 Oct 2003 05:09:39 -0000
> @@ -19,6 +19,7 @@
>  #include "afsincludes.h"	/* Afs-based standard headers */
>  #include "afs/afs_stats.h"	/* afs statistics */
>
> +#ifndef AFS_FBSD_ENV
>  #ifdef AFS_AIX41_ENV
>  #include "sys/lockl.h"
>  #include "sys/sleep.h"
> @@ -368,3 +369,4 @@
>  	LOCK_INIT(&osi_flplock, "osi_flplock");
>      }
>  }
> +#endif
> Index: src/afs/afs_prototypes.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_prototypes.h,v
> retrieving revision 1.42
> diff -u -r1.42 afs_prototypes.h
> --- src/afs/afs_prototypes.h	15 Jul 2003 23:14:12 -0000	1.42
> +++ src/afs/afs_prototypes.h	8 Oct 2003 05:09:39 -0000
> @@ -465,8 +465,12 @@
>  extern void afs_osi_MaskSignals(void);
>  extern void afs_osi_UnmaskRxkSignals(void);
>  extern void *afs_osi_Alloc(size_t x);
> +#ifndef afs_osi_Alloc_NoSleep
>  extern void *afs_osi_Alloc_NoSleep(size_t x);
> +#endif
> +#ifndef afs_osi_Free
>  extern void afs_osi_Free(void *x, size_t asize);
> +#endif
>  extern void afs_osi_FreeStr(char *x);
>  extern void osi_Init(void);
>  extern int osi_Active(register struct vcache *avc);
> @@ -503,9 +507,11 @@
>  extern afs_int32 PagInCred(const struct AFS_UCRED *cred);
>
>  /* afs_osi_alloc.c */
> +#ifndef AFS_FBSD_ENV
>  extern afs_int32 afs_preallocs;
>  extern afs_lock_t osi_fsplock;
>  extern afs_lock_t osi_flplock;
> +#endif
>  extern void osi_FreeLargeSpace(void *adata);
>  extern void osi_FreeMediumSpace(void *adata);
>  extern void osi_FreeSmallSpace(void *adata);
> Index: src/afs/afs_vcache.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/afs_vcache.c,v
> retrieving revision 1.55
> diff -u -r1.55 afs_vcache.c
> --- src/afs/afs_vcache.c	3 Sep 2003 16:47:15 -0000	1.55
> +++ src/afs/afs_vcache.c	8 Oct 2003 05:09:42 -0000
> @@ -153,7 +153,7 @@
>  	afs_osi_Free(avc->linkData, strlen(avc->linkData) + 1);
>  	avc->linkData =3D NULL;
>      }
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_XBSD_ENV)
>      /* OK, there are no internal vrefCounts, so there shouldn't
>       * be any more refs here. */
>      if (avc->v) {
> @@ -801,36 +801,6 @@
>  		    continue;	/* start over - may have raced. */
>  		}
>  	    }
> -#elif defined(AFS_FBSD50_ENV)
> -	    if (VREFCOUNT(tvc) =3D=3D 1 && tvc->opens =3D=3D 0
> -		&& (tvc->states & CUnlinkedDel) =3D=3D 0) {
> -		if (!(VOP_LOCK(&tvc->v, LK_EXCLUSIVE, curthread))) {
> -		    if (VREFCOUNT(tvc) =3D=3D 1 && tvc->opens =3D=3D 0
> -			&& (tvc->states & CUnlinkedDel) =3D=3D 0) {
> -			VREFCOUNT_DEC(tvc);
> -			AFS_GUNLOCK();	/* perhaps inline inactive for locking */
> -			VOP_INACTIVE(&tvc->v, curthread);
> -			AFS_GLOCK();
> -		    } else {
> -			VOP_UNLOCK(&tvc->v, 0, curthread);
> -		    }
> -		}
> -	    }
> -#elif defined(AFS_FBSD_ENV) && !defined(AFS_FBSD50_ENV)
> -	    if (VREFCOUNT(tvc) =3D=3D 1 && tvc->opens =3D=3D 0
> -		&& (tvc->states & CUnlinkedDel) =3D=3D 0) {
> -		if (!(VOP_LOCK(&tvc->v, LK_EXCLUSIVE, curproc))) {
> -		    if (VREFCOUNT(tvc) =3D=3D 1 && tvc->opens =3D=3D 0
> -			&& (tvc->states & CUnlinkedDel) =3D=3D 0) {
> -			VREFCOUNT_DEC(tvc);
> -			AFS_GUNLOCK();	/* perhaps inline inactive for locking */
> -			VOP_INACTIVE(&tvc->v, curproc);
> -			AFS_GLOCK();
> -		    } else {
> -			VOP_UNLOCK(&tvc->v, 0, curproc);
> -		    }
> -		}
> -	    }
>  #elif defined(AFS_LINUX22_ENV)
>  	    if (tvc !=3D afs_globalVp && VREFCOUNT(tvc) && tvc->opens =3D=3D 0)
>  		afs_TryFlushDcacheChildren(tvc);
> @@ -838,12 +808,13 @@
>
>  	    if (VREFCOUNT(tvc) =3D=3D 0 && tvc->opens =3D=3D 0
>  		&& (tvc->states & CUnlinkedDel) =3D=3D 0) {
> -#ifdef AFS_OBSD_ENV
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>  		/*
>  		 * vgone() reclaims the vnode, which calls afs_FlushVCache(),
>  		 * then it puts the vnode on the free list.
>  		 * If we don't do this we end up with a cleaned vnode that's
>  		 * not on the free list.
> +		 * XXX assume FreeBSD is the same for now.
>  		 */
>  		vgone(AFSTOV(tvc));
>  		code =3D fv_slept =3D 0;
> @@ -907,7 +878,7 @@
>      vm_info_ptr =3D tvc->v.v_vm_info;
>  #endif /* AFS_MACH_ENV */
>
> -#if defined(AFS_OBSD_ENV)
> +#if defined(AFS_OBSD_ENV) || defined(AFS_FBSD_ENV)
>      if (tvc->v)
>  	panic("afs_NewVCache(): free vcache with vnode attached");
>  #endif
> @@ -931,6 +902,32 @@
>      afs_nbsd_getnewvnode(tvc);	/* includes one refcount */
>      lockinit(&tvc->rwlock, PINOD, "vcache", 0, 0);
>  #endif
> +#ifdef AFS_FBSD_ENV
> +    {
> +	struct vnode *vp;
> +
> +	AFS_GUNLOCK();
> +	if (getnewvnode("afs", afs_globalVFS, afs_vnodeop_p, &vp))
> +	    panic("afs getnewvnode");	/* can't happen */
> +	AFS_GLOCK();
> +	if (tvc->v !=3D NULL) {
> +	    /* I'd like to know if this ever happens...
> +	       We don't drop global for the rest of this function,
> +	       so if we do lose the race, the other thread should
> +	       have found the same vnode and finished initializing
> +	       the vcache entry.  Is it conceivable that this vcache
> +	       entry could be recycled during this interval?  If so,
> +	       then there probably needs to be some sort of additional
> +	       mutual exclusion (an Embryonic flag would suffice).
> +		-GAW */
> +	    printf("afs_NewVCache: lost the race\n");
> +	    return (tvc);
> +	}
> +	tvc->v =3D vp;
> +	tvc->v->v_data =3D tvc;
> +	lockinit(&tvc->rwlock, PINOD, "vcache", 0, 0);
> +    }
> +#endif
>      tvc->parentVnode =3D 0;
>      tvc->mvid =3D NULL;
>      tvc->linkData =3D NULL;
> @@ -955,9 +952,9 @@
>      /* Hold it for the LRU (should make count 2) */
>      VN_HOLD(AFSTOV(tvc));
>  #else /* AFS_OSF_ENV */
> -#ifndef AFS_OBSD_ENV
> +#if !defined(AFS_OBSD_ENV) && !defined(AFS_FBSD_ENV)
>      VREFCOUNT_SET(tvc, 1);	/* us */
> -#endif /* AFS_OBSD_ENV */
> +#endif /* AFS_[FO]BSD_ENV */
>  #endif /* AFS_OSF_ENV */
>  #ifdef	AFS_AIX32_ENV
>      LOCK_INIT(&tvc->pvmlock, "vcache pvmlock");
> @@ -1038,14 +1035,6 @@
>      tvc->v.v_freelist.tqe_prev =3D (struct vnode **)0xdeadb;
>      /*tvc->vrefCount++; */
>  #endif
> -#ifdef AFS_FBSD_ENV
> -    lockinit(&tvc->rwlock, PINOD, "vcache rwlock", 0, 0);
> -    cache_purge(AFSTOV(tvc));
> -    tvc->v.v_data =3D tvc;
> -    tvc->v.v_tag =3D VT_AFS;
> -    tvc->v.v_usecount++;	/* steal an extra ref for now so vfree never
> happens */ -    /* This extra ref is dealt with above... */
> -#endif
>      /*
>       * The proper value for mvstat (for root fids) is setup by the calle=
r.
>       */
> @@ -1798,6 +1787,40 @@
>      VOP_LOCK(AFSTOV(tvc), LK_EXCLUSIVE | LK_RETRY, curproc);
>      uvm_vnp_uncache(AFSTOV(tvc));
>      VOP_UNLOCK(AFSTOV(tvc), 0, curproc);
> +#endif
> +#ifdef AFS_FBSD_ENV
> +    /*
> +     * XXX - I really don't like this.  Should try to understand better.
> +     * It seems that sometimes, when we get called, we already hold the
> +     * lock on the vnode (e.g., from afs_getattr via afs_VerifyVCache).
> +     * We can't drop the vnode lock, because that could result in a race.
> +     * Sometimes, though, we get here and don't hold the vnode lock.
> +     * I hate code paths that sometimes hold locks and sometimes don't.
> +     * In any event, the dodge we use here is to check whether the vnode
> +     * is locked, and if it isn't, then we gain and drop it around the
> call +     * to vinvalbuf; otherwise, we leave it alone.
> +     */
> +    {
> +	struct vnode *vp;
> +	int iheldthelock;
> +
> +	vp =3D AFSTOV(tvc);
> +#ifdef AFS_FBSD50_ENV
> +	iheldthelock =3D VOP_ISLOCKED(vp, curthread);
> +	if (!iheldthelock)
> +	    vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
> +	vinvalbuf(vp, V_SAVE, curthread->td_ucred, curthread, PINOD, 0);
> +	if (!iheldthelock)
> +	    VOP_UNLOCK(vp, LK_EXCLUSIVE, curthread);
> +#else
> +	iheldthelock =3D VOP_ISLOCKED(vp, curproc);
> +	if (!iheldthelock)
> +	    vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curproc);
> +	vinvalbuf(vp, V_SAVE, curthread->td_ucred, curproc, PINOD, 0);
> +	if (!iheldthelock)
> +	    VOP_UNLOCK(vp, LK_EXCLUSIVE, curproc);
> +#endif
> +    }
>  #endif
>
>      ObtainWriteLock(&afs_xcbhash, 464);
> Index: src/afs/FBSD/osi_file.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_file.c,v
> retrieving revision 1.12
> diff -u -r1.12 osi_file.c
> --- src/afs/FBSD/osi_file.c	9 Sep 2003 21:14:34 -0000	1.12
> +++ src/afs/FBSD/osi_file.c	8 Oct 2003 05:09:43 -0000
> @@ -73,7 +73,9 @@
>      MObtainWriteLock(&afs_xosi, 320);
>      AFS_GUNLOCK();
>  #if defined(AFS_FBSD50_ENV)
> +    vn_lock(afile->vnode, LK_EXCLUSIVE | LK_RETRY, curthread);
>      code =3D VOP_GETATTR(afile->vnode, &tvattr, afs_osi_credp, curthread=
);
> +    VOP_UNLOCK(afile->vnode, LK_EXCLUSIVE, curthread);
>  #else
>      code =3D VOP_GETATTR(afile->vnode, &tvattr, afs_osi_credp, curproc);
>  #endif
> @@ -104,25 +106,41 @@
>  osi_UFSTruncate(register struct osi_file *afile, afs_int32 asize)
>  {
>      struct vattr tvattr;
> +    struct vnode *vp;
>      register afs_int32 code;
> -    struct osi_stat tstat;
>      AFS_STATCNT(osi_Truncate);
>
> -    /* This routine only shrinks files, and most systems
> +    MObtainWriteLock(&afs_xosi, 321);
> +    vp =3D afile->vnode;
> +    /*
> +     * This routine only shrinks files, and most systems
>       * have very slow truncates, even when the file is already
>       * small enough.  Check now and save some time.
>       */
> -    code =3D afs_osi_Stat(afile, &tstat);
> -    if (code || tstat.size <=3D asize)
> -	return code;
> -    MObtainWriteLock(&afs_xosi, 321);
> +    AFS_GUNLOCK();
> +#if defined(AFS_FBSD50_ENV)
> +    vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
> +    code =3D VOP_GETATTR(afile->vnode, &tvattr, afs_osi_credp, curthread=
);
> +#else
> +    vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curproc);
> +    code =3D VOP_GETATTR(afile->vnode, &tvattr, afs_osi_credp, curproc);
> +#endif
> +    if (code !=3D 0 || tvattr.va_size <=3D asize)
> +	goto out;
> +
>      VATTR_NULL(&tvattr);
>      tvattr.va_size =3D asize;
> -    AFS_GUNLOCK();
>  #if defined(AFS_FBSD50_ENV)
> -    code =3D VOP_SETATTR(afile->vnode, &tvattr, afs_osi_credp, curthread=
);
> +    code =3D VOP_SETATTR(vp, &tvattr, afs_osi_credp, curthread);
> +#else
> +    code =3D VOP_SETATTR(vp, &tvattr, afs_osi_credp, curproc);
> +#endif
> +
> +out:
> +#if defined(AFS_FBSD50_ENV)
> +    VOP_UNLOCK(vp, LK_EXCLUSIVE, curthread);
>  #else
> -    code =3D VOP_SETATTR(afile->vnode, &tvattr, afs_osi_credp, curproc);
> +    VOP_UNLOCK(vp, LK_EXCLUSIVE, curproc);
>  #endif
>      AFS_GLOCK();
>      MReleaseWriteLock(&afs_xosi);
> Index: src/afs/FBSD/osi_machdep.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_machdep.h,v
> retrieving revision 1.7
> diff -u -r1.7 osi_machdep.h
> --- src/afs/FBSD/osi_machdep.h	15 Jul 2003 23:14:19 -0000	1.7
> +++ src/afs/FBSD/osi_machdep.h	8 Oct 2003 05:09:43 -0000
> @@ -21,6 +21,7 @@
>
>  #include <sys/lock.h>
>  #include <sys/time.h>
> +#include <sys/mutex.h>
>  /* #include <kern/sched_prim.h> */
>  /* #include <sys/unix_defs.h> */
>
> @@ -42,7 +43,13 @@
>  #define iodone biodone
>  #endif
>
> -#define osi_vnhold(avc,r) do { VN_HOLD((struct vnode *)(avc)); } while (=
0)
> +#define osi_vnhold(avc,r)	vref(AFSTOV(avc))
> +#undef vSetVfsp
> +#define vSetVfsp(vc, vfsp)	AFSTOV(vc)->v_mount =3D (vfsp)
> +#undef vSetType
> +#define vSetType(vc, type)	AFSTOV(vc)->v_type =3D (type)
> +#undef vType
> +#define	vType(vc)		AFSTOV(vc)->v_type
>
>  #undef gop_lookupname
>  #define gop_lookupname osi_lookupname
> @@ -52,7 +59,9 @@
>  #define afs_strcat(s1, s2)	strcat((s1), (s2))
>
>  #ifdef KERNEL
> -extern struct lock afs_global_lock;
> +
> +#undef afs_osi_Alloc_NoSleep
> +#define afs_osi_Alloc_NoSleep(size) osi_fbsd_alloc((size), 0)
>
>  #if defined(AFS_FBSD50_ENV)
>  #define VT_AFS		"afs"
> @@ -64,24 +73,13 @@
>  #define simple_unlock(x) mtx_unlock(x)
>  #define        gop_rdwr(rw,gp,base,len,offset,segflg,unit,cred,aresid) \
>  =20
> vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(cred),(cred),(ar=
es
>id), curthread) -extern struct thread *afs_global_owner;
> -#define AFS_GLOCK() \
> -    do { \
> -        osi_Assert(curthread); \
> - 	lockmgr(&afs_global_lock, LK_EXCLUSIVE, 0, curthread); \
> -        osi_Assert(afs_global_owner =3D=3D 0); \
> -   	afs_global_owner =3D curthread; \
> -    } while (0)
> -#define AFS_GUNLOCK() \
> -    do { \
> -        osi_Assert(curthread); \
> - 	osi_Assert(afs_global_owner =3D=3D curthread); \
> -        afs_global_owner =3D 0; \
> -        lockmgr(&afs_global_lock, LK_RELEASE, 0, curthread); \
> -    } while(0)
> -#define ISAFS_GLOCK() (afs_global_owner =3D=3D curthread && curthread)
> +extern struct mtx afs_global_mtx;
> +#define AFS_GLOCK() mtx_lock(&afs_global_mtx)
> +#define AFS_GUNLOCK() mtx_unlock(&afs_global_mtx)
> +#define ISAFS_GLOCK() (mtx_owned(&afs_global_mtx))
>
>  #else /* FBSD50 */
> +extern struct lock afs_global_lock;
>
>  #define osi_curcred()	(curproc->p_cred->pc_ucred)
>  #define getpid()	curproc
> Index: src/afs/FBSD/osi_misc.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_misc.c,v
> retrieving revision 1.8
> diff -u -r1.8 osi_misc.c
> --- src/afs/FBSD/osi_misc.c	15 Jul 2003 23:14:19 -0000	1.8
> +++ src/afs/FBSD/osi_misc.c	8 Oct 2003 05:09:43 -0000
> @@ -53,7 +53,12 @@
>  	       struct vnode **dirvpp, struct vnode **vpp)
>  {
>      struct nameidata n;
> -    int flags, error;
> +    int flags, error, wasowned;
> +
> +    wasowned =3D mtx_owned(&afs_global_mtx);
> +    if (wasowned)
> +	mtx_unlock(&afs_global_mtx);
> +
>      flags =3D 0;
>      flags =3D LOCKLEAF;
>      if (followlink)
> @@ -62,8 +67,11 @@
>  	flags |=3D NOFOLLOW;
>      /*   if (dirvpp) flags|=3DWANTPARENT; *//* XXX LOCKPARENT? */
>      NDINIT(&n, LOOKUP, flags, seg, aname, curproc);
> -    if (error =3D namei(&n))
> +    if ((error =3D namei(&n)) !=3D 0) {
> +	if (wasowned)
> +	    mtx_lock(&afs_global_mtx);
>  	return error;
> +    }
>      *vpp =3D n.ni_vp;
>  /*
>     if (dirvpp)
> @@ -72,6 +80,8 @@
>      /* should we do this? */
>      VOP_UNLOCK(n.ni_vp, 0, curproc);
>      NDFREE(&n, NDF_ONLY_PNBUF);
> +    if (wasowned)
> +	mtx_lock(&afs_global_mtx);
>      return 0;
>  }
>
> @@ -102,4 +112,73 @@
>      resettodr();
>      AFS_GLOCK();
>  #endif
> +}
> +
> +/*
> + * Replace all of the bogus special-purpose memory allocators...
> + */
> +void *
> +osi_fbsd_alloc(size_t size, int dropglobal)
> +{
> +	void *rv;
> +	int wasowned;
> +
> +	if (dropglobal) {
> +		wasowned =3D mtx_owned(&afs_global_mtx);
> +		if (wasowned)
> +			mtx_unlock(&afs_global_mtx);
> +		rv =3D malloc(size, M_AFS, M_WAITOK);
> +		if (wasowned)
> +			mtx_lock(&afs_global_mtx);
> +	} else
> +		rv =3D malloc(size, M_AFS, M_NOWAIT);
> +
> +	return (rv);
> +}
> +
> +void
> +osi_fbsd_free(void *p)
> +{
> +
> +	free(p, M_AFS);
> +}
> +
> +void
> +osi_AllocMoreSSpace(afs_int32 preallocs)
> +{
> +	;
> +}
> +
> +void
> +osi_FreeLargeSpace(void *p)
> +{
> +	osi_fbsd_free(p);
> +}
> +
> +void
> +osi_FreeSmallSpace(void *p)
> +{
> +	osi_fbsd_free(p);
> +}
> +
> +void *
> +osi_AllocLargeSpace(size_t size)
> +{
> +	AFS_ASSERT_GLOCK();
> +	AFS_STATCNT(osi_AllocLargeSpace);
> +	return (osi_fbsd_alloc(size, 1));
> +}
> +
> +void *
> +osi_AllocSmallSpace(size_t size)
> +{
> +	AFS_ASSERT_GLOCK();
> +	AFS_STATCNT(osi_AllocSmallSpace);
> +	return (osi_fbsd_alloc(size, 1));
> +}
> +
> +void
> +shutdown_osinet(void)
> +{
> +	;
>  }
> Index: src/afs/FBSD/osi_module.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_module.c,v
> retrieving revision 1.4
> diff -u -r1.4 osi_module.c
> --- src/afs/FBSD/osi_module.c	15 Jul 2003 23:14:20 -0000	1.4
> +++ src/afs/FBSD/osi_module.c	8 Oct 2003 05:09:43 -0000
> @@ -60,8 +60,10 @@
>  	vfs_register(&afs_vfsconf);	/* doesn't fail */
>  	vfs_add_vnodeops(&afs_vnodeop_opv_desc);
>  	osi_Init();
> +#ifdef DO_NOT_EVER_EVER_DO_THIS
>  	sysent[SYS_setgroups].sy_call =3D Afs_xsetgroups;
>  	sysent[SYS_ioctl].sy_call =3D afs_xioctl;
> +#endif
>  	old_handler =3D sysent[AFS_SYSCALL].sy_call;
>  	sysent[AFS_SYSCALL].sy_call =3D afs3_syscall;
>  	sysent[AFS_SYSCALL].sy_narg =3D 5;
> Index: src/afs/FBSD/osi_prototypes.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_prototypes.h,v
> retrieving revision 1.4
> diff -u -r1.4 osi_prototypes.h
> --- src/afs/FBSD/osi_prototypes.h	15 Jul 2003 23:14:20 -0000	1.4
> +++ src/afs/FBSD/osi_prototypes.h	8 Oct 2003 05:09:43 -0000
> @@ -20,8 +20,14 @@
>  /* osi_misc.c */
>  extern int osi_lookupname(char *aname, enum uio_seg seg, int followlink,
>  			  struct vnode **dirvpp, struct vnode **vpp);
> +extern void *osi_fbsd_alloc(size_t size, int dropglobal);
> +extern void osi_fbsd_free(void *p);
>
>  /* osi_vfsops.c */
> +#ifdef AFS_FBSD50_ENV
> +extern int afs_statfs(struct mount *mp, struct statfs *abp, struct thread
> *th); +#else
>  extern int afs_statfs(struct mount *mp, struct statfs *abp, struct proc
> *p); +#endif
>
>  #endif /* _OSI_PROTO_H_ */
> Index: src/afs/FBSD/osi_sleep.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_sleep.c,v
> retrieving revision 1.10
> diff -u -r1.10 osi_sleep.c
> --- src/afs/FBSD/osi_sleep.c	15 Jul 2003 23:14:20 -0000	1.10
> +++ src/afs/FBSD/osi_sleep.c	8 Oct 2003 05:09:43 -0000
> @@ -18,32 +18,31 @@
>  #include "afsincludes.h"	/* Afs-based standard headers */
>  #include "afs/afs_stats.h"	/* afs statistics */
>
> -
> -
> -static int osi_TimedSleep(char *event, afs_int32 ams, int aintok);
> -
> -static char waitV;
> -
> -
>  void
>  afs_osi_InitWaitHandle(struct afs_osi_WaitHandle *achandle)
>  {
>      AFS_STATCNT(osi_InitWaitHandle);
> -    achandle->proc =3D (caddr_t) 0;
> +    cv_init(&achandle->wh_condvar, "afscondvar");
> +    achandle->wh_inited =3D 1;
>  }
>
>  /* cancel osi_Wait */
> +/* XXX
> + * I can't tell -- is this supposed to be cv_signal() or
> cv_waitq_remove()? + * Or perhaps cv_broadcast()?
> + * Assuming cv_signal() is the desired meaning.  -GAW
> + */
>  void
>  afs_osi_CancelWait(struct afs_osi_WaitHandle *achandle)
>  {
> -    caddr_t proc;
>
>      AFS_STATCNT(osi_CancelWait);
> -    proc =3D achandle->proc;
> -    if (proc =3D=3D 0)
> +    /* XXX should not be necessary */
> +    if (!achandle->wh_inited)
>  	return;
> -    achandle->proc =3D (caddr_t) 0;	/* so dude can figure out he was
> signalled */ -    afs_osi_Wakeup(&waitV);
> +
> +    AFS_ASSERT_GLOCK();
> +    cv_signal(&achandle->wh_condvar);
>  }
>
>  /* afs_osi_Wait
> @@ -54,31 +53,36 @@
>  afs_osi_Wait(afs_int32 ams, struct afs_osi_WaitHandle *ahandle, int
> aintok) {
>      int code;
> -    afs_int32 endTime;
> +    struct timeval tv;
> +    int ticks;
>
>      AFS_STATCNT(osi_Wait);
> -    endTime =3D osi_Time() + (ams / 1000);
> -    if (ahandle)
> -	ahandle->proc =3D (caddr_t) curproc;
> -    do {
> -	AFS_ASSERT_GLOCK();
> -	code =3D 0;
> -	code =3D osi_TimedSleep(&waitV, ams, aintok);
>
> -	if (code)
> -	    break;		/* if something happened, quit now */
> -	/* if we we're cancelled, quit now */
> -	if (ahandle && (ahandle->proc =3D=3D (caddr_t) 0)) {
> -	    /* we've been signalled */
> -	    break;
> -	}
> -    } while (osi_Time() < endTime);
> +    tv.tv_sec =3D ams / 1000;
> +    tv.tv_usec =3D (ams % 1000) * 1000;
> +    ticks =3D tvtohz(&tv);
> +
> +    AFS_ASSERT_GLOCK();
> +    if (ahandle =3D=3D NULL) {
> +	/* This is nasty and evil and rude. */
> +	code =3D msleep(&tv, &afs_global_mtx, (aintok ? PPAUSE|PCATCH : PVFS),
> +	    "afswait", ticks);
> +    } else {
> +	if (!ahandle->wh_inited)
> +	    afs_osi_InitWaitHandle(ahandle);	/* XXX should not be needed */
> +
> +	if (aintok)
> +	    code =3D cv_timedwait_sig(&ahandle->wh_condvar, &afs_global_mtx,
> +		ticks);
> +	else
> +	    code =3D cv_timedwait(&ahandle->wh_condvar, &afs_global_mtx, ticks);
> +    }
>      return code;
>  }
>
> -
> -
> -
> +/*
> + * All this gluck should probably also be replaced with CVs.
> + */
>  typedef struct afs_event {
>      struct afs_event *next;	/* next in hash chain */
>      char *event;		/* lwp event: an address */
> @@ -140,9 +144,7 @@
>      seq =3D evp->seq;
>      while (seq =3D=3D evp->seq) {
>  	AFS_ASSERT_GLOCK();
> -	AFS_GUNLOCK();
> -	tsleep(event, PVFS, "afs_osi_Sleep", 0);
> -	AFS_GLOCK();
> +	msleep(event, &afs_global_mtx, PVFS, "afsslp", 0);
>      }
>      relevent(evp);
>  }
> @@ -153,42 +155,6 @@
>      afs_osi_Sleep(event);
>      return 0;
>  }
> -
> -/* osi_TimedSleep
> - *
> - * Arguments:
> - * event - event to sleep on
> - * ams --- max sleep time in milliseconds
> - * aintok - 1 if should sleep interruptibly
> - *
> - * Returns 0 if timeout and EINTR if signalled.
> - */
> -static int
> -osi_TimedSleep(char *event, afs_int32 ams, int aintok)
> -{
> -    int code =3D 0;
> -    struct afs_event *evp;
> -    int ticks;
> -    int seq, prio;
> -
> -    ticks =3D (ams * afs_hz) / 1000;
> -
> -
> -    evp =3D afs_getevent(event);
> -    seq =3D evp->seq;
> -    AFS_GUNLOCK();
> -    if (aintok)
> -	prio =3D PCATCH | PPAUSE;
> -    else
> -	prio =3D PVFS;
> -    code =3D tsleep(event, prio, "afs_osi_TimedSleep", ticks);
> -    AFS_GLOCK();
> -    if (seq =3D=3D evp->seq)
> -	code =3D EINTR;
> -    relevent(evp);
> -    return code;
> -}
> -
>
>  int
>  afs_osi_Wakeup(void *event)
> Index: src/afs/FBSD/osi_vfsops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_vfsops.c,v
> retrieving revision 1.14
> diff -u -r1.14 osi_vfsops.c
> --- src/afs/FBSD/osi_vfsops.c	15 Jul 2003 23:14:20 -0000	1.14
> +++ src/afs/FBSD/osi_vfsops.c	8 Oct 2003 05:09:43 -0000
> @@ -16,48 +16,42 @@
>  struct mount *afs_globalVFS =3D 0;
>  int afs_pbuf_freecnt =3D -1;
>
> +#ifdef AFS_FBSD50_ENV
> +#define	THREAD_OR_PROC struct thread *p
> +#else
> +#define	THREAD_OR_PROC struct proc *p
> +#endif
> +
>  int
> -afs_quotactl()
> +afs_quotactl(struct mount *mp, int c, uid_t u, caddr_t data,
> THREAD_OR_PROC) {
>      return EOPNOTSUPP;
>  }
>
>  int
> -afs_fhtovp(mp, fhp, vpp)
> -     struct mount *mp;
> -     struct fid *fhp;
> -     struct vnode **vpp;
> +afs_fhtovp(struct mount *mp, struct fid *fhp, struct vnode **vpp)
>  {
>
>      return (EINVAL);
>  }
>
>  int
> -afs_vptofh(vp, fhp)
> -     struct vnode *vp;
> -     struct fid *fhp;
> +afs_vptofh(struct vnode *vp, struct fid *fhp)
>  {
>
>      return (EINVAL);
>  }
>
>  int
> -afs_start(mp, flags, p)
> -     struct mount *mp;
> -     int flags;
> -     struct proc *p;
> +afs_start(struct mount *mp, int flags, THREAD_OR_PROC)
>  {
>      afs_pbuf_freecnt =3D nswbuf / 2 + 1;
>      return (0);			/* nothing to do. ? */
>  }
>
>  int
> -afs_mount(mp, path, data, ndp, p)
> -     register struct mount *mp;
> -     char *path;
> -     caddr_t data;
> -     struct nameidata *ndp;
> -     struct proc *p;
> +afs_mount(struct mount *mp, char *path, caddr_t data, struct nameidata
> *ndp, +	THREAD_OR_PROC)
>  {
>      /* ndp contains the mounted-from device.  Just ignore it.
>       * we also don't care about our proc struct. */
> @@ -91,12 +85,16 @@
>  }
>
>  int
> -afs_unmount(mp, flags, p)
> -     struct mount *mp;
> -     int flags;
> -     struct proc *p;
> +afs_unmount(struct mount *mp, int flags, THREAD_OR_PROC)
>  {
>
> +    /*
> +     * Releaase any remaining vnodes on this mount point.
> +     * The `1' means that we hold one extra reference on
> +     * the root vnode (this is just a guess right now).
> +     * This has to be done outside the global lock.
> +     */
> +    vflush(mp, 1, (flags & MNT_FORCE) ? FORCECLOSE : 0);
>      AFS_GLOCK();
>      AFS_STATCNT(afs_unmount);
>      afs_globalVFS =3D 0;
> @@ -114,10 +112,10 @@
>      register struct vcache *tvp =3D 0;
>  #ifdef AFS_FBSD50_ENV
>      struct thread *td =3D curthread;
> -    struct ucred cr =3D *td->td_ucred;
> +    struct ucred *cr =3D crhold(td->td_ucred);
>  #else
>      struct proc *p =3D curproc;
> -    struct ucred cr =3D *p->p_cred->pc_ucred;
> +    struct ucred *cr =3D crhold(p->p_cred->pc_ucred);
>  #endif
>
>      AFS_GLOCK();
> @@ -126,12 +124,14 @@
>  	tvp =3D afs_globalVp;
>  	error =3D 0;
>      } else {
> +tryagain:
>  	if (afs_globalVp) {
>  	    afs_PutVCache(afs_globalVp);
> +	    /* vrele() needed here or not? */
>  	    afs_globalVp =3D NULL;
>  	}
>
> -	if (!(error =3D afs_InitReq(&treq, &cr)) && !(error =3D afs_CheckInit()=
)) {
> +	if (!(error =3D afs_InitReq(&treq, cr)) && !(error =3D afs_CheckInit())=
) {
>  	    tvp =3D afs_GetVCache(&afs_rootFid, &treq, NULL, NULL);
>  	    /* we really want this to stay around */
>  	    if (tvp)
> @@ -141,34 +141,41 @@
>  	}
>      }
>      if (tvp) {
> -	osi_vnhold(tvp, 0);
> +	struct vnode *vp =3D AFSTOV(tvp);
> +
> +	ASSERT_VI_UNLOCKED(vp, "afs_root");
>  	AFS_GUNLOCK();
> +	/*
> +	 * I'm uncomfortable about this.  Shouldn't this happen at a
> +	 * higher level, and shouldn't we busy the top-level directory
> +	 * to prevent recycling?
> +	 */
>  #ifdef AFS_FBSD50_ENV
> -	vn_lock(AFSTOV(tvp), LK_EXCLUSIVE | LK_RETRY, td);
> +	error =3D vget(vp, LK_EXCLUSIVE | LK_RETRY, td);
> +	vp->v_vflag |=3D VV_ROOT;
>  #else
> -	vn_lock(AFSTOV(tvp), LK_EXCLUSIVE | LK_RETRY, p);
> +	error =3D vget(vp, LK_EXCLUSIVE | LK_RETRY, p);
> +	vp->v_flag |=3D VROOT;
>  #endif
>  	AFS_GLOCK();
> +	if (error !=3D 0)
> +		goto tryagain;
> +
>  	afs_globalVFS =3D mp;
> -	*vpp =3D AFSTOV(tvp);
> -	tvp->v.v_flag |=3D VROOT;
> +	*vpp =3D vp;
>      }
>
>      afs_Trace2(afs_iclSetp, CM_TRACE_VFSROOT, ICL_TYPE_POINTER, *vpp,
>  	       ICL_TYPE_INT32, error);
>      AFS_GUNLOCK();
> +    crfree(cr);
>      return error;
>  }
>
> +#ifndef AFS_FBSD50_ENV
>  int
> -afs_vget(mp, lfl, vp)
> -     struct mount *mp;
> -     struct vnode *vp;
> -     int lfl;
> +afs_vget(struct mount *mp, ino_t ino, int flags, struct vnode *vp)
>  {
> -#ifdef AFS_FBSD50_ENV
> -    return EOPNOTSUPP;
> -#else
>      int error;
>
>      printf("vget called. help!\n");
> @@ -180,11 +187,11 @@
>      if (!error)
>  	insmntque(vp, afs_globalVFS);	/* take off free list */
>      return error;
> -#endif
>  }
> +#endif
>
>  int
> -afs_statfs(struct mount *mp, struct statfs *abp, struct proc *p)
> +afs_statfs(struct mount *mp, struct statfs *abp, THREAD_OR_PROC)
>  {
>      AFS_GLOCK();
>      AFS_STATCNT(afs_statfs);
> @@ -217,23 +224,12 @@
>  }
>
>  int
> -afs_sync(mp, waitfor, cred, p)
> -     struct mount *mp;
> -     int waitfor;
> -     struct ucred *cred;
> -     struct prioc *p;
> +afs_sync(struct mount *mp, int waitfor, struct ucred *cred,
> THREAD_OR_PROC) {
>      return 0;
>  }
>
>  int
> -afs_sysctl()
> -{
> -    return EOPNOTSUPP;
> -}
> -
> -
> -int
>  afs_init(struct vfsconf *vfc)
>  {
>      return 0;
> @@ -247,7 +243,11 @@
>      afs_quotactl,
>      afs_statfs,
>      afs_sync,
> +#ifdef AFS_FBSD50_ENV
> +    NULL,
> +#else
>      afs_vget,
> +#endif
>      afs_fhtovp,
>  #ifdef AFS_FBSD50_ENV
>      vfs_stdcheckexp,
> @@ -255,7 +255,6 @@
>      afs_vptofh,
>      afs_init,
>  #ifdef AFS_FBSD50_ENV
> -    vfs_stduninit,
> +    vfs_stduninit
>  #endif
> -    afs_sysctl
>  };
> Index: src/afs/FBSD/osi_vm.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_vm.c,v
> retrieving revision 1.10
> diff -u -r1.10 osi_vm.c
> --- src/afs/FBSD/osi_vm.c	15 Jul 2003 23:14:20 -0000	1.10
> +++ src/afs/FBSD/osi_vm.c	8 Oct 2003 05:09:43 -0000
> @@ -32,6 +32,31 @@
>  #include <limits.h>
>  #include <float.h>
>
> +/*
> + * FreeBSD implementation notes:
> + * Most of these operations require us to frob vm_objects.  Most
> + * functions require that the object be locked (with VM_OBJECT_LOCK)
> + * on entry and leave it locked on exit.  In order to get the
> + * vm_object itself we call VOP_GETVOBJECT on the vnode; the
> + * locking protocol requires that we do so with the heavy vnode lock
> + * held and the vnode interlock unlocked, and it returns the same
> + * way.
> + *
> + * The locking protocol for vnodes is defined in
> + * kern/vnode_if.src and sys/vnode.h; the locking is still a work in
> + * progress, so some fields are (as of 5.1) still protected by Giant
> + * rather than an explicit lock.
> + */
> +
> +#define	lock_vnode(v)	vn_lock((v), LK_EXCLUSIVE | LK_RETRY, curthread)
> +#define unlock_vnode(v)	VOP_UNLOCK((v), 0, curthread)
> +
> +#ifndef AFS_FBSD50_ENV
> +/* need splvm() protection? */
> +#define	VM_OBJECT_LOCK(o)
> +#define VM_OBJECT_UNLOCK(o)
> +#endif
> +
>  /* Try to discard pages, in order to recycle a vcache entry.
>   *
>   * We also make some sanity checks:  ref count, open count, held locks.
> @@ -47,6 +72,8 @@
>   * therefore obsolescent.
>   *
>   * OSF/1 Locking:  VN_LOCK has been called.
> + * XXX - should FreeBSD have done this, too?  Certainly looks like it.
> + * Maybe better to just call vnode_pager_setsize()?
>   */
>  int
>  osi_VM_FlushVCache(struct vcache *avc, int *slept)
> @@ -65,8 +92,9 @@
>
>      AFS_GUNLOCK();
>      vp =3D AFSTOV(avc);
> -    simple_lock(&vp->v_interlock);
> +    lock_vnode(vp);
>      if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0) {
> +	VM_OBJECT_LOCK(obj);
>  	vm_object_page_remove(obj, 0, 0, FALSE);
>  #if 0
>  	if (obj->ref_count =3D=3D 0) {
> @@ -76,8 +104,9 @@
>  	    SetAfsVnode(vp);
>  	}
>  #endif
> +	VM_OBJECT_UNLOCK(obj);
>      }
> -    simple_unlock(&vp->v_interlock);
> +    unlock_vnode(vp);
>      AFS_GLOCK();
>
>      return 0;
> @@ -99,25 +128,37 @@
>      AFS_GUNLOCK();
>      tries =3D 5;
>      vp =3D AFSTOV(avc);
> +
> +    /*
> +     * I don't understand this.  Why not just call vm_object_page_clean()
> +     * and be done with it?  I particularly don't understand why we're
> calling +     * vget() here.  Is there some reason to believe that the
> vnode might +     * be being recycled at this point?  I don't think there=
's
> any need for +     * this loop, either -- if we keep the vnode locked all
> the time, +     * that and the object lock will prevent any new pages from
> appearing. +     * The loop is what causes the race condition.  -GAW
> +     */
>      do {
>  	anyio =3D 0;
> -	simple_lock(&vp->v_interlock);
> +	lock_vnode(vp);
>  	if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0 && (obj->flags & OBJ_MIGHTBEDIRTY=
)) {
> +	    /* XXX - obj locking? */
> +	    unlock_vnode(vp);
>  #ifdef AFS_FBSD50_ENV
> -	    if (!vget(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, curthread)) {
> +	    if (!vget(vp, LK_EXCLUSIVE | LK_RETRY, curthread)) {
>  #else
> -	    if (!vget
> -		(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY | LK_NOOBJ,
> -		 curproc)) {
> +	    if (!vget(vp, LK_EXCLUSIVE | LK_RETRY | LK_NOOBJ, curproc)) {
>  #endif
>  		if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0) {
> +		    VM_OBJECT_LOCK(obj);
>  		    vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
> +		    VM_OBJECT_UNLOCK(obj);
>  		    anyio =3D 1;
>  		}
>  		vput(vp);
>  	    }
>  	} else
> -	    simple_unlock(&vp->v_interlock);
> +	    unlock_vnode(vp);
>      } while (anyio && (--tries > 0));
>      AFS_GLOCK();
>      ObtainWriteLock(&avc->lock, 94);
> @@ -145,29 +186,41 @@
>      vp =3D AFSTOV(avc);
>      do {
>  	anyio =3D 0;
> -	simple_lock(&vp->v_interlock);
> +	lock_vnode(vp);
> +	/* See the comments above. */
>  	if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0 && (obj->flags & OBJ_MIGHTBEDIRTY=
)) {
> +	    /* XXX - obj locking */
> +	    unlock_vnode(vp);
>  #ifdef AFS_FBSD50_ENV
> -	    if (!vget(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, curthread)) {
> +	    if (!vget(vp, LK_EXCLUSIVE | LK_RETRY, curthread)) {
>  #else
> -	    if (!vget
> -		(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY | LK_NOOBJ,
> -		 curproc)) {
> +	    if (!vget(vp, LK_EXCLUSIVE | LK_RETRY | LK_NOOBJ, curproc)) {
>  #endif
>  		if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0) {
> +		    VM_OBJECT_LOCK(obj);
> +		    /*
> +		     * Do we really want OBJPC_SYNC?  OBJPC_INVAL would be
> +		     * faster, if invalidation is really what we are being
> +		     * asked to do.  (It would make more sense, too, since
> +		     * otherwise this function is practically identical to
> +		     * osi_VM_StoreAllSegments().)  -GAW
> +		     */
>  		    vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
> +		    VM_OBJECT_UNLOCK(obj);
>  		    anyio =3D 1;
>  		}
>  		vput(vp);
>  	    }
>  	} else
> -	    simple_unlock(&vp->v_interlock);
> +	    unlock_vnode(vp);
>      } while (anyio && (--tries > 0));
> -    simple_lock(&vp->v_interlock);
> +    lock_vnode(vp);
>      if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0) {
> +	VM_OBJECT_LOCK(obj);
>  	vm_object_page_remove(obj, 0, 0, FALSE);
> +	VM_OBJECT_UNLOCK(obj);
>      }
> -    simple_unlock(&vp->v_interlock);
> +    unlock_vnode(vp);
>      /*vinvalbuf(AFSTOV(avc),0, NOCRED, curproc, 0,0); */
>      AFS_GLOCK();
>      ObtainWriteLock(&avc->lock, 59);
> @@ -184,11 +237,12 @@
>      struct vm_object *obj;
>
>      vp =3D AFSTOV(avc);
> -    simple_lock(&vp->v_interlock);
> +    ASSERT_VOP_LOCKED(vp, __func__);
>      if (VOP_GETVOBJECT(vp, &obj) =3D=3D 0) {
> +	VM_OBJECT_LOCK(obj);
>  	vm_object_page_remove(obj, 0, 0, FALSE);
> +	VM_OBJECT_UNLOCK(obj);
>      }
> -    simple_unlock(&vp->v_interlock);
>      /*vinvalbuf(AFSTOV(avc),0, NOCRED, curproc, 0,0); */
>  }
>
> Index: src/afs/FBSD/osi_vnodeops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/afs/FBSD/osi_vnodeops.c,v
> retrieving revision 1.16
> diff -u -r1.16 osi_vnodeops.c
> --- src/afs/FBSD/osi_vnodeops.c	27 Aug 2003 21:43:17 -0000	1.16
> +++ src/afs/FBSD/osi_vnodeops.c	8 Oct 2003 05:09:44 -0000
> @@ -1,3 +1,49 @@
> +/*
> + * A large chunk of this file appears to be copied directly from
> + * sys/nfsclient/nfs_bio.c, which has the following license:
> + */
> +/*
> + * Copyright (c) 1989, 1993
> + *	The Regents of the University of California.  All rights reserved.
> + *
> + * This code is derived from software contributed to Berkeley by
> + * Rick Macklem at The University of Guelph.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distributio=
n.
> + * 3. All advertising materials mentioning features or use of this
> software + *    must display the following acknowledgement:
> + *	This product includes software developed by the University of
> + *	California, Berkeley and its contributors.
> + * 4. Neither the name of the University nor the names of its contributo=
rs
> + *    may be used to endorse or promote products derived from this
> software + *    without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' A=
ND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
> BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE =
OR
> OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE.
> + *
> + *	@(#)nfs_bio.c	8.9 (Berkeley) 3/30/95
> + */
> +/*
> + * Pursuant to a statement of U.C. Berkeley dated 1999-07-22, this licen=
se
> + * is amended to drop clause (3) above.
> + */
> +
>  #include <afsconfig.h>
>  #include <afs/param.h>
>
> @@ -9,6 +55,7 @@
>  #include <afs/afs_stats.h>	/* statistics */
>  #include <sys/malloc.h>
>  #include <sys/namei.h>
> +#include <sys/unistd.h>
>  #ifndef AFS_FBSD50_ENV
>  #include <vm/vm_zone.h>
>  #endif
> @@ -31,6 +78,7 @@
>  int afs_vop_getpages(struct vop_getpages_args *);
>  int afs_vop_putpages(struct vop_putpages_args *);
>  int afs_vop_ioctl(struct vop_ioctl_args *);
> +static int afs_vop_pathconf(struct vop_pathconf_args *);
>  int afs_vop_poll(struct vop_poll_args *);
>  #ifndef AFS_FBSD50_ENV
>  int afs_vop_mmap(struct vop_mmap_args *);
> @@ -59,7 +107,7 @@
>  /* Global vfs data structures for AFS. */
>  vop_t **afs_vnodeop_p;
>  struct vnodeopv_entry_desc afs_vnodeop_entries[] =3D {
> -    {&vop_default_desc, (vop_t *) vop_eopnotsupp},
> +    {&vop_default_desc, (vop_t *) vop_defaultop},
>      {&vop_access_desc, (vop_t *) afs_vop_access},	/* access */
>      {&vop_advlock_desc, (vop_t *) afs_vop_advlock},	/* advlock */
>      {&vop_bmap_desc, (vop_t *) afs_vop_bmap},	/* bmap */
> @@ -76,10 +124,8 @@
>      {&vop_getvobject_desc, (vop_t *) vop_stdgetvobject},
>      {&vop_putpages_desc, (vop_t *) afs_vop_putpages},	/* write */
>      {&vop_inactive_desc, (vop_t *) afs_vop_inactive},	/* inactive */
> -    {&vop_islocked_desc, (vop_t *) afs_vop_islocked},	/* islocked */
>      {&vop_lease_desc, (vop_t *) vop_null},
>      {&vop_link_desc, (vop_t *) afs_vop_link},	/* link */
> -    {&vop_lock_desc, (vop_t *) afs_vop_lock},	/* lock */
>      {&vop_lookup_desc, (vop_t *) afs_vop_lookup},	/* lookup */
>      {&vop_mkdir_desc, (vop_t *) afs_vop_mkdir},	/* mkdir */
>      {&vop_mknod_desc, (vop_t *) afs_vop_mknod},	/* mknod */
> @@ -87,6 +133,7 @@
>      {&vop_mmap_desc, (vop_t *) afs_vop_mmap},	/* mmap */
>  #endif
>      {&vop_open_desc, (vop_t *) afs_vop_open},	/* open */
> +    {&vop_pathconf_desc, (vop_t *) afs_vop_pathconf},	/* pathconf */
>      {&vop_poll_desc, (vop_t *) afs_vop_poll},	/* select */
>      {&vop_print_desc, (vop_t *) afs_vop_print},	/* print */
>      {&vop_read_desc, (vop_t *) afs_vop_read},	/* read */
> @@ -99,7 +146,6 @@
>      {&vop_setattr_desc, (vop_t *) afs_vop_setattr},	/* setattr */
>      {&vop_strategy_desc, (vop_t *) afs_vop_strategy},	/* strategy */
>      {&vop_symlink_desc, (vop_t *) afs_vop_symlink},	/* symlink */
> -    {&vop_unlock_desc, (vop_t *) afs_vop_unlock},	/* unlock */
>      {&vop_write_desc, (vop_t *) afs_vop_write},	/* write */
>      {&vop_ioctl_desc, (vop_t *) afs_vop_ioctl},	/* XXX ioctl */
>      /*{ &vop_seek_desc, afs_vop_seek }, *//* seek */
> @@ -122,7 +168,98 @@
>  #define a_p a_td
>  #endif
>
> +/*
> + * Mosty copied from sys/ufs/ufs/ufs_vnops.c:ufs_pathconf().
> + * We should know the correct answers to these questions with
> + * respect to the AFS protocol (which may differ from the UFS
> + * values) but for the moment this will do.
> + */
> +static int
> +afs_vop_pathconf(struct vop_pathconf_args *ap)
> +{
> +	int error;
>
> +	error =3D 0;
> +	switch (ap->a_name) {
> +	case _PC_LINK_MAX:
> +		*ap->a_retval =3D LINK_MAX;
> +		break;
> +	case _PC_NAME_MAX:
> +		*ap->a_retval =3D NAME_MAX;
> +		break;
> +	case _PC_PATH_MAX:
> +		*ap->a_retval =3D PATH_MAX;
> +		break;
> +	case _PC_PIPE_BUF:
> +		*ap->a_retval =3D PIPE_BUF;
> +		break;
> +	case _PC_CHOWN_RESTRICTED:
> +		*ap->a_retval =3D 1;
> +		break;
> +	case _PC_NO_TRUNC:
> +		*ap->a_retval =3D 1;
> +		break;
> +#ifdef _PC_ACL_EXTENDED
> +	case _PC_ACL_EXTENDED:
> +		*ap->a_retval =3D 0;
> +		break;
> +	case _PC_ACL_PATH_MAX:
> +		*ap->a_retval =3D 3;
> +		break;
> +#endif
> +#ifdef _PC_MAC_PRESENT
> +	case _PC_MAC_PRESENT:
> +		*ap->a_retval =3D 0;
> +		break;
> +#endif
> +#ifdef _PC_ASYNC_IO
> +	case _PC_ASYNC_IO:
> +		/* _PC_ASYNC_IO should have been handled by upper layers. */
> +		KASSERT(0, ("_PC_ASYNC_IO should not get here"));
> +		error =3D EINVAL;
> +		break;
> +	case _PC_PRIO_IO:
> +		*ap->a_retval =3D 0;
> +		break;
> +	case _PC_SYNC_IO:
> +		*ap->a_retval =3D 0;
> +		break;
> +#endif
> +#ifdef _PC_ALLOC_SIZE_MIN
> +	case _PC_ALLOC_SIZE_MIN:
> +		*ap->a_retval =3D ap->a_vp->v_mount->mnt_stat.f_bsize;
> +		break;
> +#endif
> +#ifdef _PC_FILESIZEBITS
> +	case _PC_FILESIZEBITS:
> +		*ap->a_retval =3D 32; /* XXX */
> +		break;
> +#endif
> +#ifdef _PC_REC_INCR_XFER_SIZE
> +	case _PC_REC_INCR_XFER_SIZE:
> +		*ap->a_retval =3D ap->a_vp->v_mount->mnt_stat.f_iosize;
> +		break;
> +	case _PC_REC_MAX_XFER_SIZE:
> +		*ap->a_retval =3D -1; /* means ``unlimited'' */
> +		break;
> +	case _PC_REC_MIN_XFER_SIZE:
> +		*ap->a_retval =3D ap->a_vp->v_mount->mnt_stat.f_iosize;
> +		break;
> +	case _PC_REC_XFER_ALIGN:
> +		*ap->a_retval =3D PAGE_SIZE;
> +		break;
> +#endif
> +#ifdef _PC_SYMLINK_MAX
> +	case _PC_SYMLINK_MAX:
> +		*ap->a_retval =3D MAXPATHLEN;
> +		break;
> +#endif
> +	default:
> +		error =3D EINVAL;
> +		break;
> +	}
> +	return (error);
> +}
>
>  int
>  afs_vop_lookup(ap)
> @@ -397,15 +534,16 @@
>      return code;
>  }
>
> +/* struct vop_getpages_args {
> + *	struct vnode *a_vp;
> + *	vm_page_t *a_m;
> + *	int a_count;
> + *	int a_reqpage;
> + *	vm_oofset_t a_offset;
> + * };
> + */
>  int
> -afs_vop_getpages(ap)
> -     struct vop_getpages_args	/* {
> -				 * struct vnode *a_vp;
> -				 * vm_page_t *a_m;
> -				 * int a_count;
> -				 * int a_reqpage;
> -				 * vm_oofset_t a_offset;
> -				 * } */ *ap;
> +afs_vop_getpages(struct vop_getpages_args *ap)
>  {
>      int code;
>      int i, nextoff, size, toff, npages;
> @@ -413,9 +551,16 @@
>      struct iovec iov;
>      struct buf *bp;
>      vm_offset_t kva;
> -    struct vcache *avc =3D VTOAFS(ap->a_vp);
> +    vm_object_t object;
> +    struct vnode *vp;
> +    struct vcache *avc;
>
> -    if (avc->v.v_object =3D=3D NULL) {
> +#ifdef AFS_FBSD50_ENV
> +    GIANT_REQUIRED;
> +#endif
> +    vp =3D ap->a_vp;
> +    avc =3D VTOAFS(vp);
> +    if ((object =3D vp->v_object) =3D=3D NULL) {
>  	printf("afs_getpages: called with non-merged cache vnode??\n");
>  	return VM_PAGER_ERROR;
>      }
> @@ -429,6 +574,10 @@
>      {
>  	vm_page_t m =3D ap->a_m[ap->a_reqpage];
>
> +#ifdef AFS_FBSD50_ENV
> +	VM_OBJECT_LOCK(object);
> +	vm_page_lock_queues();
> +#endif
>  	if (m->valid !=3D 0) {
>  	    /* handled by vm_fault now        */
>  	    /* vm_page_zero_invalid(m, TRUE); */
> @@ -436,12 +585,24 @@
>  		if (i !=3D ap->a_reqpage)
>  		    vm_page_free(ap->a_m[i]);
>  	    }
> +#ifdef AFS_FBSD50_ENV
> +	    vm_page_unlock_queues();
> +	    VM_OBJECT_UNLOCK(object);
> +#endif
>  	    return (0);
>  	}
> +#ifdef AFS_FBSD50_ENV
> +	vm_page_unlock_queues();
> +	VM_OBJECT_UNLOCK(object);
> +#endif
>      }
>      bp =3D getpbuf(&afs_pbuf_freecnt);
> +
>      kva =3D (vm_offset_t) bp->b_data;
>      pmap_qenter(kva, ap->a_m, npages);
> +    cnt.v_vnodein++;
> +    cnt.v_vnodepgsin +=3D npages;
> +
>      iov.iov_base =3D (caddr_t) kva;
>      iov.iov_len =3D ap->a_count;
>      uio.uio_iov =3D &iov;
> @@ -455,6 +616,7 @@
>  #else
>      uio.uio_procp =3D curproc;
>  #endif
> +
>      AFS_GLOCK();
>      afs_BozonLock(&avc->pvnLock, avc);
>      osi_FlushPages(avc, osi_curcred());	/* hold bozon lock, but not basic
> vnode lock */ @@ -464,14 +626,28 @@
>      pmap_qremove(kva, npages);
>
>      relpbuf(bp, &afs_pbuf_freecnt);
> +
>      if (code && (uio.uio_resid =3D=3D ap->a_count)) {
> +#ifdef AFS_FBSD50_ENV
> +	VM_OBJECT_LOCK(object);
> +	vm_page_lock_queues();
> +#endif
>  	for (i =3D 0; i < npages; ++i) {
>  	    if (i !=3D ap->a_reqpage)
>  		vm_page_free(ap->a_m[i]);
>  	}
> +#ifdef AFS_FBSD50_ENV
> +	vm_page_unlock_queues();
> +	VM_OBJECT_UNLOCK(object);
> +#endif
>  	return VM_PAGER_ERROR;
>      }
> +
>      size =3D ap->a_count - uio.uio_resid;
> +#ifdef AFS_FBSD50_ENV
> +    VM_OBJECT_LOCK(object);
> +    vm_page_lock_queues();
> +#endif
>      for (i =3D 0, toff =3D 0; i < npages; i++, toff =3D nextoff) {
>  	vm_page_t m;
>  	nextoff =3D toff + PAGE_SIZE;
> @@ -519,6 +695,10 @@
>  	    }
>  	}
>      }
> +#ifdef AFS_FBSD50_ENV
> +    vm_page_unlock_queues();
> +    VM_OBJECT_UNLOCK(object);
> +#endif
>      return 0;
>  }
>
> @@ -543,16 +723,22 @@
>      return code;
>  }
>
> +/*-
> + * struct vop_putpages_args {
> + *	struct vnode *a_vp;
> + *	vm_page_t *a_m;
> + *	int a_count;
> + *	int a_sync;
> + *	int *a_rtvals;
> + *	vm_oofset_t a_offset;
> + * };
> + */
> +/*
> + * All of the pages passed to us in ap->a_m[] are already marked as busy,
> + * so there is no additional locking required to set their flags.  -GAW
> + */
>  int
> -afs_vop_putpages(ap)
> -     struct vop_putpages_args	/* {
> -				 * struct vnode *a_vp;
> -				 * vm_page_t *a_m;
> -				 * int a_count;
> -				 * int a_sync;
> -				 * int *a_rtvals;
> -				 * vm_oofset_t a_offset;
> -				 * } */ *ap;
> +afs_vop_putpages(struct vop_putpages_args *ap)
>  {
>      int code;
>      int i, size, npages, sync;
> @@ -560,22 +746,34 @@
>      struct iovec iov;
>      struct buf *bp;
>      vm_offset_t kva;
> -    struct vcache *avc =3D VTOAFS(ap->a_vp);
> +    struct vnode *vp;
> +    struct vcache *avc;
> +
> +#ifdef AFS_FBSD50_ENV
> +    GIANT_REQUIRED;
> +#endif
>
> -    if (avc->v.v_object =3D=3D NULL) {
> +    vp =3D ap->a_vp;
> +    avc =3D VTOAFS(vp);
> +    /* Perhaps these two checks should just be KASSERTs instead... */
> +    if (vp->v_object =3D=3D NULL) {
>  	printf("afs_putpages: called with non-merged cache vnode??\n");
> -	return VM_PAGER_ERROR;
> +	return VM_PAGER_ERROR;	/* XXX I think this is insufficient */
>      }
>      if (vType(avc) !=3D VREG) {
>  	printf("afs_putpages: not VREG");
> -	return VM_PAGER_ERROR;
> +	return VM_PAGER_ERROR;	/* XXX I think this is insufficient */
>      }
>      npages =3D btoc(ap->a_count);
>      for (i =3D 0; i < npages; i++)
>  	ap->a_rtvals[i] =3D VM_PAGER_AGAIN;
>      bp =3D getpbuf(&afs_pbuf_freecnt);
> +
>      kva =3D (vm_offset_t) bp->b_data;
>      pmap_qenter(kva, ap->a_m, npages);
> +    cnt.v_vnodeout++;
> +    cnt.v_vnodepgsout +=3D ap->a_count;
> +
>      iov.iov_base =3D (caddr_t) kva;
>      iov.iov_len =3D ap->a_count;
>      uio.uio_iov =3D &iov;
> @@ -600,16 +798,16 @@
>      code =3D afs_write(avc, &uio, sync, osi_curcred(), 0);
>      afs_BozonUnlock(&avc->pvnLock, avc);
>      AFS_GUNLOCK();
> -    pmap_qremove(kva, npages);
>
> +    pmap_qremove(kva, npages);
>      relpbuf(bp, &afs_pbuf_freecnt);
> +
>      if (!code) {
>  	size =3D ap->a_count - uio.uio_resid;
>  	for (i =3D 0; i < round_page(size) / PAGE_SIZE; i++) {
>  	    ap->a_rtvals[i] =3D VM_PAGER_OK;
> -	    ap->a_m[i]->dirty =3D 0;
> +	    vm_page_undirty(ap->a_m[i]);
>  	}
> -	return VM_PAGER_ERROR;
>      }
>      return ap->a_rtvals[0];
>  }
> @@ -933,26 +1131,44 @@
>      return error;
>  }
>
> +/* struct vop_symlink_args {
> + *	struct vnode *a_dvp;
> + *	struct vnode **a_vpp;
> + *	struct componentname *a_cnp;
> + *	struct vattr *a_vap;
> + *	char *a_target;
> + * };
> + */
>  int
> -afs_vop_symlink(ap)
> -     struct vop_symlink_args	/* {
> -				 * struct vnode *a_dvp;
> -				 * struct vnode **a_vpp;
> -				 * struct componentname *a_cnp;
> -				 * struct vattr *a_vap;
> -				 * char *a_target;
> -				 * } */ *ap;
> +afs_vop_symlink(struct vop_symlink_args *ap)
>  {
> -    register struct vnode *dvp =3D ap->a_dvp;
> -    int error =3D 0;
> -    /* NFS ignores a_vpp; so do we. */
> +    struct vnode *dvp;
> +    struct vnode *newvp;
> +    struct vcache *vcp;
> +    int error;
> +
> +    dvp =3D ap->a_dvp;
> +    newvp =3D NULL;
> +    error =3D 0;
>
>      GETNAME();
>      AFS_GLOCK();
>      error =3D
>  	afs_symlink(VTOAFS(dvp), name, ap->a_vap, ap->a_target, cnp->cn_cred);
> +    if (error =3D=3D 0) {
> +	error =3D afs_lookup(VTOAFS(dvp), name, &vcp, cnp->cn_cred);
> +	if (error =3D=3D 0) {
> +	    newvp =3D AFSTOV(vcp);
> +#ifdef AFS_FBSD50_ENV
> +	    vn_lock(newvp, LK_EXCLUSIVE | LK_RETRY, cnp->cn_thread);
> +#else
> +	    vn_lock(newvp, LK_EXCLUSIVE | LK_RETRY, cnp->cn_proc);
> +#endif
> +	}
> +    }
>      AFS_GUNLOCK();
>      DROPNAME();
> +    *(ap->a_vpp) =3D newvp;
>      return error;
>  }
>
> @@ -1043,69 +1259,36 @@
>      return 0;
>  }
>
> +/*
> + * struct vop_reclaim_args {
> + *	struct vnode *a_vp;
> + * };
> + */
>  int
> -afs_vop_reclaim(ap)
> -     struct vop_reclaim_args	/* {
> -				 * struct vnode *a_vp;
> -				 * } */ *ap;
> -{
> -#ifdef AFS_DO_FLUSH_IN_RECLAIM
> -    int error, sl;
> -#endif
> -    register struct vnode *vp =3D ap->a_vp;
> -
> -    cache_purge(vp);		/* just in case... */
> -
> -#ifdef AFS_DO_FLUSH_IN_RECLAIM
> -    AFS_GLOCK();
> -    error =3D afs_FlushVCache(VTOAFS(vp), &sl);	/* tosses our stuff from
> vnode */ -    AFS_GUNLOCK();
> -    ubc_unlink(vp);
> -    if (!error && vp->v_data)
> -	panic("afs_reclaim: vnode not cleaned");
> -    return error;
> -#else
> -    if (vp->v_usecount =3D=3D 2) {
> -	vprint("reclaim count=3D=3D2", vp);
> -    } else if (vp->v_usecount =3D=3D 1) {
> -	vprint("reclaim count=3D=3D1", vp);
> -    } else
> -	vprint("reclaim bad count", vp);
> -
> -    return 0;
> -#endif
> -}
> -
> -int
> -afs_vop_lock(ap)
> -     struct vop_lock_args	/* {
> -				 * struct vnode *a_vp;
> -				 * } */ *ap;
> -{
> -    register struct vnode *vp =3D ap->a_vp;
> -    register struct vcache *avc =3D VTOAFS(vp);
> -
> -#ifdef AFS_FBSD50_ENV
> -    if (!strcmp(vp->v_tag, "none"))
> -#else
> -    if (vp->v_tag =3D=3D VT_NON)
> -#endif
> -	return (ENOENT);
> -    return (lockmgr(&avc->rwlock, ap->a_flags, &vp->v_interlock,
> ap->a_p)); -}
> -
> -int
> -afs_vop_unlock(ap)
> -     struct vop_unlock_args	/* {
> -				 * struct vnode *a_vp;
> -				 * } */ *ap;
> +afs_vop_reclaim(struct vop_reclaim_args *ap)
>  {
> +    /* copied from ../OBSD/osi_vnodeops.c:afs_nbsd_reclaim() */
> +    int code, slept;
>      struct vnode *vp =3D ap->a_vp;
>      struct vcache *avc =3D VTOAFS(vp);
> -    return (lockmgr
> -	    (&avc->rwlock, ap->a_flags | LK_RELEASE, &vp->v_interlock,
> -	     ap->a_p));
> +    int haveGlock =3D ISAFS_GLOCK();
> +    int haveVlock =3D CheckLock(&afs_xvcache);
>
> +    if (!haveGlock)
> +	AFS_GLOCK();
> +    if (!haveVlock)
> +	ObtainWriteLock(&afs_xvcache, 901);
> +#ifndef AFS_DISCON_ENV
> +    code =3D afs_FlushVCache(avc, &slept);	/* tosses our stuff from vnod=
e */
> +#else
> +    /* reclaim the vnode and the in-memory vcache, but keep the on-disk
> vcache */ +    code =3D afs_FlushVS(avc);
> +#endif
> +    if (!haveVlock)
> +	ReleaseWriteLock(&afs_xvcache);
> +    if (!haveGlock)
> +	AFS_GUNLOCK();
> +    return code;
>  }
>
>  int
> @@ -1173,16 +1356,6 @@
>  	   (s & CVFlushed) ? " flush in progress" : "");
>      printf("\n");
>      return 0;
> -}
> -
> -int
> -afs_vop_islocked(ap)
> -     struct vop_islocked_args	/* {
> -				 * struct vnode *a_vp;
> -				 * } */ *ap;
> -{
> -    struct vcache *vc =3D VTOAFS(ap->a_vp);
> -    return lockstatus(&vc->rwlock, ap->a_p);
>  }
>
>  /*
> Index: src/cf/osconf.m4
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/cf/osconf.m4,v
> retrieving revision 1.39
> diff -u -r1.39 osconf.m4
> --- src/cf/osconf.m4	1 Jul 2003 19:30:30 -0000	1.39
> +++ src/cf/osconf.m4	8 Oct 2003 05:09:47 -0000
> @@ -191,7 +191,7 @@
>  		SHLIB_LDFLAGS=3D"-shared -Xlinker -x"
>  		TXLIBS=3D"-lncurses"
>  		XCFLAGS=3D"-O2 -pipe"
> -		XLIBS=3D"${LIB_AFSDB} -lcompat"
> +		XLIBS=3D"${LIB_AFSDB}"
>  		YACC=3D"byacc"
>  		;;
>
> @@ -203,7 +203,7 @@
>  		SHLIB_LDFLAGS=3D"-shared -Xlinker -x"
>  		TXLIBS=3D"-lncurses"
>  		XCFLAGS=3D"-O2 -pipe"
> -		XLIBS=3D"${LIB_AFSDB} -lcompat"
> +		XLIBS=3D"${LIB_AFSDB}"
>  		YACC=3D"byacc"
>  		;;
>
> Index: src/config/param.i386_fbsd_42.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_42.h,v
> retrieving revision 1.9
> diff -u -r1.9 param.i386_fbsd_42.h
> --- src/config/param.i386_fbsd_42.h	15 Jul 2003 23:14:55 -0000	1.9
> +++ src/config/param.i386_fbsd_42.h	8 Oct 2003 05:09:48 -0000
> @@ -79,8 +79,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define	AFS_KALLOC(x)	malloc(x, M_AFS, M_WAITOK)
> -#define	AFS_KFREE(x,y)	free(x,M_AFS)
> +#define	AFS_KALLOC(x)	osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x)	osi_fbsd_alloc((x), 0)
> +#define	AFS_KFREE(x,y)	osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_43.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_43.h,v
> retrieving revision 1.6
> diff -u -r1.6 param.i386_fbsd_43.h
> --- src/config/param.i386_fbsd_43.h	15 Jul 2003 23:14:55 -0000	1.6
> +++ src/config/param.i386_fbsd_43.h	8 Oct 2003 05:09:48 -0000
> @@ -81,8 +81,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_44.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_44.h,v
> retrieving revision 1.6
> diff -u -r1.6 param.i386_fbsd_44.h
> --- src/config/param.i386_fbsd_44.h	15 Jul 2003 23:14:55 -0000	1.6
> +++ src/config/param.i386_fbsd_44.h	8 Oct 2003 05:09:48 -0000
> @@ -83,8 +83,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_45.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_45.h,v
> retrieving revision 1.7
> diff -u -r1.7 param.i386_fbsd_45.h
> --- src/config/param.i386_fbsd_45.h	15 Jul 2003 23:14:55 -0000	1.7
> +++ src/config/param.i386_fbsd_45.h	8 Oct 2003 05:09:48 -0000
> @@ -84,8 +84,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_46.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_46.h,v
> retrieving revision 1.6
> diff -u -r1.6 param.i386_fbsd_46.h
> --- src/config/param.i386_fbsd_46.h	15 Jul 2003 23:14:55 -0000	1.6
> +++ src/config/param.i386_fbsd_46.h	8 Oct 2003 05:09:48 -0000
> @@ -85,8 +85,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_47.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_47.h,v
> retrieving revision 1.4
> diff -u -r1.4 param.i386_fbsd_47.h
> --- src/config/param.i386_fbsd_47.h	15 Jul 2003 23:14:55 -0000	1.4
> +++ src/config/param.i386_fbsd_47.h	8 Oct 2003 05:09:48 -0000
> @@ -87,8 +87,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_50.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_50.h,v
> retrieving revision 1.6
> diff -u -r1.6 param.i386_fbsd_50.h
> --- src/config/param.i386_fbsd_50.h	15 Jul 2003 23:14:55 -0000	1.6
> +++ src/config/param.i386_fbsd_50.h	8 Oct 2003 05:09:49 -0000
> @@ -88,8 +88,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> Index: src/config/param.i386_fbsd_51.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/config/param.i386_fbsd_51.h,v
> retrieving revision 1.1
> diff -u -r1.1 param.i386_fbsd_51.h
> --- src/config/param.i386_fbsd_51.h	17 Jul 2003 16:00:56 -0000	1.1
> +++ src/config/param.i386_fbsd_51.h	8 Oct 2003 05:09:49 -0000
> @@ -79,7 +79,7 @@
>  #ifdef _KERNEL
>  #define AFS_GLOBAL_SUNLOCK        1
>  #define	AFS_VFS34	1	/* What is VFS34??? */
> -#define	AFS_SHORTGID	1	/* are group id's short? */
> +#define	AFS_SHORTGID	0	/* are group id's short? */
>  #define	afsio_iov	uio_iov
>  #define	afsio_iovcnt	uio_iovcnt
>  #define	afsio_offset	uio_offset
> @@ -89,8 +89,10 @@
>  #define	AFS_UIOUSER	UIO_USERSPACE
>  #define	AFS_CLBYTES	CLBYTES
>  #define	osi_GetTime(x)	microtime(x)
> -#define AFS_KALLOC(x)   malloc(x, M_AFS, M_WAITOK)
> -#define AFS_KFREE(x,y)  free(x,M_AFS)
> +#define AFS_KALLOC(x)   osi_fbsd_alloc((x), 1)
> +#undef	AFS_KALLOC_NOSLEEP
> +#define	AFS_KALLOC_NOSLEEP(x) osi_fbsd_alloc((x), 0)
> +#define AFS_KFREE(x,y)  osi_fbsd_free((x))
>  #define	v_count		v_usecount
>  #define v_vfsp		v_mount
>  #define vfs_bsize	mnt_stat.f_bsize
> @@ -169,7 +171,7 @@
>  #define SYS_NAME_ID	SYS_NAME_ID_i386_fbsd_51
>  #define AFSLITTLE_ENDIAN    1
>  #define AFS_HAVE_FFS        1	/* Use system's ffs. */
> -#define AFS_HAVE_STATVFS    0	/* System doesn't support statvfs */
> +#define AFS_HAVE_STATVFS    1	/* System doesn't support statvfs */
>  #define AFS_VM_RDWR_ENV	    1	/* read/write implemented via VM */
>
>  #define	afsio_iov	uio_iov
> Index: src/libafs/MakefileProto.FBSD.in
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/libafs/MakefileProto.FBSD.in,v
> retrieving revision 1.22
> diff -u -r1.22 MakefileProto.FBSD.in
> --- src/libafs/MakefileProto.FBSD.in	1 Jul 2003 18:06:40 -0000	1.22
> +++ src/libafs/MakefileProto.FBSD.in	8 Oct 2003 05:09:51 -0000
> @@ -34,9 +34,11 @@
>  <i386_fbsd_42 i386_fbsd_43 i386_fbsd_44 i386_fbsd_45 i386_fbsd_46
> i386_fbsd_47> -fformat-extensions
>  <all -i386_fbsd_42 -i386_fbsd_43 -i386_fbsd_44 -i386_fbsd_45 -i386_fbsd_=
46
> -i386_fbsd_47> -	-mno-align-long-strings -fformat-extensions -fno-common
> -ffreestanding +	-mno-align-long-strings -fformat-extensions -fno-common
> -ffreestanding \ +	-I/sys/i386/compile/AFS -include opt_global.h
> -fno-strict-aliasing +
>  <all>
> -DBUG =3D -O2
> +DBUG =3D -O -g
>  DEFINES=3D -DAFSDEBUG -DKERNEL -DAFS -DVICE -DNFS -DUFS -DINET -DQUOTA
> -DGETMOUNT OPTF=3D${OPT}
>  OPTF2=3D${OPT2}
> Index: src/libuafs/MakefileProto.FBSD.in
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/libuafs/MakefileProto.FBSD.in,v
> retrieving revision 1.9
> diff -u -r1.9 MakefileProto.FBSD.in
> --- src/libuafs/MakefileProto.FBSD.in	10 Mar 2003 01:59:40 -0000	1.9
> +++ src/libuafs/MakefileProto.FBSD.in	8 Oct 2003 05:09:51 -0000
> @@ -10,16 +10,16 @@
>
>
>  # System specific build commands and flags
> -CC =3D gcc
> +CC =3D @CC@
>  DEFINES=3D -D_REENTRANT -DKERNEL -DUKERNEL
>  KOPTS=3D
>  CFLAGS=3D-I. -I.. -I${TOP_OBJDIR}/src/config ${FSINCLUDES} $(DEFINES)
> $(KOPTS) ${DBUG} OPTF=3D-O
>  # WEBOPTS =3D -I../nsapi -DNETSCAPE_NSAPI -DNET_SSL -DXP_UNIX -DMCC_HTTPD
>
> -TEST_CFLAGS=3D-pthread -D_REENTRANT -DAFS_PTHREAD_ENV -DAFS_FBSD40_ENV
> +TEST_CFLAGS=3D-D_REENTRANT -DAFS_PTHREAD_ENV -DAFS_FBSD40_ENV
>  TEST_LDFLAGS=3D
> -TEST_LIBS=3D
> +TEST_LIBS=3D-lc_r
>
>  LIBUAFS =3D libuafs.a
>  LIBJUAFS =3D libjuafs.a
> Index: src/rx/rx_kcommon.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/rx/rx_kcommon.c,v
> retrieving revision 1.37
> diff -u -r1.37 rx_kcommon.c
> --- src/rx/rx_kcommon.c	27 Aug 2003 21:43:19 -0000	1.37
> +++ src/rx/rx_kcommon.c	8 Oct 2003 05:09:53 -0000
> @@ -776,6 +776,8 @@
>  #if (defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)) &&
> defined(KERNEL_FUNNEL) thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL=
);
>  #endif
> +    AFS_ASSERT_GLOCK();
> +    AFS_GUNLOCK();
>  #if	defined(AFS_HPUX102_ENV)
>  #if     defined(AFS_HPUX110_ENV)
>      /* blocking socket */
> @@ -796,6 +798,7 @@
>      if (code)
>  	goto bad;
>
> +    memset(&myaddr, 0, sizeof myaddr);
>      myaddr.sin_family =3D AF_INET;
>      myaddr.sin_port =3D aport;
>      myaddr.sin_addr.s_addr =3D 0;
> @@ -841,6 +844,7 @@
>      if (code) {
>  	printf("sobind fails (%d)\n", (int)code);
>  	soclose(newSocket);
> +        AFS_GLOCK();
>  	goto bad;
>      }
>  #else /* defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV) */
> @@ -875,12 +879,14 @@
>  #endif /* else AFS_DARWIN_ENV */
>  #endif /* else AFS_HPUX110_ENV */
>
> +    AFS_GLOCK();
>  #if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
>      thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
>  #endif
>      return (struct osi_socket *)newSocket;
>
>    bad:
> +    AFS_GLOCK();
>  #if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL)
>      thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
>  #endif
> Index: src/rx/rx_prototypes.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/rx/rx_prototypes.h,v
> retrieving revision 1.12
> diff -u -r1.12 rx_prototypes.h
> --- src/rx/rx_prototypes.h	15 Jul 2003 23:16:10 -0000	1.12
> +++ src/rx/rx_prototypes.h	8 Oct 2003 05:09:53 -0000
> @@ -561,9 +561,15 @@
>
>  /* EXTERNAL PROTOTYPES - include here cause it causes too many issues to
>     include the afs_prototypes.h file - just make sure they match */
> +#ifndef afs_osi_Alloc
>  extern void *afs_osi_Alloc(size_t x);
> +#endif
> +#ifndef afs_osi_Alloc_NoSleep
>  extern void *afs_osi_Alloc_NoSleep(size_t x);
> +#endif
> +#ifndef afs_osi_Free
>  extern void afs_osi_Free(void *x, size_t asize);
> +#endif
>  #ifndef afs_osi_Wakeup
>  extern int afs_osi_Wakeup(void *event);
>  #endif
> Index: src/rx/xdr.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/rx/xdr.h,v
> retrieving revision 1.10
> diff -u -r1.10 xdr.h
> --- src/rx/xdr.h	15 Jul 2003 23:16:12 -0000	1.10
> +++ src/rx/xdr.h	8 Oct 2003 05:09:54 -0000
> @@ -96,7 +96,9 @@
>
>  /* keep here for now, 64 bit issues */
>  extern void *afs_osi_Alloc(size_t x);
> +#ifndef afs_osi_Alloc_NoSleep
>  extern void *afs_osi_Alloc_NoSleep(size_t x);
> +#endif
>  extern void afs_osi_Free(void *x, size_t asize);
>
>  #endif
> Index: src/rx/FBSD/rx_knet.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/rx/FBSD/rx_knet.c,v
> retrieving revision 1.13
> diff -u -r1.13 rx_knet.c
> --- src/rx/FBSD/rx_knet.c	15 Jul 2003 23:16:18 -0000	1.13
> +++ src/rx/FBSD/rx_knet.c	8 Oct 2003 05:09:56 -0000
> @@ -83,10 +83,20 @@
>  {
>      struct proc *p;
>
> +    /*
> +     * Have to drop global lock to safely do this.
> +     * soclose() is currently protected by Giant,
> +     * but pfind and psignal are MPSAFE.
> +     */
> +    AFS_GUNLOCK();
>      soclose(rx_socket);
>      p =3D pfind(rxk_ListenerPid);
>      if (p)
>  	psignal(p, SIGUSR1);
> +#ifdef AFS_FBSD50_ENV
> +    PROC_UNLOCK(p);
> +#endif
> +    AFS_GLOCK();
>  }
>
>  int
> Index: src/vlserver/vlprocs.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/vlserver/vlprocs.c,v
> retrieving revision 1.10
> diff -u -r1.10 vlprocs.c
> --- src/vlserver/vlprocs.c	15 Jul 2003 23:17:34 -0000	1.10
> +++ src/vlserver/vlprocs.c	8 Oct 2003 05:10:02 -0000
> @@ -38,6 +38,12 @@
>  #ifndef AFS_NT40_ENV
>  #include <unistd.h>
>  #endif
> +#ifdef AFS_FBSD_ENV		/* XXX for now */
> +#define HAVE_REGEX_H
> +#endif
> +#ifdef HAVE_REGEX_H		/* use POSIX regexp library */
> +#include <regex.h>
> +#endif
>
>  extern int smallMem;
>  extern extent_mod;
> @@ -1376,6 +1382,10 @@
>      int pollcount =3D 0;
>      int namematchRWBK, namematchRO, thismatch, matchtype;
>      char volumename[VL_MAXNAMELEN];
> +#ifdef HAVE_REGEX_H
> +    regex_t re;
> +    int need_regfree =3D 0;
> +#endif
>
>      COUNT_REQ(VLLISTATTRIBUTESN2);
>      vldbentries->nbulkentries_val =3D 0;
> @@ -1433,11 +1443,19 @@
>  	findflag =3D ((attributes->Mask & VLLIST_FLAG) ? 1 : 0);
>  	if (name && (strcmp(name, ".*") !=3D 0) && (strcmp(name, "") !=3D 0)) {
>  	    sprintf(volumename, "^%s$", name);
> +#ifdef HAVE_REGEX_H
> +	    if (regcomp(&re, volumename, REG_BASIC | REG_NOSUB) !=3D 0) {
> +		errorcode =3D VL_BADNAME;
> +		goto done;
> +	    }
> +	    need_regfree =3D 1;
> +#else
>  	    t =3D (char *)re_comp(volumename);
>  	    if (t) {
>  		errorcode =3D VL_BADNAME;
>  		goto done;
>  	    }
> +#endif
>  	    findname =3D 1;
>  	}
>
> @@ -1468,9 +1486,15 @@
>  		    if (tentry.flags & VLF_RWEXISTS) {
>  			if (findname) {
>  			    sprintf(volumename, "%s", tentry.name);
> +#ifdef HAVE_REGEX_H
> +			    if (regexec(&re, volumename, 0, NULL, 0) =3D=3D 0) {
> +				thismatch =3D VLSF_RWVOL;
> +			    }
> +#else
>  			    if (re_exec(volumename)) {
>  				thismatch =3D VLSF_RWVOL;
>  			    }
> +#endif
>  			} else {
>  			    thismatch =3D VLSF_RWVOL;
>  			}
> @@ -1480,9 +1504,15 @@
>  		    if (!thismatch && (tentry.flags & VLF_BACKEXISTS)) {
>  			if (findname) {
>  			    sprintf(volumename, "%s.backup", tentry.name);
> +#ifdef HAVE_REGEX_H
> +			    if (regexec(&re, volumename, 0, NULL, 0) =3D=3D 0) {
> +				thismatch =3D VLSF_BACKVOL;
> +			    }
> +#else
>  			    if (re_exec(volumename)) {
>  				thismatch =3D VLSF_BACKVOL;
>  			    }
> +#endif
>  			} else {
>  			    thismatch =3D VLSF_BACKVOL;
>  			}
> @@ -1504,8 +1534,14 @@
>  			    } else {
>  				sprintf(volumename, "%s.readonly",
>  					tentry.name);
> +#ifdef HAVE_REGEX_H
> +			    if (regexec(&re, volumename, 0, NULL, 0) =3D=3D 0) {
> +				thismatch =3D VLSF_ROVOL;
> +			    }
> +#else
>  				if (re_exec(volumename))
>  				    thismatch =3D VLSF_ROVOL;
> +#endif
>  			    }
>  			} else {
>  			    thismatch =3D VLSF_ROVOL;
> @@ -1566,6 +1602,9 @@
>      }
>
>    done:
> +    if (need_regfree)
> +	regfree(&re);
> +
>      if (errorcode) {
>  	COUNT_ABO;
>  	ubik_AbortTrans(trans);
> Index: src/volser/vos.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> RCS file: /cvs/openafs/src/volser/vos.c,v
> retrieving revision 1.28
> diff -u -r1.28 vos.c
> --- src/volser/vos.c	15 Sep 2003 21:39:10 -0000	1.28
> +++ src/volser/vos.c	8 Oct 2003 05:10:05 -0000
> @@ -62,6 +62,13 @@
>  #endif
>  #include "volser_prototypes.h"
>
> +#ifdef AFS_FBSD_ENV
> +#define HAVE_REGEX_H
> +#endif
> +#ifdef HAVE_REGEX_H
> +#include <regex.h>
> +#endif
> +
>  struct tqElem {
>      afs_int32 volid;
>      struct tqElem *next;
> @@ -3928,6 +3935,20 @@
>      if (seenprefix) {
>  	for (ti =3D as->parms[0].items; ti; ti =3D ti->next) {
>  	    if (strncmp(ti->data, "^", 1) =3D=3D 0) {
> +#ifdef HAVE_REGEX_H
> +		regex_t re;
> +		char errbuf[256];
> +
> +		code =3D regcomp(&re, ti->data, REG_BASIC | REG_NOSUB);
> +		if (code !=3D 0) {
> +		    regerror(code, &re, errbuf, sizeof errbuf);
> +		    fprintf(STDERR,
> +			    "Unrecognizable -prefix regular expression: '%s': %s\n",
> +			    ti->data, errbuf);
> +		    exit(1);
> +		}
> +		regfree(&re);
> +#else
>  		ccode =3D (char *)re_comp(ti->data);
>  		if (ccode) {
>  		    fprintf(STDERR,
> @@ -3935,12 +3956,27 @@
>  			    ti->data, ccode);
>  		    exit(1);
>  		}
> +#endif
>  	    }
>  	}
>      }
>      if (seenxprefix) {
>  	for (ti =3D as->parms[4].items; ti; ti =3D ti->next) {
>  	    if (strncmp(ti->data, "^", 1) =3D=3D 0) {
> +#ifdef HAVE_REGEX_H
> +		regex_t re;
> +		char errbuf[256];
> +
> +		code =3D regcomp(&re, ti->data, REG_BASIC | REG_NOSUB);
> +		if (code !=3D 0) {
> +		    regerror(code, &re, errbuf, sizeof errbuf);
> +		    fprintf(STDERR,
> +			    "Unrecognizable -xprefix regular expression: '%s': %s\n",
> +			    ti->data, errbuf);
> +		    exit(1);
> +		}
> +		regfree(&re);
> +#else
>  		ccode =3D (char *)re_comp(ti->data);
>  		if (ccode) {
>  		    fprintf(STDERR,
> @@ -3948,6 +3984,7 @@
>  			    ti->data, ccode);
>  		    exit(1);
>  		}
> +#endif
>  	    }
>  	}
>      }
> @@ -4012,6 +4049,22 @@
>  	if (seenprefix) {
>  	    for (ti =3D as->parms[0].items; ti; ti =3D ti->next) {
>  		if (strncmp(ti->data, "^", 1) =3D=3D 0) {
> +#ifdef HAVE_REGEX_H
> +		    regex_t re;
> +		    char errbuf[256];
> +
> +		    /* XXX -- should just do the compile once! */
> +		    code =3D regcomp(&re, ti->data, REG_BASIC | REG_NOSUB);
> +		    if (code !=3D 0) {
> +			regerror(code, &re, errbuf, sizeof errbuf);
> +			fprintf(STDERR,
> +				"Error in -prefix regular expression: '%s': %s\n",
> +				ti->data, errbuf);
> +			exit(1);
> +		    }
> +		    match =3D (regexec(&re, vllist->name, 0, NULL, 0) =3D=3D 0);
> +		    regfree(&re);
> +#else
>  		    ccode =3D (char *)re_comp(ti->data);
>  		    if (ccode) {
>  			fprintf(STDERR,
> @@ -4020,6 +4073,7 @@
>  			exit(1);
>  		    }
>  		    match =3D (re_exec(vllist->name) =3D=3D 1);
> +#endif
>  		} else {
>  		    match =3D
>  			(strncmp(vllist->name, ti->data, strlen(ti->data)) =3D=3D
> @@ -4040,6 +4094,23 @@
>  	if (match && seenxprefix) {
>  	    for (ti =3D as->parms[4].items; ti; ti =3D ti->next) {
>  		if (strncmp(ti->data, "^", 1) =3D=3D 0) {
> +#ifdef HAVE_REGEX_H
> +		    regex_t re;
> +		    char errbuf[256];
> +
> +		    /* XXX -- should just do the compile once! */
> +		    code =3D regcomp(&re, ti->data, REG_BASIC | REG_NOSUB);
> +		    if (code !=3D 0) {
> +			regerror(code, &re, errbuf, sizeof errbuf);
> +			fprintf(STDERR,
> +				"Error in -xprefix regular expression: '%s': %s\n",
> +				ti->data, errbuf);
> +			exit(1);
> +		    }
> +		    if (regexec(&re, vllist->name, 0, NULL, 0) =3D=3D 0)
> +			    match =3D 0;
> +		    regfree(&re);
> +#else
>  		    ccode =3D (char *)re_comp(ti->data);
>  		    if (ccode) {
>  			fprintf(STDERR,
> @@ -4051,6 +4122,7 @@
>  			match =3D 0;
>  			break;
>  		    }
> +#endif
>  		} else {
>  		    if (strncmp(vllist->name, ti->data, strlen(ti->data)) =3D=3D
>  			0) {
> _______________________________________________
> port-freebsd mailing list
> port-freebsd@openafs.org
> https://lists.openafs.org/mailman/listinfo/port-freebsd

--Boundary-02=_Tveh/Hmdb4VvG5z
Content-Type: application/pgp-signature
Content-Description: signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (FreeBSD)

iD8DBQA/hevTpkWIXJRvi30RAnPPAJ9vfkQDrsULZGTk1wJlwjUTjrnLdACdHBmS
7rY/NKjE9+G1cC8yQKawNEE=
=qDCZ
-----END PGP SIGNATURE-----

--Boundary-02=_Tveh/Hmdb4VvG5z--