Index: openafs/src/afs/afs_call.c
diff -c openafs/src/afs/afs_call.c:1.74.2.26 openafs/src/afs/afs_call.c:1.74.2.30
*** openafs/src/afs/afs_call.c:1.74.2.26	Wed Jan 30 16:18:29 2008
--- openafs/src/afs/afs_call.c	Fri Apr 18 10:06:50 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_call.c,v 1.74.2.26 2008/01/30 21:18:29 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_call.c,v 1.74.2.30 2008/04/18 14:06:50 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 1415,1421 ****
--- 1415,1425 ----
      if (current->thread.flags & THREAD_IA32)
  
  #elif defined(AFS_PPC64_LINUX26_ENV)
+ #if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
      if (current->thread_info->flags & _TIF_32BIT) 
+ #else
+     if (task_thread_info(current)->flags & _TIF_32BIT) 
+ #endif      
  #elif defined(AFS_PPC64_LINUX20_ENV)
      if (current->thread.flags & PPC_FLAG_32BIT) 
  
***************
*** 1871,1882 ****
  #endif
      afs_warn("\n");
  
!     /* Close file only after daemons which can write to it are stopped. */
!     if (afs_cacheInodep) {	/* memcache won't set this */
! 	osi_UFSClose(afs_cacheInodep);	/* Since we always leave it open */
! 	afs_cacheInodep = 0;
!     }
!     return;			/* Just kill daemons for now */
  #ifdef notdef
      shutdown_CB();
      shutdown_AFS();
--- 1875,1884 ----
  #endif
      afs_warn("\n");
  
! #ifdef AFS_AIX51_ENV
!     shutdown_daemons();
! #endif
! 
  #ifdef notdef
      shutdown_CB();
      shutdown_AFS();
***************
*** 1884,1904 ****
      shutdown_rxevent();
      shutdown_rx();
      afs_shutdown_BKG();
-     shutdown_bufferpackage();
- #endif
- #ifdef AFS_AIX51_ENV
-     shutdown_daemons();
  #endif
! #ifdef notdef
      shutdown_cache();
      shutdown_osi();
      shutdown_osinet();
      shutdown_osifile();
      shutdown_vnodeops();
-     shutdown_vfsops();
-     shutdown_exporter();
      shutdown_memcache();
  #if (!defined(AFS_NONFSTRANS) || defined(AFS_AIX_IAUTH_ENV)) && !defined(AFS_OSF_ENV)
      shutdown_nfsclnt();
  #endif
      shutdown_afstest();
--- 1886,1901 ----
      shutdown_rxevent();
      shutdown_rx();
      afs_shutdown_BKG();
  #endif
!     shutdown_bufferpackage();
      shutdown_cache();
      shutdown_osi();
      shutdown_osinet();
      shutdown_osifile();
      shutdown_vnodeops();
      shutdown_memcache();
  #if (!defined(AFS_NONFSTRANS) || defined(AFS_AIX_IAUTH_ENV)) && !defined(AFS_OSF_ENV)
+     shutdown_exporter();
      shutdown_nfsclnt();
  #endif
      shutdown_afstest();
***************
*** 1909,1916 ****
      memset(&afs_stats_cmfullperf, 0, sizeof(struct afs_stats_CMFullPerf));
  */
      afs_warn(" ALL allocated tables\n");
      afs_shuttingdown = 0;
! #endif
  }
  
  void
--- 1906,1921 ----
      memset(&afs_stats_cmfullperf, 0, sizeof(struct afs_stats_CMFullPerf));
  */
      afs_warn(" ALL allocated tables\n");
+ 
+     /* Close file only after daemons which can write to it are stopped. */
+     if (afs_cacheInodep) {	/* memcache won't set this */
+ 	osi_UFSClose(afs_cacheInodep);	/* Since we always leave it open */
+ 	afs_cacheInodep = 0;
+     }
+ 
      afs_shuttingdown = 0;
! 
!     return;			/* Just kill daemons for now */
  }
  
  void
Index: openafs/src/afs/afs_pioctl.c
diff -c openafs/src/afs/afs_pioctl.c:1.81.2.32 openafs/src/afs/afs_pioctl.c:1.81.2.33
*** openafs/src/afs/afs_pioctl.c:1.81.2.32	Sat Mar 22 00:17:33 2008
--- openafs/src/afs/afs_pioctl.c	Fri Apr 18 16:13:32 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.81.2.32 2008/03/22 04:17:33 jaltman Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.81.2.33 2008/04/18 20:13:32 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
***************
*** 284,290 ****
      if (current->thread.flags & THREAD_IA32)
  
  #elif defined(AFS_PPC64_LINUX26_ENV)
!     if (current->thread_info->flags & _TIF_32BIT)
  #elif defined(AFS_PPC64_LINUX20_ENV)
      if (current->thread.flags & PPC_FLAG_32BIT)
  
--- 284,294 ----
      if (current->thread.flags & THREAD_IA32)
  
  #elif defined(AFS_PPC64_LINUX26_ENV)
! #if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
!     if (current->thread_info->flags & _TIF_32BIT) 
! #else
!     if (task_thread_info(current)->flags & _TIF_32BIT) 
! #endif      
  #elif defined(AFS_PPC64_LINUX20_ENV)
      if (current->thread.flags & PPC_FLAG_32BIT)
  
Index: openafs/src/afs/afs_prototypes.h
diff -c openafs/src/afs/afs_prototypes.h:1.53.2.23 openafs/src/afs/afs_prototypes.h:1.53.2.24
*** openafs/src/afs/afs_prototypes.h:1.53.2.23	Tue Feb  5 20:43:44 2008
--- openafs/src/afs/afs_prototypes.h	Fri Apr 18 02:04:01 2008
***************
*** 533,538 ****
--- 533,539 ----
  extern void osi_FreeSmallSpace(void *adata);
  extern void *osi_AllocLargeSpace(size_t size);
  extern void *osi_AllocSmallSpace(size_t size);
+ extern void shutdown_osinet(void);
  
  /* afs_osi_uio.c */
  extern int afsio_copy(struct uio *ainuio, struct uio *aoutuio,
Index: openafs/src/afs/LINUX/osi_groups.c
diff -c openafs/src/afs/LINUX/osi_groups.c:1.25.2.14 openafs/src/afs/LINUX/osi_groups.c:1.25.2.15
*** openafs/src/afs/LINUX/osi_groups.c:1.25.2.14	Mon Mar 10 12:48:56 2008
--- openafs/src/afs/LINUX/osi_groups.c	Sat Apr 19 17:56:11 2008
***************
*** 20,26 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_groups.c,v 1.25.2.14 2008/03/10 16:48:56 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
--- 20,26 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_groups.c,v 1.25.2.15 2008/04/19 21:56:11 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
***************
*** 50,61 ****
--- 50,63 ----
  
      crset(*cr);
  
+ #ifdef STRUCT_TASK_STRUCT_HAS_PARENT
      if (change_parent) {
  	old_info = current->parent->group_info;
  	get_group_info(group_info);
  	current->parent->group_info = group_info;
  	put_group_info(old_info);
      }
+ #endif
  
      return (0);
  }
***************
*** 625,656 ****
  void osi_keyring_init(void)
  {
      struct task_struct *p;
      
      if (__key_type_keyring == NULL) {
! #ifdef EXPORTED_TASKLIST_LOCK
  	if (&tasklist_lock)
  	    read_lock(&tasklist_lock);
- #endif
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
- # ifdef EXPORTED_TASKLIST_LOCK
-  	else
  # endif
  	    rcu_read_lock();
! #endif
  	p = find_task_by_pid(1);
  	if (p && p->user->session_keyring)
  	    __key_type_keyring = p->user->session_keyring->type;
! #ifdef EXPORTED_TASKLIST_LOCK
  	if (&tasklist_lock)
  	    read_unlock(&tasklist_lock);
- #endif
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
- # ifdef EXPORTED_TASKLIST_LOCK
- 	else
  # endif
  	    rcu_read_unlock();
! #endif
      }
  
      register_key_type(&key_type_afs_pag);
  }
--- 627,666 ----
  void osi_keyring_init(void)
  {
      struct task_struct *p;
+ 
+     /* If we can't lock the tasklist, either with its explicit lock,
+      * or by using the RCU lock, then we can't safely work out the 
+      * type of a keyring. So, we have to rely on the weak reference. 
+      * If that's not available, then keyring based PAGs won't work.
+      */
      
+ #if defined(EXPORTED_TASKLIST_LOCK) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) && defined(EXPORTED_RCU_READ_LOCK))
      if (__key_type_keyring == NULL) {
! # ifdef EXPORTED_TASKLIST_LOCK
  	if (&tasklist_lock)
  	    read_lock(&tasklist_lock);
  # endif
+ # if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) && defined(EXPORTED_RCU_READ_LOCK))
+ #  ifdef EXPORTED_TASKLIST_LOCK
+  	else
+ #  endif
  	    rcu_read_lock();
! # endif
  	p = find_task_by_pid(1);
  	if (p && p->user->session_keyring)
  	    __key_type_keyring = p->user->session_keyring->type;
! # ifdef EXPORTED_TASKLIST_LOCK
  	if (&tasklist_lock)
  	    read_unlock(&tasklist_lock);
  # endif
+ # if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) && defined(EXPORTED_RCU_READ_LOCK))
+ #  ifdef EXPORTED_TASKLIST_LOCK
+ 	else
+ #  endif
  	    rcu_read_unlock();
! # endif
      }
+ #endif
  
      register_key_type(&key_type_afs_pag);
  }
Index: openafs/src/afs/LINUX/osi_vnodeops.c
diff -c openafs/src/afs/LINUX/osi_vnodeops.c:1.81.2.63 openafs/src/afs/LINUX/osi_vnodeops.c:1.81.2.64
*** openafs/src/afs/LINUX/osi_vnodeops.c:1.81.2.63	Wed Apr  2 14:27:13 2008
--- openafs/src/afs/LINUX/osi_vnodeops.c	Tue Apr 15 08:29:54 2008
***************
*** 22,28 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v 1.81.2.63 2008/04/02 18:27:13 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
--- 22,28 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v 1.81.2.64 2008/04/15 12:29:54 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
***************
*** 803,810 ****
  	if (vcp == afs_globalVp)
  	    goto good_dentry;
  
! 	if (*dp->d_name.name != '/' && vcp->mvstat == 2)	/* root vnode */
! 	    check_bad_parent(dp);	/* check and correct mvid */
  
  #ifdef notdef
  	/* If the last looker changes, we should make sure the current
--- 803,816 ----
  	if (vcp == afs_globalVp)
  	    goto good_dentry;
  
! 	if (vcp->mvstat == 1) {         /* mount point */
! 	    if (vcp->mvid && (vcp->states & CMValid)) {
! 		/* a mount point, not yet replaced by its directory */
! 		goto bad_dentry;
! 	    }
! 	} else
! 	    if (*dp->d_name.name != '/' && vcp->mvstat == 2) /* root vnode */
! 		check_bad_parent(dp);	/* check and correct mvid */
  
  #ifdef notdef
  	/* If the last looker changes, we should make sure the current
Index: openafs/src/afs/VNOPS/afs_vnop_lookup.c
diff -c openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50.2.20 openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50.2.21
*** openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.50.2.20	Fri Mar  7 12:34:08 2008
--- openafs/src/afs/VNOPS/afs_vnop_lookup.c	Tue Apr 15 08:29:56 2008
***************
*** 18,24 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.50.2.20 2008/03/07 17:34:08 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 18,24 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.50.2.21 2008/04/15 12:29:56 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 1120,1125 ****
--- 1120,1126 ----
      register afs_int32 code;
      register afs_int32 bulkcode = 0;
      int pass = 0, hit = 0;
+     int force_eval = afs_fakestat_enable ? 0 : 1;
      long dirCookie;
      extern afs_int32 afs_mariner;	/*Writing activity to log? */
      afs_hyper_t versionNo;
***************
*** 1442,1449 ****
      }				/* sub-block just to reduce stack usage */
  
      if (tvc) {
- 	int force_eval = afs_fakestat_enable ? 0 : 1;
- 
  	if (adp->states & CForeign)
  	    tvc->states |= CForeign;
  	tvc->parentVnode = adp->fid.Fid.Vnode;
--- 1443,1448 ----
***************
*** 1464,1469 ****
--- 1463,1471 ----
  		force_eval = 1;
  	    ReleaseReadLock(&tvc->lock);
  	}
+ 	if (tvc->mvstat == 1 && (tvc->states & CMValid) && tvc->mvid != NULL)
+ 	  force_eval = 1; /* This is now almost for free, get it correct */
+ 
  #if defined(UKERNEL) && defined(AFS_WEB_ENHANCEMENTS)
  	if (!(flags & AFS_LOOKUP_NOEVAL))
  	    /* don't eval mount points */
***************
*** 1589,1595 ****
  	     * rather than the vc of the mount point itself.  we can still find the
  	     * mount point's vc in the vcache by its fid. */
  #endif /* UKERNEL && AFS_WEB_ENHANCEMENTS */
! 	    if (!hit) {
  		osi_dnlc_enter(adp, aname, tvc, &versionNo);
  	    } else {
  #ifdef AFS_LINUX20_ENV
--- 1591,1597 ----
  	     * rather than the vc of the mount point itself.  we can still find the
  	     * mount point's vc in the vcache by its fid. */
  #endif /* UKERNEL && AFS_WEB_ENHANCEMENTS */
! 	    if (!hit && force_eval) {
  		osi_dnlc_enter(adp, aname, tvc, &versionNo);
  	    } else {
  #ifdef AFS_LINUX20_ENV
Index: openafs/src/aklog/klog.c
diff -c openafs/src/aklog/klog.c:1.3.4.6 openafs/src/aklog/klog.c:1.3.4.9
*** openafs/src/aklog/klog.c:1.3.4.6	Tue Apr  1 13:44:52 2008
--- openafs/src/aklog/klog.c	Fri Apr 18 16:50:30 2008
***************
*** 309,334 ****
  {
      krb5_error_code code;
      int i, type;
! #ifndef USING_HEIMDAL
      krb5_prompt_type *types;
  #endif
      struct kp_arg *kparg = (struct kp_arg *) a;
      code = krb5_prompter_posix(context, a, name, banner, num_prompts, prompts);
      if (code) return code;
! #ifndef USING_HEIMDAL
      if ((types = krb5_get_prompt_types(context)))
  #endif
      for (i = 0; i < num_prompts; ++i) {
! #ifdef USING_HEIMDAL
  	type = prompts[i].type;
  #else
! 	type = types[i];
  #endif
  #if 0
! 	printf ("i%d t%d <%.*s>\n", i,
! type,
! prompts[i].reply->length,
! prompts[i].reply->data);
  #endif
  	switch(type) {
  	case KRB5_PROMPT_TYPE_PASSWORD:
--- 309,340 ----
  {
      krb5_error_code code;
      int i, type;
! #if !defined(USING_HEIMDAL) && defined(HAVE_KRB5_GET_PROMPT_TYPES)
      krb5_prompt_type *types;
  #endif
      struct kp_arg *kparg = (struct kp_arg *) a;
      code = krb5_prompter_posix(context, a, name, banner, num_prompts, prompts);
      if (code) return code;
! #if !defined(USING_HEIMDAL) && defined(HAVE_KRB5_GET_PROMPT_TYPES)
      if ((types = krb5_get_prompt_types(context)))
  #endif
      for (i = 0; i < num_prompts; ++i) {
! #if !defined(USING_HEIMDAL) 
! #if defined(HAVE_KRB5_GET_PROMPT_TYPES)
! 	type = types[i];
! #elif defined(HAVE_KRB5_PROMPT_TYPE)	
  	type = prompts[i].type;
  #else
! 	/* AIX 5.3 krb5_get_prompt_types is missing. Um... */
! 	type = ((i == 1)&&(num_prompts == 2)) ? 
! 	  KRB5_PROMPT_TYPE_NEW_PASSWORD_AGAIN : KRB5_PROMPT_TYPE_PASSWORD;
! #endif
! #else
! 	type = prompts[i].type;
  #endif
  #if 0
! 	printf ("i%d t%d <%.*s>\n", i, type, prompts[i].reply->length,
! 		prompts[i].reply->data);
  #endif
  	switch(type) {
  	case KRB5_PROMPT_TYPE_PASSWORD:
***************
*** 385,399 ****
      Silent = (as->parms[aSILENT].items ? 1 : 0);
  
      if (Silent) {
! 	set_com_err_hook(silent_errors);
      }
  
      if ((code = krb5_init_context(&k5context))) {
! 	com_err(rn, code, "while initializing Kerberos 5 library");
  	KLOGEXIT(code);
      }
      if ((code = rx_Init(0))) {
! 	com_err(rn, code, "while initializing rx");
  	KLOGEXIT(code);
      }
      initialize_U_error_table();
--- 391,405 ----
      Silent = (as->parms[aSILENT].items ? 1 : 0);
  
      if (Silent) {
! 	afs_set_com_err_hook(silent_errors);
      }
  
      if ((code = krb5_init_context(&k5context))) {
! 	afs_com_err(rn, code, "while initializing Kerberos 5 library");
  	KLOGEXIT(code);
      }
      if ((code = rx_Init(0))) {
! 	afs_com_err(rn, code, "while initializing rx");
  	KLOGEXIT(code);
      }
      initialize_U_error_table();
***************
*** 403,409 ****
      initialize_ACFG_error_table();
      /* initialize_rx_error_table(); */
      if (!(tdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH))) {
! 	com_err(rn, 0, "can't get afs configuration (afsconf_Open(%s))",
  	    rn, AFSDIR_CLIENT_ETC_DIRPATH);
  	KLOGEXIT(1);
      }
--- 409,415 ----
      initialize_ACFG_error_table();
      /* initialize_rx_error_table(); */
      if (!(tdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH))) {
! 	afs_com_err(rn, 0, "can't get afs configuration (afsconf_Open(%s))",
  	    rn, AFSDIR_CLIENT_ETC_DIRPATH);
  	KLOGEXIT(1);
      }
***************
*** 429,437 ****
      cell = as->parms[aCELL].items ? as->parms[aCELL].items->data : 0;
      if ((code = afsconf_GetCellInfo(tdir, cell, "afsprot", cellconfig))) {
  	if (cell)
! 	    com_err(rn, code, "Can't get cell information for '%s'", cell);
  	else
! 	    com_err(rn, code, "Can't get determine local cell!");
  	KLOGEXIT(code);
      }
  
--- 435,443 ----
      cell = as->parms[aCELL].items ? as->parms[aCELL].items->data : 0;
      if ((code = afsconf_GetCellInfo(tdir, cell, "afsprot", cellconfig))) {
  	if (cell)
! 	    afs_com_err(rn, code, "Can't get cell information for '%s'", cell);
  	else
! 	    afs_com_err(rn, code, "Can't get determine local cell!");
  	KLOGEXIT(code);
      }
  
***************
*** 439,451 ****
  	code = krb5_set_default_realm(k5context,
  		(const char *) as->parms[aKRBREALM].items);
  	if (code) {
! 	    com_err(rn, code, "Can't make <%s> the default realm",
  		as->parms[aKRBREALM].items);
  	    KLOGEXIT(code);
  	}
      }
      else if ((code = krb5_get_host_realm(k5context, cellconfig->hostName[0], &hrealms))) {
! 	com_err(rn, code, "Can't get realm for host <%s> in cell <%s>\n",
  		cellconfig->hostName[0], cellconfig->name);
  	KLOGEXIT(code);
      } else {
--- 445,457 ----
  	code = krb5_set_default_realm(k5context,
  		(const char *) as->parms[aKRBREALM].items);
  	if (code) {
! 	    afs_com_err(rn, code, "Can't make <%s> the default realm",
  		as->parms[aKRBREALM].items);
  	    KLOGEXIT(code);
  	}
      }
      else if ((code = krb5_get_host_realm(k5context, cellconfig->hostName[0], &hrealms))) {
! 	afs_com_err(rn, code, "Can't get realm for host <%s> in cell <%s>\n",
  		cellconfig->hostName[0], cellconfig->name);
  	KLOGEXIT(code);
      } else {
***************
*** 453,459 ****
  	    code = krb5_set_default_realm(k5context,
  		    *hrealms);
  	    if (code) {
! 		com_err(rn, code, "Can't make <%s> the default realm",
  		    *hrealms);
  		KLOGEXIT(code);
  	    }
--- 459,465 ----
  	    code = krb5_set_default_realm(k5context,
  		    *hrealms);
  	    if (code) {
! 		afs_com_err(rn, code, "Can't make <%s> the default realm",
  		    *hrealms);
  		KLOGEXIT(code);
  	    }
***************
*** 469,475 ****
  	struct passwd *pw;
  	pw = getpwuid(id);
  	if (pw == 0) {
! 	    com_err(rn, 0,
  		"Can't figure out your name from your user id (%d).", id);
  	    if (!Silent)
  		fprintf(stderr, "%s: Try providing the user name.\n", rn);
--- 475,481 ----
  	struct passwd *pw;
  	pw = getpwuid(id);
  	if (pw == 0) {
! 	    afs_com_err(rn, 0,
  		"Can't figure out your name from your user id (%d).", id);
  	    if (!Silent)
  		fprintf(stderr, "%s: Try providing the user name.\n", rn);
***************
*** 479,485 ****
      }
      code = krb5_parse_name(k5context, pname, &princ);
      if (code) {
! 	com_err(rn, code, "Can't parse principal <%s>", pname);
  	KLOGEXIT(code);
      }
  
--- 485,491 ----
      }
      code = krb5_parse_name(k5context, pname, &princ);
      if (code) {
! 	afs_com_err(rn, code, "Can't parse principal <%s>", pname);
  	KLOGEXIT(code);
      }
  
***************
*** 575,585 ****
  	if (krb5_get_default_realm(k5context, &r))
  	    r = 0;
  	if (service)
! 	    com_err(rn, code, "Unable to authenticate to use %s", service);
  	else if (r)
! 	    com_err(rn, code, "Unable to authenticate in realm %s", r);
  	else
! 	    com_err(rn, code, "Unable to authenticate to use cell %s",
  		cellconfig->name);
  	if (r) free(r);
  	KLOGEXIT(code);
--- 581,591 ----
  	if (krb5_get_default_realm(k5context, &r))
  	    r = 0;
  	if (service)
! 	    afs_com_err(rn, code, "Unable to authenticate to use %s", service);
  	else if (r)
! 	    afs_com_err(rn, code, "Unable to authenticate in realm %s", r);
  	else
! 	    afs_com_err(rn, code, "Unable to authenticate to use cell %s",
  		cellconfig->name);
  	if (r) free(r);
  	KLOGEXIT(code);
***************
*** 610,616 ****
  	    break;
  	Failed:
  	    if (code)
! 		com_err(rn, code, what);
  	    if (writeTicketFile) {
  		if (cc) {
  		    krb5_cc_close(k5context, cc);
--- 616,622 ----
  	    break;
  	Failed:
  	    if (code)
! 		afs_com_err(rn, code, what);
  	    if (writeTicketFile) {
  		if (cc) {
  		    krb5_cc_close(k5context, cc);
***************
*** 626,632 ****
  	    mcred->client = princ;
  	    code = krb5_parse_name(k5context, service, &mcred->server);
  	    if (code) {
! 		com_err(rn, code, "Unable to parse service <%s>\n", service);
  		KLOGEXIT(code);
  	    }
  	    if (tofree) { free(tofree); tofree = 0; }
--- 632,638 ----
  	    mcred->client = princ;
  	    code = krb5_parse_name(k5context, service, &mcred->server);
  	    if (code) {
! 		afs_com_err(rn, code, "Unable to parse service <%s>\n", service);
  		KLOGEXIT(code);
  	    }
  	    if (tofree) { free(tofree); tofree = 0; }
***************
*** 643,649 ****
  	afscred = outcred;
      }
      if (code) {
! 	com_err(rn, code, "Unable to get credentials to use %s", outname);
  	KLOGEXIT(code);
      }
  
--- 649,655 ----
  	afscred = outcred;
      }
      if (code) {
! 	afs_com_err(rn, code, "Unable to get credentials to use %s", outname);
  	KLOGEXIT(code);
      }
  
***************
*** 656,662 ****
  	strncpy(aserver->cell, cellconfig->name, MAXKTCREALMLEN-1);
  	code = ktc_SetK5Token(k5context, aserver, afscred, viceid, dosetpag);
  	if (code) {
! 	    com_err(rn, code, "Unable to store tokens for cell %s\n",
  		cellconfig->name);
  	    KLOGEXIT(1);
  	}
--- 662,668 ----
  	strncpy(aserver->cell, cellconfig->name, MAXKTCREALMLEN-1);
  	code = ktc_SetK5Token(k5context, aserver, afscred, viceid, dosetpag);
  	if (code) {
! 	    afs_com_err(rn, code, "Unable to store tokens for cell %s\n",
  		cellconfig->name);
  	    KLOGEXIT(1);
  	}
***************
*** 672,678 ****
  	    if (afs_krb5_skip_ticket_wrapper(afscred->ticket.data,
  			afscred->ticket.length, &enc_part->data,
  			&enc_part->length)) {
! 		com_err(rn, 0, "Can't unwrap %s AFS credential",
  		    cellconfig->name);
  		KLOGEXIT(1);
  	    }
--- 678,684 ----
  	    if (afs_krb5_skip_ticket_wrapper(afscred->ticket.data,
  			afscred->ticket.length, &enc_part->data,
  			&enc_part->length)) {
! 		afs_com_err(rn, 0, "Can't unwrap %s AFS credential",
  		    cellconfig->name);
  		KLOGEXIT(1);
  	    }
***************
*** 698,704 ****
  	    k5_to_k4_name(k5context, afscred->client, aclient);
  	    code = whoami(atoken, cellconfig, aclient, &viceid);
  	    if (code) {
! 		com_err(rn, code, "Can't get your viceid", cellconfig->name);
  		*aclient->name = 0;
  	    } else
  		snprintf(aclient->name, MAXKTCNAMELEN-1, "AFS ID %d", viceid);
--- 704,710 ----
  	    k5_to_k4_name(k5context, afscred->client, aclient);
  	    code = whoami(atoken, cellconfig, aclient, &viceid);
  	    if (code) {
! 		afs_com_err(rn, code, "Can't get your viceid", cellconfig->name);
  		*aclient->name = 0;
  	    } else
  		snprintf(aclient->name, MAXKTCNAMELEN-1, "AFS ID %d", viceid);
***************
*** 707,713 ****
  	    k5_to_k4_name(k5context, afscred->client, aclient);
  	code = ktc_SetToken(aserver, atoken, aclient, dosetpag);
  	if (code) {
! 	    com_err(rn, code, "Unable to store tokens for cell %s\n",
  		cellconfig->name);
  	    KLOGEXIT(1);
  	}
--- 713,719 ----
  	    k5_to_k4_name(k5context, afscred->client, aclient);
  	code = ktc_SetToken(aserver, atoken, aclient, dosetpag);
  	if (code) {
! 	    afs_com_err(rn, code, "Unable to store tokens for cell %s\n",
  		cellconfig->name);
  	    KLOGEXIT(1);
  	}
Index: openafs/src/bucoord/dump.c
diff -c openafs/src/bucoord/dump.c:1.12.2.5 openafs/src/bucoord/dump.c:1.12.2.6
*** openafs/src/bucoord/dump.c:1.12.2.5	Mon Mar 10 18:35:34 2008
--- openafs/src/bucoord/dump.c	Wed Apr  9 12:40:16 2008
***************
*** 15,21 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/dump.c,v 1.12.2.5 2008/03/10 22:35:34 shadow Exp $");
  
  #include <sys/types.h>
  #include <afs/cmd.h>
--- 15,21 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/dump.c,v 1.12.2.6 2008/04/09 16:40:16 shadow Exp $");
  
  #include <sys/types.h>
  #include <afs/cmd.h>
***************
*** 225,231 ****
  	free(tdump->portOffset);
      tdump->flags &= ~BC_DI_INUSE;
  
!     return code;
  }
  
  /* bc_StartDmpRst
--- 225,231 ----
  	free(tdump->portOffset);
      tdump->flags &= ~BC_DI_INUSE;
  
!     return (void *)code;
  }
  
  /* bc_StartDmpRst
Index: openafs/src/butc/lwps.c
diff -c openafs/src/butc/lwps.c:1.12.2.6 openafs/src/butc/lwps.c:1.12.2.7
*** openafs/src/butc/lwps.c:1.12.2.6	Mon Mar 10 18:35:34 2008
--- openafs/src/butc/lwps.c	Wed Apr  9 12:40:17 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/lwps.c,v 1.12.2.6 2008/03/10 22:35:34 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/lwps.c,v 1.12.2.7 2008/04/09 16:40:17 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
***************
*** 1920,1926 ****
  
      FreeNode(taskId);
      LeaveDeviceQueue(deviceLatch);
!     return (code);
  }
  
  /* this is just scaffolding, creates new tape label with name <tapeName> */
--- 1920,1926 ----
  
      FreeNode(taskId);
      LeaveDeviceQueue(deviceLatch);
!     return (void *)(code);
  }
  
  /* this is just scaffolding, creates new tape label with name <tapeName> */
***************
*** 2282,2288 ****
  
      free(labelIfPtr);
      LeaveDeviceQueue(deviceLatch);
!     return (code);
  }
  
  /* PrintTapeLabel
--- 2282,2288 ----
  
      free(labelIfPtr);
      LeaveDeviceQueue(deviceLatch);
!     return (void *)(code);
  }
  
  /* PrintTapeLabel
Index: openafs/src/butc/tcudbprocs.c
diff -c openafs/src/butc/tcudbprocs.c:1.14.2.5 openafs/src/butc/tcudbprocs.c:1.14.2.7
*** openafs/src/butc/tcudbprocs.c:1.14.2.5	Mon Mar 10 18:35:34 2008
--- openafs/src/butc/tcudbprocs.c	Fri Apr 18 09:57:31 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcudbprocs.c,v 1.14.2.5 2008/03/10 22:35:34 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcudbprocs.c,v 1.14.2.7 2008/04/18 13:57:31 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 745,751 ****
  
      free(saveDbIfPtr);
      LeaveDeviceQueue(deviceLatch);
!     return (code);
  }
  
  struct rstTapeInfo {
--- 745,751 ----
  
      free(saveDbIfPtr);
      LeaveDeviceQueue(deviceLatch);
!     return (void *)(code);
  }
  
  struct rstTapeInfo {
***************
*** 1021,1027 ****
  void *
  restoreDbFromTape(void *param)
  {
!     afs_uint32 taskId = (void *)param;
      afs_int32 code = 0;
      afs_int32 i;
      struct butm_tapeInfo tapeInfo;
--- 1021,1027 ----
  void *
  restoreDbFromTape(void *param)
  {
!     afs_uint32 taskId = (afs_uint32) param;
      afs_int32 code = 0;
      afs_int32 i;
      struct butm_tapeInfo tapeInfo;
Index: openafs/src/cf/kerberos.m4
diff -c openafs/src/cf/kerberos.m4:1.1.2.14 openafs/src/cf/kerberos.m4:1.1.2.16
*** openafs/src/cf/kerberos.m4:1.1.2.14	Fri Jan  4 23:48:41 2008
--- openafs/src/cf/kerberos.m4	Fri Apr 18 16:50:28 2008
***************
*** 1,5 ****
  dnl
! dnl $Id: kerberos.m4,v 1.1.2.14 2008/01/05 04:48:41 shadow Exp $
  dnl
  dnl Kerberos autoconf glue
  dnl
--- 1,5 ----
  dnl
! dnl $Id: kerberos.m4,v 1.1.2.16 2008/04/18 20:50:28 shadow Exp $
  dnl
  dnl Kerberos autoconf glue
  dnl
***************
*** 58,64 ****
  	CPPFLAGS="$CPPFLAGS $KRB5CFLAGS"
  	save_LIBS="$LIBS"
  	LIBS="$LIBS $KRB5LIBS"
! 	AC_CHECK_FUNCS([add_to_error_table add_error_table krb5_princ_size krb5_principal_get_comp_string encode_krb5_enc_tkt_part encode_krb5_ticket krb5_c_encrypt krb5_c_encrypt_length krb5_cc_register krb5_decode_ticket])
  	AC_CHECK_FUNCS([krb5_524_convert_creds], ,
  	    [AC_CHECK_FUNCS([krb524_convert_creds_kdc], ,
  		[AC_CHECK_LIB([krb524], [krb524_convert_creds_kdc],
--- 58,64 ----
  	CPPFLAGS="$CPPFLAGS $KRB5CFLAGS"
  	save_LIBS="$LIBS"
  	LIBS="$LIBS $KRB5LIBS"
! 	AC_CHECK_FUNCS([add_to_error_table add_error_table krb5_princ_size krb5_principal_get_comp_string encode_krb5_enc_tkt_part encode_krb5_ticket krb5_c_encrypt krb5_c_encrypt_length krb5_cc_register krb5_decode_ticket krb5_get_prompt_types])
  	AC_CHECK_FUNCS([krb5_524_convert_creds], ,
  	    [AC_CHECK_FUNCS([krb524_convert_creds_kdc], ,
  		[AC_CHECK_LIB([krb524], [krb524_convert_creds_kdc],
***************
*** 91,102 ****
--- 91,116 ----
  ac_cv_krb5_creds_session_exists=no)])
  AC_MSG_RESULT($ac_cv_krb5_creds_session_exists)
  
+ AC_MSG_CHECKING(for krb5_prompt.type existence)
+ AC_CACHE_VAL(ac_cv_krb5_prompt_type_exists,
+ [
+ AC_TRY_COMPILE(
+ [#include <krb5.h>],
+ [krb5_prompt _p;
+ printf("%x\n", _p.type);], 
+ ac_cv_krb5_prompt_type_exists=yes,
+ ac_cv_krb5_prompt_type_exists=no)])
+ AC_MSG_RESULT($ac_cv_krb5_prompt_type_exists)
+ 	
  if test "x$ac_cv_krb5_creds_keyblock_exists" = "xyes"; then
  	AC_DEFINE(HAVE_KRB5_CREDS_KEYBLOCK, 1, [define if krb5_creds has keyblock])
  fi
  if test "x$ac_cv_krb5_creds_session_exists" = "xyes"; then
  	AC_DEFINE(HAVE_KRB5_CREDS_SESSION, 1, [define if krb5_creds has session])
  fi
+ if test "x$ac_cv_krb5_prompt_type_exists" = "xyes"; then
+ 	AC_DEFINE(HAVE_KRB5_PROMPT_TYPE, 1, [define if krb5_prompt has type])
+ fi
  	
  dnl	AC_CHECK_MEMBERS([krb5_creds.keyblock, krb5_creds.session],,, [#include <krb5.h>])
  	CPPFLAGS="$save_CPPFLAGS"
Index: openafs/src/cf/linux-test4.m4
diff -c openafs/src/cf/linux-test4.m4:1.20.2.46 openafs/src/cf/linux-test4.m4:1.20.2.47
*** openafs/src/cf/linux-test4.m4:1.20.2.46	Sun Apr  6 23:49:12 2008
--- openafs/src/cf/linux-test4.m4	Sat Apr 19 17:56:08 2008
***************
*** 980,982 ****
--- 980,995 ----
        ac_cv_linux_struct_nameidata_has_path=no)])
    AC_MSG_RESULT($ac_cv_linux_struct_nameidata_has_path)])
  
+ AC_DEFUN([LINUX_EXPORTS_RCU_READ_LOCK], [
+   AC_MSG_CHECKING([if rcu_read_lock is usable])
+   AC_CACHE_VAL([ac_cv_linux_exports_rcu_read_lock], [
+     AC_TRY_KBUILD(
+ [#include <linux/rcupdate.h>],
+ [rcu_read_lock();],
+       ac_cv_linux_exports_rcu_read_lock=yes,
+       ac_cv_linux_exports_rcu_read_lock=no)])
+   AC_MSG_RESULT($ac_cv_linux_exports_rcu_read_lock)
+   if test "x$ac_cv_linux_exports_rcu_read_lock" = "xyes"; then
+     AC_DEFINE([EXPORTED_RCU_READ_LOCK], 1, [define if rcu_read_lock() is usable])
+   fi])
+  
Index: openafs/src/packaging/RedHat/makesrpm.pl
diff -c openafs/src/packaging/RedHat/makesrpm.pl:1.1.4.3 openafs/src/packaging/RedHat/makesrpm.pl:1.1.4.4
*** openafs/src/packaging/RedHat/makesrpm.pl:1.1.4.3	Tue Jan 15 18:45:14 2008
--- openafs/src/packaging/RedHat/makesrpm.pl	Tue Apr  8 14:36:28 2008
***************
*** 19,25 ****
  my $cellservdb = shift;
  
  if (!$srcball && !$docball) {
!   printf "Usage:  <version> <src.tar.gz> <doc.tar.gz> [<relnotes> [<changelog> [<cellservdb>]]]\n";
    exit(1);
  }
  
--- 19,25 ----
  my $cellservdb = shift;
  
  if (!$srcball && !$docball) {
!   printf "Usage:  makesrpm <src.tar.gz> <doc.tar.gz> [<relnotes> [<changelog> [<cellservdb>]]]\n";
    exit(1);
  }
  
***************
*** 42,71 ****
  my $srcdir = $tmpdir."/".$vdir;
  
  # Work out which version we're dealing with from the configure.in file
! my $version;
  my $fh = new IO::File $srcdir."/configure.in"
    or die "Unable to find unpacked configure.in file";
  while(<$fh>) {
    if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
!     $version = $1;
!     last;
    }
  }
  undef $fh;
  
  # Build the RPM root
  
! print "Building version $version\n";
  File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
  		     $tmpdir."/rpmdir/SRPMS",
  		     $tmpdir."/rpmdir/SOURCES"], 0, 0755);
  
  File::Copy::copy($srcball, 
! 		 $tmpdir."/rpmdir/SOURCES/openafs-$version-src.tar.bz2")
    or die "Unable to copy $srcball into position\n";
  
  File::Copy::copy($docball,
! 		 $tmpdir."/rpmdir/SOURCES/openafs-$version-doc.tar.bz2")
    or die "Unable to copy $docball into position\n";
  
  # Populate it with all the stuff in the packaging directory, except the 
--- 42,81 ----
  my $srcdir = $tmpdir."/".$vdir;
  
  # Work out which version we're dealing with from the configure.in file
! my $afsversion;
! my $linuxver;
! my $linuxrel;
  my $fh = new IO::File $srcdir."/configure.in"
    or die "Unable to find unpacked configure.in file";
  while(<$fh>) {
    if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
!     $afsversion = $1;
!     next;
!   }
!   if (/LINUX_PKGVER=(.*)/) {
!     $linuxver = $1;
!     next;
!   }
!   if (/LINUX_PKGREL=(.*)/) {
!     $linuxrel = $1;
!     next;
    }
  }
  undef $fh;
  
  # Build the RPM root
  
! print "Building version $afsversion\n";
  File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
  		     $tmpdir."/rpmdir/SRPMS",
  		     $tmpdir."/rpmdir/SOURCES"], 0, 0755);
  
  File::Copy::copy($srcball, 
! 		 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-src.tar.bz2")
    or die "Unable to copy $srcball into position\n";
  
  File::Copy::copy($docball,
! 		 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-doc.tar.bz2")
    or die "Unable to copy $docball into position\n";
  
  # Populate it with all the stuff in the packaging directory, except the 
***************
*** 90,98 ****
  
  # Create the specfile. Use sed for this, cos its easier
  system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
!        "sed -e 's/\@VERSION\@/$version/g' ".
!        "    -e 's/\%define afsvers.*/%define afsvers $version/g' ".
!        "    -e 's/\%define pkgvers.*/%define pkgvers $version/g' > ".
         $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
    or die "sed failed : $!\n";
  
--- 100,110 ----
  
  # Create the specfile. Use sed for this, cos its easier
  system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
!        "sed -e 's/\@VERSION\@/$afsversion/g' ".
!        "    -e 's/\@LINUX_PKGVER\@/$linuxver/g' ".
!        "    -e 's/\@LINUX_PKGREL\@/$linuxrel/g' ".
!        "    -e 's/\%define afsvers.*/%define afsvers $afsversion/g' ".
!        "    -e 's/\%define pkgvers.*/%define pkgvers $linuxver/g' > ".
         $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
    or die "sed failed : $!\n";
  
***************
*** 106,116 ****
  
  if ($relnotes) {
    File::Copy::copy($relnotes,
! 		   $tmpdir."/rpmdir/SOURCES/RELNOTES-$version")
    or die "Unable to copy $relnotes into position\n";
  } else {
    print "WARNING: No release notes provided. Using empty file\n";
!   system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$version");
  }
  
  if ($changelog) {
--- 118,128 ----
  
  if ($relnotes) {
    File::Copy::copy($relnotes,
! 		   $tmpdir."/rpmdir/SOURCES/RELNOTES-$afsversion")
    or die "Unable to copy $relnotes into position\n";
  } else {
    print "WARNING: No release notes provided. Using empty file\n";
!   system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$afsversion");
  }
  
  if ($changelog) {
***************
*** 128,136 ****
    or die "rpmbuild failed : $!\n";
  
  # Copy it out to somewhere useful
! File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$version-1.1.src.rpm",
! 	         "openafs-$version-1.1.src.rpm")
    or die "Unable to copy output RPM : $!\n";
  
! print "SRPM is openafs-$version-1.1.src.rpm\n";
  
--- 140,148 ----
    or die "rpmbuild failed : $!\n";
  
  # Copy it out to somewhere useful
! File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-1.$linuxrel.src.rpm",
! 	         "openafs-$linuxver-1.$linuxrel.src.rpm")
    or die "Unable to copy output RPM : $!\n";
  
! print "SRPM is openafs-$linuxver-1.$linuxrel.src.rpm\n";
  
Index: openafs/src/packaging/RedHat/mockbuild.pl
diff -c openafs/src/packaging/RedHat/mockbuild.pl:1.1.2.2 openafs/src/packaging/RedHat/mockbuild.pl:1.1.2.4
*** openafs/src/packaging/RedHat/mockbuild.pl:1.1.2.2	Thu Feb 14 14:30:10 2008
--- openafs/src/packaging/RedHat/mockbuild.pl	Tue Apr 22 08:50:56 2008
***************
*** 17,25 ****
  my $stashbase="/disk/scratch/repository/";
  my $mockcommand = "/usr/bin/mock";
  my $buildall = 0;
! 
  my @newrpms;
  
  my %platconf = ( "fedora-5-i386" => { osver => "fc5",
  				      kmod => '1',
  				      basearch => 'i386',
--- 17,69 ----
  my $stashbase="/disk/scratch/repository/";
  my $mockcommand = "/usr/bin/mock";
  my $buildall = 0;
! my $ignorerelease = 1;
  my @newrpms;
  
+ # Words cannot describe how gross this is. Yum no longer provides usable
+ # output, so we need to call the python interface. At some point this
+ # probably means this script should be entirely rewritten in python,
+ # but this is not that point.
+ 
+ sub findKernelModules {
+   my ($root, $uname, @modules) = @_;
+ 
+   my $modlist = join(",",map { "'".$_."'" } @modules);
+   my $python = <<EOS;
+ import yum;
+ import sys;
+ base = yum.YumBase();
+ base.doConfigSetup('$root/etc/yum.conf', '$root');
+ base.doRepoSetup();
+ base.doSackSetup();
+ EOS
+ 
+   if ($uname) {
+     $python.= <<EOS;
+ 
+ for pkg, values in base.searchPackageProvides(['kernel-devel-uname-r']).items():
+   if values[0].find('kernel-devel-uname-r = ') != -1:
+     print '%s.%s %s' % (pkg.name, pkg.arch, values[0].replace('kernel-devel-uname-r = ',''));
+ 
+ EOS
+   } else {
+     $python.= <<EOS;
+ 
+ print '\\n'.join(['%s.%s %s' % (x.name, x.arch, x.printVer()) for x in base.searchPackageProvides([$modlist]).keys()]);
+ 
+ EOS
+   }
+ 
+ #  my $output = `$suser -c "python -c \\\"$python\\\"" `;
+   my $output = `python -c "$python"`;
+ 
+   die "Python script to figure out available kernels failed : $output" 
+     if $?;
+ 
+   return $output;
+ }
+ 
+ 
  my %platconf = ( "fedora-5-i386" => { osver => "fc5",
  				      kmod => '1',
  				      basearch => 'i386',
***************
*** 80,107 ****
  				   	basearch => 'x86_64',
  				        updaterepo => 'update',
  					results => "el5/x86_64" },
! #		 "fedora-development-i386" => { osver => "fcd",
! #					  kmod => '1',
! #					  basearch => 'i386',
! #					  results => 'fedora-devel/i386'},
! #		 "fedora-development-x86_64" => { osver => "fcd",
! #					    kmod => '1',
! #					    basearch => 'x86_64',
! #					    results => 'fedora-devel/x86_64'} 
  );
  
  # The following are kernels that we can't successfully build modules against
  # due to issues in the packaged kernel-devel RPM.
  
  my %badkernels = (
! 	"2.6.21-2950.fc8" => { "xen" => 1} # Missing build ID
  );
  
  my @platforms = @ARGV;
  my $srpm = pop @platforms;
  
! if (!$srpm || $#platforms==-1) {
!   print "Usage: $0 <platform> [<platform> [<platform> ...] ]  <srpm>\n";
    print "    Platform may be:\n";
    foreach ("all", sort(keys(%platconf))) { print "        ".$_."\n"; };
    exit(1);
--- 124,158 ----
  				   	basearch => 'x86_64',
  				        updaterepo => 'update',
  					results => "el5/x86_64" },
! 		 "fedora-development-i386" => { osver => "fcd",
! 					  kmod => '1',
! 					  basearch => 'i386',
! 					  results => 'fedora-devel/i386'},
! 		 "fedora-development-x86_64" => { osver => "fcd",
! 					    kmod => '1',
! 					    basearch => 'x86_64',
! 					    results => 'fedora-devel/x86_64'} 
  );
  
  # The following are kernels that we can't successfully build modules against
  # due to issues in the packaged kernel-devel RPM.
  
  my %badkernels = (
! 	"2.6.21-2950.fc8" => { "xen" => 1}, # Missing build ID
  );
  
+ my $help;
+ my $ok = GetOptions("resultdir=s" => \$resultbase,
+ 		    "help" => \$help);
+ 
  my @platforms = @ARGV;
  my $srpm = pop @platforms;
  
! if (!$ok || $help || !$srpm || $#platforms==-1) {
!   print "Usage: $0 [options] <platform> [<platform> [...]]  <srpm>\n";
!   print "    Options are : \n";
!   print "         --resultdir <dir>    Location to place output RPMS\n";
!   print "\n";
    print "    Platform may be:\n";
    foreach ("all", sort(keys(%platconf))) { print "        ".$_."\n"; };
    exit(1);
***************
*** 148,168 ****
    print "Finding available kernel modules\n";
  
    my $arbitraryversion = "";
!   my $modules=`$suser -c 'yum --installroot $root provides kernel-devel'`;
!   if ($modules eq "") {
!       $modules=`$suser -c 'yum -d 2 --installroot $root provides kernel-devel'`;
!       my $modulen;
!       my %modulel;
!       foreach $modulen (split(/\n/, $modules)) {
! 	  my ($pk, $colon, $comment)=split(/\s+/, $modulen);
! 	  if ($pk =~ /^kernel/) {
! 	      $modulel{$pk} = "$pk";
! 	  } 
!       }
!       $modulen=join(" ", keys(%modulel));
!       $modules=`$suser -c 'yum --installroot $root list $modulen'`;
    }
    foreach my $module (split(/\n/, $modules)) {
        my ($package, $version, $repo)=split(/\s+/, $module);
        my ($arch) = ($package=~/\.(.*)$/);
        my ($variant) = ($package=~/kernel-(.*)-devel/);
--- 199,217 ----
    print "Finding available kernel modules\n";
  
    my $arbitraryversion = "";
! 
!   my $modules;
!   if ($platform=~/fedora-development/) {
!     $modules = findKernelModules($root, 0, "kernel-devel");
!   } elsif ($platform=~/centos-4/) {
!     $modules = findKernelModules($root, 0, "kernel-devel", "kernel-smp-devel", 
! 				 "kernel-hugemem-devel", "kernel-xenU-devel");
!   } else {
!     $modules = findKernelModules($root, 0, 'kernel-devel');
    }
+ 
    foreach my $module (split(/\n/, $modules)) {
+       chomp $module;
        my ($package, $version, $repo)=split(/\s+/, $module);
        my ($arch) = ($package=~/\.(.*)$/);
        my ($variant) = ($package=~/kernel-(.*)-devel/);
***************
*** 175,180 ****
--- 224,232 ----
  	  next if ($variant eq "xen0"); # Fedora 5 has some bad xen0 kernel-devels
  	  next if ($variant eq "smp");
        }
+       if ($platform=~/fedora-8/ || $platform=~/fedora-9/ || $platform=~/fedora-development/) {
+ 	  next if ($variant =~/debug$/); # Fedora 8 debug kernels are bad
+       }
        print "$arch : $variant : $version\n";
        $modulelist{$arch} ={} if !$modulelist{$arch};
        $modulelist{$arch}{$version} = {} if !$modulelist{$arch}{$version};
***************
*** 241,250 ****
            if (!-f $resultdir."/kmod-openafs-".$dvariant.
  		  $oafsversion."-".$oafsrelease.".".$kversion.".".
  		  $arch.".rpm") {
! 	    push @tobuild, $variant;
! 	    print $resultdir."/kmod-openafs-".$dvariant.
!                   $oafsversion."-".$oafsrelease.".".$kversion.".".
!                   $arch.".rpm is missing\n";
            }
          }
        }
--- 293,310 ----
            if (!-f $resultdir."/kmod-openafs-".$dvariant.
  		  $oafsversion."-".$oafsrelease.".".$kversion.".".
  		  $arch.".rpm") {
! 	    my @done = glob ($resultdir."/kmod-openafs-".$dvariant.
! 			     $oafsversion."-*.".$kversion.".".$arch.".rpm");
! 
! 	    if ($ignorerelease && $#done>=0) {
! 	      print "Kernel module for $kversion already exists for an".
! 	            "older release. Skipping building it this time.\n";
! 	    } else {
! 	      push @tobuild, $variant;
! 	      print $resultdir."/kmod-openafs-".$dvariant.
!                     $oafsversion."-".$oafsrelease.".".$kversion.".".
!                     $arch.".rpm is missing\n";
! 	    }
            }
          }
        }
***************
*** 289,295 ****
      if (defined($dirh)) {
        my $file;
        while (defined($file = $dirh->read)) {
!         if ( $file=~/^kernel-devel/ &&
                -f $yumcachedir.$file && ! -f $rpmstashdir.$file) {
            print "Stashing $file for later use\n";
            system("cp ".$yumcachedir.$file." ".$rpmstashdir.$file) == 0
--- 349,355 ----
      if (defined($dirh)) {
        my $file;
        while (defined($file = $dirh->read)) {
!         if ( $file=~/^kernel.*devel/ &&
                -f $yumcachedir.$file && ! -f $rpmstashdir.$file) {
            print "Stashing $file for later use\n";
            system("cp ".$yumcachedir.$file." ".$rpmstashdir.$file) == 0
Index: openafs/src/packaging/RedHat/openafs-kmodtool
diff -c openafs/src/packaging/RedHat/openafs-kmodtool:1.1.4.2 openafs/src/packaging/RedHat/openafs-kmodtool:1.1.4.3
*** openafs/src/packaging/RedHat/openafs-kmodtool:1.1.4.2	Wed Feb 13 00:31:02 2008
--- openafs/src/packaging/RedHat/openafs-kmodtool	Tue Apr 22 08:50:56 2008
***************
*** 70,80 ****
          *.EL*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;;
          *)     kdep="kernel-%{_target_cpu} = ${verrel}${variant}"     ;;
      esac
      cat <<EOF
  %package       -n kmod-${kmod_name}${dashvariant}
  Summary:          ${kmod_name} kernel module(s)
  Group:            System Environment/Kernel
! Provides:         kernel-modules = ${verrel}${variant}
  Provides:         ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
  Provides:         openafs-kernel = %{PACKAGE_VERSION}
  Requires:         ${kdep}
--- 70,85 ----
          *.EL*) kdep="kernel${dashvariant}-%{_target_cpu} = ${verrel}" ;;
          *)     kdep="kernel-%{_target_cpu} = ${verrel}${variant}"     ;;
      esac
+     case "$verrel" in
+         *.fc9*) kname="${verrel}.%{_target_cpu}${variant:+.${variant}}" ;;
+         *)      kname="${verrel}${variant}"                             ;;
+     esac
+ 
      cat <<EOF
  %package       -n kmod-${kmod_name}${dashvariant}
  Summary:          ${kmod_name} kernel module(s)
  Group:            System Environment/Kernel
! Provides:         kernel-modules = ${kname}
  Provides:         ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
  Provides:         openafs-kernel = %{PACKAGE_VERSION}
  Requires:         ${kdep}
***************
*** 85,98 ****
  BuildRequires:    kernel${dashvariant}-devel-%{_target_cpu} = ${verrel}
  %description   -n kmod-${kmod_name}${dashvariant}
  This package provides the ${kmod_name} kernel modules built for the Linux
! kernel ${verrel}${variant} for the %{_target_cpu} family of processors.
  %post          -n kmod-${kmod_name}${dashvariant}
! /sbin/depmod -aeF /boot/System.map-${verrel}${variant} ${verrel}${variant} > /dev/null || :
  %postun        -n kmod-${kmod_name}${dashvariant}
! /sbin/depmod -aF /boot/System.map-${verrel}${variant} ${verrel}${variant} &> /dev/null || :
  %files         -n kmod-${kmod_name}${dashvariant}
  %defattr(644,root,root,755)
! /lib/modules/${verrel}${variant}/extra/${kmod_name}/
  
  EOF
  }
--- 90,103 ----
  BuildRequires:    kernel${dashvariant}-devel-%{_target_cpu} = ${verrel}
  %description   -n kmod-${kmod_name}${dashvariant}
  This package provides the ${kmod_name} kernel modules built for the Linux
! kernel ${kname} for the %{_target_cpu} family of processors.
  %post          -n kmod-${kmod_name}${dashvariant}
! /sbin/depmod -aeF /boot/System.map-${kname} ${kname} > /dev/null || :
  %postun        -n kmod-${kmod_name}${dashvariant}
! /sbin/depmod -aF /boot/System.map-${kname} ${kname} &> /dev/null || :
  %files         -n kmod-${kmod_name}${dashvariant}
  %defattr(644,root,root,755)
! /lib/modules/${kname}/extra/${kmod_name}/
  
  EOF
  }
Index: openafs/src/packaging/RedHat/openafs.spec.in
diff -c openafs/src/packaging/RedHat/openafs.spec.in:1.1.2.19 openafs/src/packaging/RedHat/openafs.spec.in:1.1.2.21
*** openafs/src/packaging/RedHat/openafs.spec.in:1.1.2.19	Mon Apr  7 16:27:31 2008
--- openafs/src/packaging/RedHat/openafs.spec.in	Tue Apr 22 08:50:56 2008
***************
*** 1,11 ****
! # Openafs Spec $Revision: 1.1.2.19 $
  
  %define afsvers @VERSION@
! %define pkgvers @VERSION@
  # for beta/rc releases make pkgrel 0.X.<tag>
  # for real releases make pkgrel 1 (or more for extra releases)
  #%define pkgrel 0.1.rc1
! %define pkgrel @LINUX_VERSION@
  
  %if %{?osvers:0}%{!?osvers:1}
  %define osvers 1
--- 1,11 ----
! # Openafs Spec $Revision: 1.1.2.21 $
  
  %define afsvers @VERSION@
! %define pkgvers @LINUX_PKGVER@
  # for beta/rc releases make pkgrel 0.X.<tag>
  # for real releases make pkgrel 1 (or more for extra releases)
  #%define pkgrel 0.1.rc1
! %define pkgrel @LINUX_PKGREL@
  
  %if %{?osvers:0}%{!?osvers:1}
  %define osvers 1
***************
*** 37,43 ****
  %define upvar ""
  %{!?kvariants: %define kvariants %{?upvar}}
  
! %{!?ksrcdir: %define ksrcdir %{_usrsrc}/kernels/%{kverrel}-%{_target_cpu}}
  
  %else # Legacy kernel build stuff 
  
--- 37,49 ----
  %define upvar ""
  %{!?kvariants: %define kvariants %{?upvar}}
  
! %if %{?ksrcdir:1}%{!?ksrcdir:0}
!   if ( -d %{_usrsrc}/kernels/%{kverrel}-%{_target_cpu}) ; then
!     %define ksrcdir %{_usrsrc}/kernels/%{kverrel}-%{_target_cpu}}
!   else
!     %define ksrcdir %{_usrsrc}/kernels/%{kverrel}.%{_target_cpu}}
!   fi
! %endif
  
  %else # Legacy kernel build stuff 
  
***************
*** 821,827 ****
  %if %{fedorakmod} 
    for kvariant in %{kvariants} ; do
      if [ -z "${kvariant}" -o -z "$ksrc" ] ; then
!       ksrc=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu}
      fi
    done
  %endif
--- 827,837 ----
  %if %{fedorakmod} 
    for kvariant in %{kvariants} ; do
      if [ -z "${kvariant}" -o -z "$ksrc" ] ; then
!       if [ -d %{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu} ] ; then
!         ksrc=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu}
!       else
!         ksrc=%{_usrsrc}/kernels/%{kverrel}.%{_target_cpu}${kvariant:+.$kvariant}
!       fi
      fi
    done
  %endif
***************
*** 854,859 ****
--- 864,875 ----
  %if %{fedorakmod} && %{build_modules}
  for kvariant in %{kvariants} ; do
    if [ -n "${kvariant}" ] ; then
+     if [ -d %{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu} ] ; then
+       ksrc=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu}
+     else
+       ksrc=%{_usrsrc}/kernels/%{kverrel}.%{_target_cpu}${kvariant:+.$kvariant}
+     fi
+ 
      cp -R libafs_tree _kmod_build_${kvariant}
      pushd _kmod_build_${kvariant}
      ./configure --with-afs-sysname=${sysname} \
***************
*** 861,867 ****
  	--libdir=%{_libdir} \
  	--bindir=%{_bindir} \
  	--sbindir=%{_sbindir} \
! 	--with-linux-kernel-headers=%{_usrsrc}/kernels/%{kverrel}${kvariant:+-$kvariant}-%{_target_cpu} \
  %if %{krb5support}
  	--with-krb5-conf=/usr/kerberos/bin/krb5-config \
  %endif
--- 877,883 ----
  	--libdir=%{_libdir} \
  	--bindir=%{_bindir} \
  	--sbindir=%{_sbindir} \
! 	--with-linux-kernel-headers=${ksrc} \
  %if %{krb5support}
  	--with-krb5-conf=/usr/kerberos/bin/krb5-config \
  %endif
***************
*** 1196,1209 ****
  for kvariant in %{kvariants}
  do
    if [ -n "$kvariant" ] ; then
!     srcdir=_kmod_build_$kvariant/src/libafs/MODLOAD-%{kverrel}${kvariant}-SP
    else
      srcdir=${sysname}/dest/root.client%{_prefix}/vice/etc/modload
    fi
  
!   dstdir=$RPM_BUILD_ROOT/lib/modules/%{kverrel}${kvariant}/extra/openafs
    mkdir -p ${dstdir}
!   install -m 755 ${srcdir}/libafs-%{kverrel}${kvariant}.ko $dstdir/openafs.ko
  done
  %else
  # Install the kernel modules
--- 1212,1236 ----
  for kvariant in %{kvariants}
  do
    if [ -n "$kvariant" ] ; then
!     if [ -d _kmod_build_$kvariant/src/libafs/MODLOAD-%{kverrel}${kvariant}-SP ] ; then
!       srcdir=_kmod_build_$kvariant/src/libafs/MODLOAD-%{kverrel}${kvariant}-SP
!     else
!       srcdir=_kmod_build_$kvariant/src/libafs/MODLOAD-%{kverrel}.%{_target_cpu}.${kvariant}-SP
!     fi
    else
      srcdir=${sysname}/dest/root.client%{_prefix}/vice/etc/modload
    fi
  
!   if [ -f ${srcdir}/libafs-%{kverrel}${kvariant}.ko ] ; then
!     srcmod=${srcdir}/libafs-%{kverrel}${kvariant}.ko
!     dstdir=$RPM_BUILD_ROOT/lib/modules/%{kverrel}${kvariant}/extra/openafs
!   else
!     srcmod=${srcdir}/libafs-%{kverrel}.%{_target_cpu}${kvariant:+.$kvariant}.ko
!     dstdir=$RPM_BUILD_ROOT/lib/modules/%{kverrel}.%{_target_cpu}${kvariant:+.$kvariant}/extra/openafs
!   fi
! 
    mkdir -p ${dstdir}
!   install -m 755 ${srcmod} ${dstdir}/openafs.ko
  done
  %else
  # Install the kernel modules
Index: openafs/src/rx/rx_kcommon.c
diff -c openafs/src/rx/rx_kcommon.c:1.44.2.18 openafs/src/rx/rx_kcommon.c:1.44.2.19
*** openafs/src/rx/rx_kcommon.c:1.44.2.18	Mon Mar 10 18:35:36 2008
--- openafs/src/rx/rx_kcommon.c	Wed Apr  9 12:40:19 2008
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.44.2.18 2008/03/10 22:35:36 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.44.2.19 2008/04/09 16:40:19 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
***************
*** 291,296 ****
--- 291,298 ----
  #ifdef RX_ENABLE_LOCKS
      AFS_GLOCK();
  #endif /* RX_ENABLE_LOCKS */
+ 
+     return NULL;
  }
  #endif /* !UKERNEL */
  
Index: openafs/src/ubik/beacon.c
diff -c openafs/src/ubik/beacon.c:1.19.2.6 openafs/src/ubik/beacon.c:1.19.2.7
*** openafs/src/ubik/beacon.c:1.19.2.6	Mon Mar 10 18:35:36 2008
--- openafs/src/ubik/beacon.c	Wed Apr  9 12:40:20 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.19.2.6 2008/03/10 22:35:36 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.19.2.7 2008/04/09 16:40:20 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 455,460 ****
--- 455,461 ----
  	}
  
      }				/* while loop */
+     return NULL;
  }
  
  /* 
Index: openafs/src/ubik/recovery.c
diff -c openafs/src/ubik/recovery.c:1.13.2.4 openafs/src/ubik/recovery.c:1.13.2.5
*** openafs/src/ubik/recovery.c:1.13.2.4	Mon Mar 10 18:35:36 2008
--- openafs/src/ubik/recovery.c	Wed Apr  9 12:40:20 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/recovery.c,v 1.13.2.4 2008/03/10 22:35:36 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/recovery.c,v 1.13.2.5 2008/04/09 16:40:20 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 806,811 ****
--- 806,812 ----
  		urecovery_state |= UBIK_RECSENTDB;
  	}
      }
+     return NULL;
  }
  
  /*
